{"chainId":8453,"address":"0x3c1724bd9ef4a7f4e1ceb5f6e1bf27e9bb3a89db","explorerUrl":"https://basescan.org/address/0x3c1724bd9ef4a7f4e1ceb5f6e1bf27e9bb3a89db","abi":[{"name":"commitBatch","type":"function","stateMutability":"nonpayable","inputs":[{"type":"uint64","name":"expectedNonce"},{"type":"bytes32","name":"prevRoot"},{"type":"bytes32","name":"newRoot"},{"type":"tuple[]","name":"matches","components":[{"type":"address","name":"maker"},{"type":"address","name":"taker"},{"type":"uint64","name":"marketId"},{"type":"uint8","name":"side"},{"type":"uint8","name":"kind"},{"type":"uint128","name":"shares"},{"type":"uint32","name":"priceBps"},{"type":"uint128","name":"fee"}]},{"type":"tuple[]","name":"credits","components":[{"type":"address","name":"account"},{"type":"uint256","name":"id"},{"type":"int128","name":"delta"},{"type":"uint8","name":"reason"}]},{"type":"bool","name":"emitEvents"}],"outputs":[]},{"name":"batchNonce","type":"function","stateMutability":"view","inputs":[],"outputs":[{"type":"uint64"}]},{"name":"ledgerRoot","type":"function","stateMutability":"view","inputs":[],"outputs":[{"type":"bytes32"}]},{"name":"operator","type":"function","stateMutability":"view","inputs":[],"outputs":[{"type":"address"}]},{"name":"BatchCommitted","type":"event","inputs":[{"type":"uint64","name":"nonce","indexed":true},{"type":"bytes32","name":"newRoot","indexed":true},{"type":"uint32","name":"matchCount"},{"type":"uint32","name":"creditCount"},{"type":"bool","name":"eventsEmitted"}]},{"name":"TransferSingle","type":"event","inputs":[{"type":"address","name":"operator","indexed":true},{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"id"},{"type":"uint256","name":"value"}]},{"name":"TransferBatch","type":"event","inputs":[{"type":"address","name":"operator","indexed":true},{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256[]","name":"ids"},{"type":"uint256[]","name":"values"}]},{"name":"commitJournalBatch","type":"function","stateMutability":"nonpayable","inputs":[{"type":"uint64","name":"expectedNonce"},{"type":"bytes32","name":"prevRoot"},{"type":"bytes32","name":"newRoot"},{"type":"bytes32","name":"prevJournalCommitment"},{"type":"bytes32","name":"payloadHash"},{"type":"bytes","name":"payload"}],"outputs":[]},{"name":"journalCommitment","type":"function","stateMutability":"view","inputs":[],"outputs":[{"type":"bytes32"}]},{"name":"JournalBatchCommitted","type":"event","inputs":[{"type":"uint64","name":"nonce","indexed":true},{"type":"bytes32","name":"newRoot","indexed":true},{"type":"bytes32","name":"journalCommitment","indexed":true},{"type":"bytes32","name":"payloadHash"},{"type":"bytes","name":"payload"}]}],"reads":[{"name":"journalCommitment()","returns":"bytes32","description":"Chained complete-payload commitment on journal-enabled ledger implementations."},{"name":"ledgerRoot()","returns":"bytes32","description":"The root of the last batch this contract accepted. A proof from GET /api/v1/ledger/proof/{account} verifies against exactly this value."},{"name":"batchNonce()","returns":"uint64","description":"The last batch number the contract accepted. Every published batch names the root it chains from, so the sequence cannot be rewritten."}],"root":{"leaves":"One leaf per (account, asset) with a non-zero balance. Zero balances are dropped so the root describes the state and not the history, and the supply account is excluded because it is the negative of everything else.","order":"Ascending by account, then by asset id numerically.","hashing":"leaf = keccak256(keccak256(abi.encodePacked(address account, uint256 assetId, int256 balance))); node = keccak256(sorted pair); an odd node is promoted unchanged. These are OpenZeppelin MerkleProof.verify conventions, so a proof verifies in Solidity with no library of ours.","empty":"0x0000000000000000000000000000000000000000000000000000000000000000"},"replay":"Replay legacy TransferSingle and TransferBatch events under the legacy rules. For JournalBatchCommitted, decode the complete PMJ5 payload using the public dictionaries, reconstruct each original operation, and apply it once; historical supplements do not change balances. Compare the resulting root and journal commitment with the contract.","assets":{"collateral":"Asset id 0 is the play-money collateral.","shares":"Asset id (marketId << 8) | side is one outcome of one market; market ids start at 1 and side is 0 or 1.","supply":"0x0000000000000000000000000000000000000000"},"decoder":{"npm":"@probleeprotocol/ledger","install":"npm install @probleeprotocol/ledger","command":"npx @probleeprotocol/ledger decode <txHash> --rpc <base-rpc>"}}