Added logic to use tx_data.value when present instead of payload.amount for transaction amount field. Updated comment to clarify payload.amount is a fallback value.
Changed transaction failure logging from error to warning level in PoA proposer.
Removed immediate session.commit() after state transition as balance changes are now persisted via explicit SQL UPDATE statements.
Added "value" field mapping from "amount" in transaction normalization and PoA proposer to ensure state transition compatibility.
Replaced SQLAlchemy ORM balance updates with explicit SQL UPDATE statements using
Changed transaction failure logging from warning to error level in PoA proposer.
Added immediate session.commit() after successful state transition to persist balance changes.
Removed fallback to sender address for 'to' field in submit_transaction as it should be required.
Pydantic v2 requires all class attributes to be annotated. genesis_candidates
is a class-level constant, not a field, so it should be annotated as ClassVar.
Phase 1: Agent SDK Marketplace Integration
- Implement _submit_to_marketplace() with HTTP client to coordinator API
- Implement _update_marketplace_offer() with HTTP client
- Implement assess_capabilities() with GPU detection using nvidia-smi
- Add coordinator_url parameter and AITBCHTTPClient integration
Phase 2: Agent SDK Network Registration
- Implement register_with_network() with HTTP client to coordinator API
- Implement get_reputation() with HTTP client to fetch from API
- Implement get_earnings() with HTTP client to fetch from API
- Implement signature verification in send_message() and receive_message()
- Add coordinator_url parameter and AITBCHTTPClient integration
Phase 3: Coordinator API Enterprise Integration
- Implement generic ERPIntegration base class methods with mock implementations
- Implement generic CRMIntegration base class methods with mock implementations
- Add BillingIntegration base class with generic mock implementations
- Add ComplianceIntegration base class with generic mock implementations
- No third-party integration as requested
Phase 4: Coordinator API Key Management
- Add MockHSMStorage class with in-memory key storage
- Add HSMProviderInterface with mock HSM connection methods
- FileKeyStorage already had all abstract methods implemented
Phase 5: Blockchain Node Multi-Chain Operations
- Implement start_chain() with Ethereum-specific chain startup
- Implement stop_chain() with Ethereum-specific chain shutdown
- Implement sync_chain() with Ethereum consensus (longest-chain rule)
- Add database, RPC server, P2P service, and consensus initialization
Phase 6: Settlement Bridge
- Implement EthereumBridge class extending BridgeAdapter
- Implement _encode_payload() with Ethereum transaction encoding
- Implement _get_gas_estimate() with Web3 client integration
- Add Web3 client initialization and gas estimation with safety buffer
- Migrate 10 files from logging to aitbc.get_logger
- combined_main.py, p2p_network.py, chain_sync.py
- network/bridge_manager.py, network/island_manager.py, network/nat_traversal.py
- network/multi_chain_manager.py, network/hub_manager.py, network/hub_discovery.py
- Remove logging.basicConfig() from combined_main.py
- Migrate hardcoded paths in config.py and hub_manager.py to use DATA_DIR and KEYSTORE_DIR constants
- Add # nosec B104 comment for host="0.0.0.0" in combined_main.py
- Binding to all interfaces is intentional for blockchain node service
- Resolves security-scanning CI failure
- Update combined_main.py to use port 8005 for blockchain-node RPC
- blockchain-rpc service remains on port 8006
- Resolves port conflict causing blockchain-node service failures
- Modify combined_main.py to start HTTP RPC server alongside blockchain node
- Use uvicorn.Server with asyncio to run both services concurrently
- Fix shutdown code to properly stop HTTP server
- eth_getLogs endpoint now accessible at http://localhost:8006/rpc/eth_getLogs
This fixes the hybrid mode heartbeat logic which was unable to
calculate time since last block after service restart because
_last_block_timestamp was None.
- Comment out PRAGMA journal_mode=WAL in database.py
- Keep other SQLite optimizations (synchronous=NORMAL, cache_size, temp_store)
- CoW already disabled on data directory via chattr +C
- Add status fields to Receipt model (status, claimed_at, claimed_by)
- Add RECEIPT_CLAIM handling to state_transition.py with validation and reward minting
- Add type field to Transaction model for reliable transaction type storage
- Update router to use TransactionRequest model to preserve type field
- Update poa.py to extract type from mempool transaction content and store only original payload
- Add RECEIPT_CLAIM to GasType enum with gas schedule
- Add MESSAGE transaction type to router.py valid_types
- Add MESSAGE handling to state_transition.py (value=0, fee-only)
- Add GasType.MESSAGE to gas schedules
- Re-enable state root computation in poa.py
- Change SQLite journal_mode to WAL for corruption prevention
- Add chattr +C to setup.sh for Btrfs CoW prevention
- Change SQLite journal mode from DELETE to WAL for better concurrency
- Add chattr +C to /var/lib/aitbc in setup.sh to disable Btrfs Copy-on-Write
- Add fallback logging when chattr is unavailable or fails
- Prevent SQLite corruption on Btrfs filesystems by ensuring overwrite-in-place behavior
- Add default_peer_rpc_url configuration parameter
- Update bulk sync fallback to use default_peer_rpc_url instead of gossip_broadcast_url
- Fixes 'unsupported protocol redis://' error in bulk sync
- gossip_broadcast_url is for Redis backend, not HTTP RPC calls
- Add _calculate_dynamic_batch_size method to sync.py
- Scale batch size based on gap size:
- Small gaps (< 100): 20-50 blocks for precision
- Medium gaps (100-500): 50-100 blocks
- Large gaps (> 500): 100-200 blocks for speed
- Add min_bulk_sync_batch_size and max_bulk_sync_batch_size config params
- Update bulk_import_from to use dynamic batch size
- Replaces fixed 50-block batch size with adaptive sizing
- Increase block_time_seconds from 2 to 10 seconds
- Reduces block generation frequency
- Helps with sync gap recovery by giving more time between blocks
- Add .replace(")", "") to received_height parsing
- Fixes ValueError when parsing '9007)' as integer
- Auto sync was failing due to parsing bug in main.py
- Reason format: 'Gap detected (our height: 8175, received: 9007)'
- Add nosec B104 comments for rpc_bind_host and p2p_bind_host
- These are intentional defaults for distributed blockchain
- P2P nodes need to accept connections from peers
- RPC needs to be accessible from other machines in cluster
- Suppresses Bandit security scan warnings
- Change chmod permissions from 0600 (owner-only) to 0666 (read/write for all) for database file and WAL files in blockchain node database initialization
- Update comment to reflect permissive permissions for handling filesystem restrictions
- Update agent daemon service database path from /var/lib/aitbc/data/ait-mainnet/chain.db to /var/lib/aitbc/data/chain.db
- Update PRAGMA journal_mode from WAL to DELETE in set_sqlite_pragma
- Addresses filesystem permission issues with WAL mode in containerized environments
- Add try-except blocks around os.chmod calls in init_db to ignore OSError exceptions
- Add comments noting permission errors are ignored for read-only filesystems in containers
- Wrap chmod for database file, WAL-shm, and WAL-wal files with error handling
- Remove StartLimitBurst and StartLimitIntervalSec from agent-coordinator systemd service
- Remove ProtectSystem, ProtectHome, and ReadWritePaths security
- Add hash conflict detection in import_block to delete existing blocks with same hash
- Add hash conflict cleanup in import_chain before importing blocks
- Add logging for hash conflict deletions showing affected chains
- Add WAL file permission setting in init_db for .db-shm and .db-wal files
- Add test_import_chain_clears_hash_conflicts_across_chains to verify cross-chain hash cleanup
- Add p2p_node_id field to ChainSettings with empty string default
- Add p2p_node_id to .env.example configuration file
- Change --node-id argument from required to optional with default empty string
- Add node_id resolution with fallback chain: args.node_id -> settings.p2p_node_id -> settings.proposer_id
- Add validation to raise ValueError if no node_id can be resolved
- Update systemd service to use ${
- Add chain_id field to Block creation in import_block endpoint
- Remove await from synchronous session.commit in import_block
- Add _serialize_optional_timestamp helper to handle various timestamp formats
- Add _parse_datetime_value helper with proper datetime parsing and error handling
- Add _select_export_blocks to filter duplicate blocks by height during export
- Add _dedupe_import_blocks to filter
- Add DISTINCT clause to block query in export_chain to prevent duplicate blocks in export
- Add chain_id filter to all delete operations in import_chain (blocks, accounts, transactions)
- Add commit after deletions before starting imports to ensure clean state
- Add duplicate block filtering by height before import to prevent UNIQUE constraint violations
- Add logging for deletion operations showing chain_id being cleared
- Add info logs for gossip subscriber setup start and completion
- Add try-except blocks around transactions and blocks topic subscriptions
- Add success logs after each subscription
- Add error logs with exception details if subscription fails
- Add early return if subscription fails to prevent further processing
- Add logging for gossip backend initialization with backend type and URL
- Add success log after gossip backend initialization compl
- Comment out propose_only_if_mempool_not_empty check in _propose_block
- Add note that check is disabled for testing purposes
- Allows block proposal even when mempool is empty
- Enables continuous block creation regardless of transaction availability
- Add chain_id field to account export data
- Use account's chain_id from import data if available, fallback to root chain_id
- Only clear existing accounts if import data contains accounts to replace
- Prevents clearing accounts when importing chain data without account information
- Remove unused sqlalchemy.func import
- Replace select().delete() with delete() for proper SQLModel syntax in import_chain
- Add chain_id extraction from first block if not provided in import_data root
- Add chain_id field to Block creation during import to ensure consistency
- Remove redundant session.close() in export_chain finally block (session_scope handles cleanup)
- Replace manual session creation with session_scope() in export_chain
- Convert query results to lists to avoid lazy loading issues after session close
- Remove await from session.execute calls in import_chain (use synchronous queries)
- Change force_sync back to async and restore await on import_chain call
- Remove 69 lines of duplicate import_block implementation at end of file
- Replace async session_scope with synchronous SQLAlchemy session in export_chain
- Remove await from session.execute calls in export_chain (use synchronous queries)
- Remove await from session.commit in import_chain
- Change force_sync from async to sync function
- Remove await from import_chain call in force_sync
- Add proper session cleanup with try/finally block in export_chain
- Add /export-chain endpoint to export full blockchain state (blocks, accounts, transactions) as JSON
- Add /import-chain endpoint to import chain state with backup and data clearing
- Add /force-sync endpoint to trigger reorg by fetching and importing peer's chain state
- Fix duplicate import_block implementation (remove redundant async with _import_lock block)
- Fix wallet adapter to use chain_id=ait-testnet instead of ait