How to read a balance from another contract: IIgneumStateOracle(oracle).provenBalance(number, account, accountProof), where number is a Devnet 3 chain block whose state root the oracle holds and accountProof is the eth_getProof account proof at that block. A storage slot: provenStorage(number, account, slot, accountProof, storageProof). Both revert on any mismatch.
hash_merkle_root, and the segment record parsed out of its extra data: the record's post_root for its block is stored under the certificate's index.Said plainly, on the contract too (trust()): the aggregator's BLS signature on the record is not checked on chain in this slice, and the voter table the verifier holds is installed by its deployer. The negative cases in test.mjs are a flipped proof node, a wrong block number, a header removed from the path, a merkle sibling altered, a record with its post_root altered, a header with its nonce altered: each reverts.
Said plainly, on the contract too (trust()): the aggregator's BLS signature on the record is not checked on chain in this slice, and while the stand-in verifier is installed no certificate signature is checked on chain either; the voter table the shared verifier holds is installed by its deployer. Gas on Sepolia, measured 8 October 2026: a 62-header path 13.3 million (about 215,000 per header, 15 precompile blocks each), a 10-header path about 2.2 million, the state-root store 177,000, a balance read 153,000. The negative cases in test.mjs are a flipped proof node, a wrong block number, a header removed from the path, a merkle sibling altered, a record with its post_root altered, a header with its nonce altered: each reverts.
Devnet 3, no value. Sepolia, no value. A demonstration of the verification path, not a product.
diff --git a/tools/reference-apps/oracle/.gitignore b/tools/reference-apps/oracle/.gitignore new file mode 100644 index 000000000..c2658d7d1 --- /dev/null +++ b/tools/reference-apps/oracle/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/tools/reference-apps/oracle/README.md b/tools/reference-apps/oracle/README.md new file mode 100644 index 000000000..8acd8eb60 --- /dev/null +++ b/tools/reference-apps/oracle/README.md @@ -0,0 +1,52 @@ +# Igneum Devnet 3 state oracle on Sepolia + +A contract on Ethereum Sepolia that stores proven Devnet 3 state roots and lets other contracts read a proven +Devnet 3 balance or storage slot. Certificates are read from the shared verifier (`IIgneumCertificateVerifier`); +a `StubCertificateVerifier` stands in until the real one lands (`setVerifier`, deployer only, swaps it). + +Addresses, transaction hashes, blocks and gas are in `deployment.json` (every write is appended under `writes`). + +## What the oracle checks on chain + +1. Every header in the path is hashed with keyed BLAKE2b-256 ("BlockHash") through the EIP-152 precompile and + parsed out of the same bytes. Each next header must list the previous hash among its level-0 parents. The last + hash must be the checkpoint the verifier holds for the given certificate index. +2. The carrier's coinbase transaction is hashed ("TransactionHash") and the merkle path ("MerkleBranchHash", a + missing right child is 32 zero bytes) must reach the carrier's hash_merkle_root, parsed from the header bytes. +3. The coinbase payload is walked from the transaction bytes (so it is bound to the hash); the nested sections + `IGNS || IGNP || IGNF` are taken from the end; the chosen 586-byte segment record gives the statement's + number, block hash and post_root (number must equal the record's `last`, block hash must equal the record's + block, chain id must be Devnet 3's 0x116f). The root is stored under the number with the certificate index. +4. `provenBalance`, `provenAccount` and `provenStorage` verify eth_getProof account and storage proofs against + the stored post_root with the contract's own RLP and keccak-keyed Merkle Patricia trie walk, and revert with a + reason on any mismatch. + +Not checked on chain in this slice (also stated by `trust()`): the aggregator's BLS signature over the segment +record and the ZK proof behind it. Also not checked: the segment record's version field (the layout is fixed +either way). + +## Files + +- `contracts/Blake2b.sol`: keyed BLAKE2b-256 over the precompile at 0x09. +- `contracts/Mpt.sol`: RLP reading, MPT proofs, account and storage decoding. +- `contracts/IIgneumCertificateVerifier.sol`, `contracts/StubCertificateVerifier.sol`, `contracts/IgneumStateOracle.sol`. +- `compile.mjs`: solc-js (via IR, optimizer 200, cancun) to `artifacts/*.json`. +- `deploy.mjs`: EIP-1559 deploy of the stub and the oracle, writes `deployment.json` (`--force`, `--oracle-only`). +- `demo.mjs`: submits the certificate and the state root for `fixtures/dn3-balance.json` (or the synthetic vector + when the fixture is absent) and prints the Sepolia-read balance beside the fixture's. +- `test.mjs`: the vectors and negatives through eth_call. Part A is the receipt fixture (real headers, a real merkle + path); part B is a seeded synthetic vector (segment record, coinbase, three-header path, account and storage + proofs); part C is the balance fixture when it exists. +- `lib.mjs`: the byte layouts, a JS mirror of the BLAKE2b driver (checked against @noble/hashes), the trie builder. + +## Run + +``` +node compile.mjs +node deploy.mjs +node test.mjs +node demo.mjs +``` + +The deployer key is read from `~/.config/igneum/sepolia-deployer`. Sepolia's gas schedule is repriced (a plain +transfer estimates 12,000 gas), so the numbers in `deployment.json` are what this network charges. diff --git a/tools/reference-apps/oracle/artifacts/IgneumStateOracle.json b/tools/reference-apps/oracle/artifacts/IgneumStateOracle.json new file mode 100644 index 000000000..c0fccdc76 --- /dev/null +++ b/tools/reference-apps/oracle/artifacts/IgneumStateOracle.json @@ -0,0 +1,620 @@ +{ + "name": "IgneumStateOracle", + "solc": "0.8.28+commit.7893614a.Emscripten.clang", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "verifier_", + "type": "address" + }, + { + "internalType": "uint64", + "name": "evmChainId_", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "number", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "postRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "certIndex", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "carrier", + "type": "bytes32" + } + ], + "name": "StateRoot", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "VerifierSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "headers", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "checkpoint", + "type": "bytes32" + } + ], + "name": "checkHeaderPath", + "outputs": [ + { + "internalType": "bytes32", + "name": "carrier", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "merkle", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "evmChainId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "header", + "type": "bytes" + } + ], + "name": "headerHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "leaf", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + } + ], + "name": "merkleRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "h", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "h", + "type": "bytes" + } + ], + "name": "parseHeader", + "outputs": [ + { + "internalType": "uint256", + "name": "parentsOff", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "parentCount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "merkle", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "t", + "type": "bytes" + } + ], + "name": "payloadOf", + "outputs": [ + { + "internalType": "uint256", + "name": "off", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "len", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "number", + "type": "uint64" + }, + { + "internalType": "address", + "name": "a", + "type": "address" + }, + { + "internalType": "bytes[]", + "name": "accountProof", + "type": "bytes[]" + } + ], + "name": "provenAccount", + "outputs": [ + { + "internalType": "bool", + "name": "exists", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "storageRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "codeHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "number", + "type": "uint64" + }, + { + "internalType": "address", + "name": "a", + "type": "address" + }, + { + "internalType": "bytes[]", + "name": "accountProof", + "type": "bytes[]" + } + ], + "name": "provenBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "number", + "type": "uint64" + }, + { + "internalType": "address", + "name": "a", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "slot", + "type": "bytes32" + }, + { + "internalType": "bytes[]", + "name": "accountProof", + "type": "bytes[]" + }, + { + "internalType": "bytes[]", + "name": "storageProof", + "type": "bytes[]" + } + ], + "name": "provenStorage", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "t", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "recordIndex", + "type": "uint256" + } + ], + "name": "readRecord", + "outputs": [ + { + "internalType": "uint64", + "name": "number", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "postRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "chainId", + "type": "uint64" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "t", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "payloadOff", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "payloadLen", + "type": "uint256" + } + ], + "name": "segmentSection", + "outputs": [ + { + "internalType": "uint256", + "name": "off", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "len", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "v", + "type": "address" + } + ], + "name": "setVerifier", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "number", + "type": "uint64" + } + ], + "name": "stateRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "postRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "carrier", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "certIndex", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "certIndex", + "type": "uint64" + }, + { + "internalType": "bytes[]", + "name": "headers", + "type": "bytes[]" + }, + { + "internalType": "bytes", + "name": "coinbaseTx", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "leafIndex", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "recordIndex", + "type": "uint256" + } + ], + "name": "submitStateRoot", + "outputs": [ + { + "internalType": "uint64", + "name": "number", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "postRoot", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "tx_", + "type": "bytes" + } + ], + "name": "transactionHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "trust", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "verifier", + "outputs": [ + { + "internalType": "contract IIgneumCertificateVerifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "certIndex", + "type": "uint64" + }, + { + "internalType": "bytes[]", + "name": "headers", + "type": "bytes[]" + }, + { + "internalType": "bytes", + "name": "coinbaseTx", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "leafIndex", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "siblings", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "recordIndex", + "type": "uint256" + } + ], + "name": "verifyStateRoot", + "outputs": [ + { + "internalType": "uint64", + "name": "number", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "postRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "carrier", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a0346100a957601f61312538819003918201601f19168301916001600160401b038311848410176100ad5780849260409485528339810103126100a95780516001600160a01b03811691908290036100a95760200151906001600160401b03821682036100a9575f80546001600160a01b0319908116929092179055600180549091163317905560805260405161306390816100c2823960805181818161053d01526118170152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80632b7ac3f3146101445780632bf5baf51461013f5780634aefb0a11461013a5780634cf83845146101355780635437988d146101305780635bed35da1461012b57806362636ea11461012657806364d42b17146101215780636f9fdd661461011c57806372464ca0146101175780637b8affcd146101125780638a01db611461010d5780638da5cb5b14610108578063b378a99714610103578063c60c7964146100fe578063ecb2c31d146100f9578063f2916104146100f4578063f837d413146100ef5763fa228c7f146100ea575f80fd5b610b5b565b610b1c565b610ae4565b610aa1565b610a79565b6108cc565b6107ff565b6107cc565b61075b565b610730565b61058b565b61051e565b6104fe565b610470565b6102f7565b610270565b610210565b610199565b3461016b575f36600319011261016b575f546040516001600160a01b039091168152602090f35b5f80fd5b600435906001600160401b038216820361016b57565b35906001600160401b038216820361016b57565b3461016b57602036600319011261016b5760806001600160401b036101c46101bf61016f565b610b9f565b9160409493945194855260208501526040840152166060820152f35b9181601f8401121561016b578235916001600160401b03831161016b576020808501948460051b01011161016b57565b3461016b57604036600319011261016b576004356001600160401b03811161016b5761024e61024560409236906004016101e0565b60243591610da6565b82519182526020820152f35b600435906001600160a01b038216820361016b57565b3461016b5760a036600319011261016b5761028961016f565b602435906001600160a01b038216820361016b57604435916064356001600160401b03811161016b576102c09036906004016101e0565b60843593916001600160401b03851161016b576020956102e76102ef9636906004016101e0565b959094610e78565b604051908152f35b3461016b57602036600319011261016b5761031061025a565b6001546001600160a01b0316330361036e575f80546001600160a01b0319166001600160a01b039290921691821790556040519081527f480b37e3d134e44cb444c9703493c7db564c707cb8a18cecea165f340431da1f90602090a1005b60405162461bcd60e51b81526020600482015260126024820152716f7261636c653a206f776e6572206f6e6c7960701b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b038211176103dd57604052565b6103a8565b604051906103f16080836103bc565b565b906103f160405192836103bc565b6001600160401b0381116103dd57601f01601f191660200190565b92919261042882610401565b9161043660405193846103bc565b82948184528183011161016b578281602093845f960137010152565b9080601f8301121561016b5781602061046d9335910161041c565b90565b3461016b57604036600319011261016b576004356001600160401b03811161016b576001600160401b036104b66104ad6080933690600401610452565b60243590611189565b91846040959495519516855260208501526040840152166060820152f35b602060031982011261016b57600435906001600160401b03821161016b5761046d91600401610452565b3461016b5760206102ef610511366104d4565b6105196112e3565b611dc8565b3461016b575f36600319011261016b5760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b3461016b575f36600319011261016b5761072c6101606105ae60405191826103bc565b61012b81527f436865636b6564206f6e20636861696e3a20686561646572206861736865732060208201527f616e6420706172656e74206c696e6b7320746f2061206365727469666965642060408201527f636865636b706f696e742c2074686520636f696e62617365206d65726b6c652060608201527f706174682c20746865207365676d656e74207265636f7264206c61796f75742c60808201527f20616e6420746865206163636f756e7420616e642073746f726167652070726f60a08201527f6f667320756e64657220706f73745f726f6f742e204e6f7420636865636b656460c08201527f206f6e20636861696e20696e207468697320736c6963653a207468652061676760e08201527f72656761746f72277320424c53207369676e6174757265206f766572207468656101008201527f207365676d656e74207265636f726420616e6420746865205a4b2070726f6f666101208201526a103132b434b7321034ba1760a91b61014082015260405191829182610561565b0390f35b3461016b576060610748610743366104d4565b611310565b9060405192835260208301526040820152f35b3461016b5760206102ef61076e366104d4565b6105196113da565b606060031982011261016b576004356001600160401b038116810361016b57916024356001600160a01b038116810361016b5791604435906001600160401b03821161016b576107c8916004016101e0565b9091565b3461016b5760206107f26107ea6107e236610776565b939092610b9f565b505050612067565b5050915050604051908152f35b3461016b575f36600319011261016b576001546040516001600160a01b039091168152602090f35b60c060031982011261016b5761083d6004610185565b916024356001600160401b03811161016b578261085c916004016101e0565b92909291604435916001600160401b03831161016b578060238401121561016b578260040135926001600160401b03841161016b57816024858301011161016b57602401929160643591608435906001600160401b03821161016b576108c4916004016101e0565b909160a43590565b3461016b576108ef6108dd36610827565b9688999896919695929594939461174b565b9091936001600160401b03841692835f52600260205260405f2054868115918215610a6f575b505015610a14576109f57fb650e8bdb81a79cecbd85292ffa6c38212615677fdc7f99f3332f642d3b1ce2d936109c761094c6103e2565b8981528460208201528260408201526109718660608301906001600160401b03169052565b61098c896001600160401b03165f52600260205260405f2090565b606060036001600160401b039284518155602085015160018201556040850151600282015501920151166001600160401b0319825416179055565b6040519384938985909493926001600160401b03906060936080840197845260208401521660408201520152565b0390a2604080516001600160401b039290921682526020820192909252f35b60405162461bcd60e51b815260206004820152602d60248201527f6f7261636c653a20616e6f7468657220726f6f742069732073746f726564206660448201526c6f72207468617420626c6f636b60981b6064820152608490fd5b149050865f610915565b3461016b57610a8f610a8a366104d4565b61149c565b60408051928352602083019190915290f35b3461016b576080610ac3610ab436610827565b9796909695919594929461174b565b916001600160401b0360405194168452602084015260408301526060820152f35b3461016b5760a0610afa6107ea6107e236610776565b9260409291925194151585526020850152604084015260608301526080820152f35b3461016b57606036600319011261016b576004356001600160401b03811161016b57610b4f610a8f913690600401610452565b60243560443591611945565b3461016b57606036600319011261016b576004356044356024356001600160401b03821161016b57602092610b976102ef9336906004016101e0565b929091611ab3565b6001600160401b03165f52600260205260405f2080548015610bdb576001820154926001600160401b0360036002850154940154169193929190565b60405162461bcd60e51b815260206004820152602560248201527f6f7261636c653a206e6f2070726f76656e20726f6f7420666f72207468617420604482015264626c6f636b60d81b6064820152608490fd5b634e487b7160e01b5f52603260045260245ffd5b9015610c7c57803590601e198136030182121561016b5701908135916001600160401b03831161016b57602001823603811361016b579190565b610c2e565b9190811015610c7c5760051b81013590601e198136030182121561016b5701908135916001600160401b03831161016b57602001823603811361016b579190565b15610cc957565b60405162461bcd60e51b815260206004820152603c60248201527f686561646572733a20612068656164657220646f6573206e6f74206e616d652060448201527f7468652070726576696f7573206f6e65206173206120706172656e74000000006064820152608490fd5b15610d3b57565b60405162461bcd60e51b815260206004820152603860248201527f686561646572733a20746865206c61737420686561646572206973206e6f742060448201527f7468652063657274696669656420636865636b706f696e7400000000000000006064820152608490fd5b919290925f935f938115610e43575f915f5b818110610dcd57505050906103f19114610d34565b610de2610ddb828486610c81565b369161041c565b96610dec88611310565b92919690841597885f14610e235750505050610e0b90976105196113da565b93610e19575b600101610db8565b9296508692610e11565b610e0b945091610e3991610e3e938d959d611b64565b610cc2565b61076e565b60405162461bcd60e51b815260206004820152600d60248201526c686561646572733a206e6f6e6560981b6044820152606490fd5b906107ea610e8b94929796959397610b9f565b50959291505015610e9f5761046d93611c10565b50509050610eab575f90565b60405162461bcd60e51b815260206004820152602860248201527f6d70743a2073746f726167652070726f6f6620666f7220616e20616273656e74604482015267081858d8dbdd5b9d60c21b6064820152608490fd5b634e487b7160e01b5f52601160045260245ffd5b9060018201809211610f2357565b610f01565b90600a8201809211610f2357565b9060128201809211610f2357565b9060768201809211610f2357565b9060088201809211610f2357565b9060108201809211610f2357565b9060948201809211610f2357565b6008019081600811610f2357565b9060248201809211610f2357565b9060028201809211610f2357565b9060228201809211610f2357565b6013019081601311610f2357565b9060138201809211610f2357565b6080019081608011610f2357565b91908201809211610f2357565b9061024a82029180830461024a1490151715610f2357565b600581901b91906001600160fb1b03811603610f2357565b908160011b9180830460021490151715610f2357565b1561103857565b606460405162461bcd60e51b815260206004820152602060248201527f7265636f72643a20696e646578206265796f6e64207468652073656374696f6e6044820152fd5b1561108357565b60405162461bcd60e51b815260206004820152603560248201527f7265636f72643a2073746174656d656e74206973206e6f7420666f7220746865604482015274207365676d656e742773206c61737420626c6f636b60581b6064820152608490fd5b156110ed57565b60405162461bcd60e51b815260206004820152602960248201527f7265636f72643a20626c6f636b2068617368206973206e6f74207468652073746044820152686174656d656e74277360b81b6064820152608490fd5b1561114b57565b60405162461bcd60e51b81526020600482015260166024820152751c9958dbdc990e881e995c9bc81c1bdcdd17dc9bdbdd60521b6044820152606490fd5b919061119e6111978461149c565b9085611945565b61024a810661129157826111be6111ca926111c36111be6111d097610f15565b610feb565b1115611031565b90610fde565b6111e26111dc82610f28565b84611d16565b906111fe6111f86111f283610f36565b86611d41565b91610f44565b926112866112246112186112128789611d41565b60c01c90565b6001600160401b031690565b9261127f6001600160401b0361126d61124b6112186112126112458c610f52565b8d611d41565b9961126761126161125b8c610f60565b83611d41565b9a610f6e565b90611d41565b96166001600160401b0389161461107c565b85146110e6565b6103f1831515611144565b60405162461bcd60e51b81526020600482015260166024820152750e4cac6dee4c87440e6cac6e8d2dedc40d8cadccee8d60531b6044820152606490fd5b604051906112de6020836103bc565b5f8252565b604051906112f26040836103bc565b600f82526e0a8e4c2dce6c2c6e8d2dedc90c2e6d608b1b6020830152565b906001600160401b0361132283611cd0565b1690600182106113955761133861121884611cee565b9160129361134f61134885611003565b6012610fde565b906001925b808410611366575061046d9250611d41565b909161138b816111ca61138661138161121860019689611d16565b611003565b610f7c565b9301929190611354565b60405162461bcd60e51b815260206004820152601860248201527f6865616465723a206e6f20706172656e74206c6576656c7300000000000000006044820152606490fd5b604051906113e96040836103bc565b6009825268084d8dec6d690c2e6d60bb1b6020830152565b1561140857565b60405162461bcd60e51b815260206004820152600f60248201526e18dbda5b98985cd94e881cda1bdc9d608a1b6044820152606490fd5b908151811015610c7c570160200190565b1561145757565b60405162461bcd60e51b815260206004820152601a60248201527f636f696e626173653a207061796c6f6164206f76657272756e730000000000006044820152606490fd5b9061ffff6114a983611d02565b166114b661121884611cd0565b90600a9060015f91109283159384925b878382106115b8576114eb94506114e593506112189250859150611d16565b91610f52565b905f5b81811061152f5750506115019150610f8a565b906103f161151b6115156112188587611d16565b93610f52565b936115268486610fde565b90511015611450565b61154d61153d859394610f28565b6111ca611386611218838b611d16565b9361155f575b600101929190926114ee565b926115a260019161157288518210611401565b60ff611598611592611584848c61143f565b516001600160f81b03191690565b60f81c90565b166115aa57610f15565b939050611553565b6115b390610fa6565b610f15565b916115dd6115e792936111ca6113866112186115d686999a9b610f8a565b8094611d16565b9061160d57610f52565b936115f9575b600101908492916114c6565b92611605600191610f98565b9390506115ed565b61161690610f15565b610f52565b9081602091031261016b575190565b6040513d5f823e3d90fd5b1561163c57565b60405162461bcd60e51b8152602060048201526024808201527f6f7261636c653a206e6f206365727469666963617465206174207468617420696044820152630dcc8caf60e31b6064820152608490fd5b1561169457565b60405162461bcd60e51b815260206004820152603a60248201527f6d65726b6c653a207061746820646f6573206e6f74207265616368207468652060448201527f63617272696572277320686173685f6d65726b6c655f726f6f740000000000006064820152608490fd5b1561170657565b60405162461bcd60e51b815260206004820152601a60248201527f7265636f72643a2073746174656d656e7420636861696e2069640000000000006044820152606490fd5b9660206117a4979493929996959a9861177961176d5f5460018060a01b031690565b6001600160a01b031690565b60405180809b819463b1b0945360e01b8352600483019190916001600160401b036020820193169052565b03915afa93841561188c576117e76117dd6117ff966117f9956103f19d6118049c5f9361185b575b506117d8831515611635565b610da6565b95909c369161041c565b956117f4876105196112e3565b611ab3565b1461168d565b611189565b9592939194909493956001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168015918215611848575b50506116ff565b6001600160401b03161490505f80611841565b61187e91935060203d602011611885575b61187681836103bc565b81019061161b565b915f6117cc565b503d61186c565b61162a565b1561189857565b60405162461bcd60e51b815260206004820152601960248201527f636f696e626173653a20736372697074206f76657272756e73000000000000006044820152606490fd5b156118e457565b60405162461bcd60e51b815260206004820152601960248201527f636f696e626173653a206e6f2049474e532073656374696f6e000000000000006044820152606490fd5b600719810191908211610f2357565b91908203918211610f2357565b909291601381106119d95761046d916119b66119af6119a86119be946119a26119806119796119738c610f36565b8861143f565b5160f81c90565b6119948361198d83610fb4565b1115611891565b61199d8b610fc2565b610fde565b98610fde565b87846121ae565b8683612262565b9485916122bd565b6119ca848214156118dd565b6119d48194611929565b611938565b60405162461bcd60e51b815260206004820152601b60248201527f636f696e626173653a207061796c6f616420746f6f2073686f727400000000006044820152606490fd5b9190811015610c7c5760051b0190565b60405190611a3d6040836103bc565b601082526f09acae4d6d8ca84e4c2dcc6d090c2e6d60831b6020830152565b15611a6357565b60405162461bcd60e51b815260206004820152602260248201527f6d65726b6c653a206c65616620696e646578206265796f6e64207468652070616044820152610e8d60f31b6064820152608490fd5b939290915f915b808310611ace575050506103f19015611a5c565b90919294611b29600191828816155f14611b3257611b2290611b1a611af4888789611a1e565b60408051602081019490945290359083015281606081015b03601f1981018352826103bc565b610519611a2e565b9660011c90565b93019190611aba565b611b5f90611b1a611b44888789611a1e565b60408051913560208301528101929092528160608101611b0c565b611b22565b909291925f5b848110611b7a5750505050505f90565b6001600160fb1b0381168103610f23578060051b8201808311610f2357611ba2859185611d41565b14611baf57600101611b6a565b5050505050600190565b15611bc057565b60405162461bcd60e51b815260206004820152602260248201527f6d70743a2073746f726167652076616c7565206973206e6f74206120737472696044820152616e6760f01b6064820152608490fd5b611c389392916040516020810191825260208152611c2f6040826103bc565b519020906125ee565b9015611c8f57611c4781612b4f565b90815115151580611c70575b91611c6061046d93611bb9565b6060604082015191015191612d4f565b5060408201519160608101518301809311610f23578151909214611c53565b505f90565b15611c9b57565b60405162461bcd60e51b815260206004820152600d60248201526c1a195859195c8e881cda1bdc9d609a1b6044820152606490fd5b602261046d91611ce48151600a1115611c94565b015160c01c612ddd565b602a61046d91611ce4815160121115611c94565b602061046d91611ce4815160081115611c94565b906008810190818111610f235782611d3660209361046d95511015611c94565b01015160c01c612ddd565b906020810191828211610f2357611d5d60209382511015611c94565b01015190565b15611d6a57565b60405162461bcd60e51b81526020600482015260136024820152720c4d8c2d6ca64c47440d6caf240d8cadccee8d606b1b6044820152606490fd5b6040516101009190611db783826103bc565b60d5815291601f1901366020840137565b611ddd81518015159081611fc4575b50611d63565b611de5611da5565b91611df16101006103f3565b676a09e667f3bcc908815267bb67ae8584caa73b6020820152673c6ef372fe94f82b604082015267a54ff53a5f1d36f1606082015267510e527fade682d16080820152679b05688c2b3e6c1f60a0820152671f83d9abfb41bd6b60c0820152675be0cd19137e217960e0820152611ea66301010020611e8a611e7a86516001600160401b031690565b60081b67ffffffffffffff001690565b83516001600160401b0316181882906001600160401b03169052565b600c60238501535f5b60088110611f7d575050805191611eda8460c45f918260648201528260848201528260a48201520152565b80516020606486019201825e611ef1831585612e4d565b5f5b838110611f0557505050506024015190565b80611f13611f349286611938565b9060808211611f74575b60808210611f51575b81602082870101855e610fde565b90611f4b611f4183610fd0565b8584149087612ec3565b90611ef3565b611f6f8760c45f918260648201528260848201528260a48201520152565b611f26565b60809150611f1d565b8060051b8201515f905f905b60088210611fa957505060c01b600382901b860160240152600101611eaf565b909160019060ff838560031b1c169060081b17920190611f89565b6040915011155f611dd7565b15611fd757565b60405162461bcd60e51b815260206004820152601a60248201527f6d70743a206163636f756e74206973206e6f742061206c6973740000000000006044820152606490fd5b1561202357565b606460405162461bcd60e51b815260206004820152602060248201527f6d70743a206163636f756e7420686173206e6f7420666f7572206669656c64736044820152fd5b60405160609290921b6bffffffffffffffffffffffff191660208301908152612099949392611c2f8160348101611b0c565b9190156121a1576120a982612b4f565b9081516120b590151590565b6120be90611fd0565b604082019182516120cf9085612c55565b9160408301948551936060019384516120e791610fde565b6120f19082612c55565b94604086019586519060600190815161210991610fde565b6121139084612c55565b90604082019687519260600192835161212b91610fde565b6121359086612c55565b93604085019788519560600195865161214d91610fde565b9151906060015161215d91610fde565b146121679061201c565b6001995190516121779186612d4f565b975190516121859185612d4f565b955190516121939184612ed9565b935190519061046d92612ed9565b5f91508190819081908190565b6008820190818311610f23578391821061225c57016324a3a72360e11b63ffffffff60e01b601c83015116036122575782600719810111610f23576018015161222e9060e081901c906122249060c81c63ff000000165b62ff0000600884901b161761ff00600884901c16179160181c60ff1690565b1763ffffffff1690565b9061224261223b83610f52565b9184611938565b10612253576119d461046d92611929565b5090565b505090565b50505090565b6008820190818311610f23578391821061225c570163049474e560e41b63ffffffff60e01b601c83015116036122575782600719810111610f23576018015161222e9060e081901c906122249060c81c63ff00000016612205565b6008820190818311610f23578391821061225c57016349474e5360e01b63ffffffff60e01b601c83015116036122575782600719810111610f23576018015161222e9060e081901c906122249060c81c63ff00000016612205565b1561231f57565b60405162461bcd60e51b815260206004820152602260248201527f6d70743a206e6f206e6f64657320666f722061206e6f6e2d656d70747920726f6044820152611bdd60f21b6064820152608490fd5b1561237657565b60405162461bcd60e51b815260206004820152602360248201527f6d70743a20746865206669727374206e6f6465206973206e6f742074686520726044820152621bdbdd60ea1b6064820152608490fd5b156123ce57565b60405162461bcd60e51b815260206004820152601760248201527f6d70743a206e6f6465206973206e6f742061206c6973740000000000000000006044820152606490fd5b6040519061022061242481846103bc565b368337565b1561243057565b60405162461bcd60e51b81526020600482015260136024820152726d70743a20746f6f206d616e79206974656d7360681b6044820152606490fd5b5f198114610f235760010190565b906011811015610c7c5760051b0190565b60405190608082018281106001600160401b038211176103dd576040525f6060838281528260208201528260408201520152565b156124c557565b60405162461bcd60e51b815260206004820152600d60248201526c0dae0e87440c4c2c840e0c2e8d609b1b6044820152606490fd5b1561250157565b60405162461bcd60e51b81526020600482015260126024820152716d70743a20626164207265666572656e636560701b6044820152606490fd5b1561254257565b60405162461bcd60e51b815260206004820152602160248201527f6d70743a2061207265666572656e636564206e6f6465206973206d697373696e6044820152606760f81b6064820152608490fd5b1561259857565b60405162461bcd60e51b815260206004820152602860248201527f6d70743a206e6f646520646f6573206e6f74206861736820746f20697473207260448201526765666572656e636560c01b6064820152608490fd5b939291938215612a545761261a61260c610ddb858897969597610c42565b91825160208401201461236f565b5f918290600190825b605084106126655760405162461bcd60e51b815260206004820152601260248201527106d70743a207061746820746f6f20646565760741b6044820152606490fd5b61266f9085612c55565b9461268261267d8751151590565b6123c7565b61268a612413565b965f986040880197606089519101905b6126a78a51835190610fde565b81101561270257906126f68c836126e58e9f9d9e9d6126a7968e6126d060116126d59410612429565b612c55565b926126df8161246b565b9e612479565b526060604082015191015190610fde565b9a999b9a90915061269a565b505096509796909694919461271561248a565b50601181036128365750604087146127e95761275161274a6127579261274461273e8b8b612f22565b60ff1690565b90612479565b5183612c55565b96610f15565b955b80516127d957606081018051156127c5576020929161277c8460409351146124fa565b01510101519261278d81831061253b565b6127b56127a7610ddb61279f8561246b565b94848c610c81565b948551602087012014612591565b60015f935b019296959496612623565b505050505050505090505f9061046d6112cf565b60206001919592950151936127ba565b93509596505050612808925061280191506102000190565b5182612c55565b9060608201805115612829576040612824930151905191612f49565b600191565b5050505f9061046d6112cf565b909690600203612a0f5761284b875183612c55565b9061285d6128598351151590565b1590565b80612a02575b61286c906124be565b604082019061289b606061289361288a61159261158487518a61143f565b60041c600f1690565b94015161101b565b60018416158015916128b7916129f95760ff60015b1690611938565b925f5b84811061291c575050506128dd6128d66002936128e493610fde565b9960200190565b5184612c55565b911615612759579697509492505050604091500361291057816060604061282494015191015191612f49565b50505f9061046d6112cf565b5f9c979b96999a92939495989c50835f146129e15789600161296161159261158461294b60ff855b1687610fde565b9461295b88516111ca8860011c90565b9061143f565b91166129d95760041c600f165b604061297a8388610fde565b10908115916129b5575b5061299d576001019b97949392919998959a969b6128ba565b50505050505050955050505050505f9061046d6112cf565b905060ff6129cf61273e6129c9858a610fde565b87612f22565b911614155f612984565b600f1661296e565b89600161296161159261158461294b60ff6002612944565b60ff60026128b0565b5060608201511515612863565b60405162461bcd60e51b815260206004820181905260248201527f6d70743a206e6f6465207769746820616e206f6464206974656d20636f756e746044820152606490fd5b9050612a859293507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612318565b5f9061046d6112cf565b15612a9657565b60405162461bcd60e51b815260206004820152600a6024820152691c9b1c0e881cda1bdc9d60b21b6044820152606490fd5b60ff60f6199116019060ff8211610f2357565b60ff60bf199116019060ff8211610f2357565b60ff60b6199116019060ff8211610f2357565b60ff607f199116019060ff8211610f2357565b15612b1b57565b60405162461bcd60e51b815260206004820152600c60248201526b3936381d1037bb32b9393ab760a11b6044820152606490fd5b906103f1612b5b61248a565b92612b6881511515612a8f565b612b786115926115845f8461143f565b5f602086015260ff81166080811015612bb75750505f6040850152600160608501525b612bae6040850151606086015190610fde565b90511015612b14565b60b8811015612be5575061273e612bcd91612b01565b6060850152612bdb5f610f15565b6040850152612b9b565b60c0811015612c1f5750612bfe61273e612bdb92612aee565b612c1181612c0b5f610f15565b85612f84565b606087015261199d5f610f15565b60f81115612c3d5761273e612bcd91612c388760019052565b612adb565b612c4c61273e612bdb92612ac8565b60018652612bfe565b6103f190929192612c6461248a565b93612c7182518210612a8f565b612c81611592611584838561143f565b9080602087015260ff8216608081105f14612cb2575060408601819052600160608701819052612bae925090610fde565b60b8811015612cd55750612ccb61273e612bdb93612b01565b6060870152610f15565b60c0811015612d0f575061199d612cf161273e612bdb94612aee565b91612d0583612cff83610f15565b87612f84565b6060890152610f15565b60f81115612d2b57612ccb61273e612bdb93612c388960019052565b61199d612d3d61273e612bdb94612ac8565b6001885291612d0583612cff83610f15565b9092915f9360208211612da05791905f925b818410612d6e5750505050565b9091929460081b85820190818311610f2357612d9561273e6115926115846001958961143f565b179501929190612d61565b60405162461bcd60e51b8152602060048201526015602482015274726c703a20696e746567657220746f6f207769646560581b6044820152606490fd5b612e4967ff00000000000000603883901b8116600884811b64ff000000001690601886901b65ff00000000001690602887901b66ff000000000000169063ff0000009088901c16931717171762ff0000601885901c161761ff00602885901c1617921660381c60ff1690565b1790565b604091612e5a6080612ddd565b60c01b60e4830152612eb7575b60d5602060248301920160095afa15612e7c57565b60405162461bcd60e51b8152602060048201526013602482015272626c616b6532623a20707265636f6d70696c6560681b6044820152606490fd5b600160f4820153612e67565b9091612e5a6001600160401b0360409416612ddd565b91602003612ee957016020015190565b60405162461bcd60e51b8152602060048201526011602482015270726c703a206e6f7420333220627974657360781b6044820152606490fd5b8160011c906020821015610c7c57901a90600116612f435760041c60ff1690565b600f1690565b9291906020612f5783610401565b91612f6560405193846103bc565b838352612f7184610401565b8284019390601f1901368537950101905e565b9291905f93602083111580613019575b15612fe25791905f925b828410612fab5750505050565b90919294612fbb60019160081b90565b612fd761273e611592611584612fd18b89610fde565b8761143f565b179501929190612f9e565b60405162461bcd60e51b815260206004820152600f60248201526e0e4d8e07440c4c2c840d8cadccee8d608b1b6044820152606490fd5b50828201808311610f235781511015612f9456fea2646970667358221220ce879094835d769d272d5d167c77090fc9d7fde70913d367e3ed7080aa3b6bfd64736f6c634300081c0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c80632b7ac3f3146101445780632bf5baf51461013f5780634aefb0a11461013a5780634cf83845146101355780635437988d146101305780635bed35da1461012b57806362636ea11461012657806364d42b17146101215780636f9fdd661461011c57806372464ca0146101175780637b8affcd146101125780638a01db611461010d5780638da5cb5b14610108578063b378a99714610103578063c60c7964146100fe578063ecb2c31d146100f9578063f2916104146100f4578063f837d413146100ef5763fa228c7f146100ea575f80fd5b610b5b565b610b1c565b610ae4565b610aa1565b610a79565b6108cc565b6107ff565b6107cc565b61075b565b610730565b61058b565b61051e565b6104fe565b610470565b6102f7565b610270565b610210565b610199565b3461016b575f36600319011261016b575f546040516001600160a01b039091168152602090f35b5f80fd5b600435906001600160401b038216820361016b57565b35906001600160401b038216820361016b57565b3461016b57602036600319011261016b5760806001600160401b036101c46101bf61016f565b610b9f565b9160409493945194855260208501526040840152166060820152f35b9181601f8401121561016b578235916001600160401b03831161016b576020808501948460051b01011161016b57565b3461016b57604036600319011261016b576004356001600160401b03811161016b5761024e61024560409236906004016101e0565b60243591610da6565b82519182526020820152f35b600435906001600160a01b038216820361016b57565b3461016b5760a036600319011261016b5761028961016f565b602435906001600160a01b038216820361016b57604435916064356001600160401b03811161016b576102c09036906004016101e0565b60843593916001600160401b03851161016b576020956102e76102ef9636906004016101e0565b959094610e78565b604051908152f35b3461016b57602036600319011261016b5761031061025a565b6001546001600160a01b0316330361036e575f80546001600160a01b0319166001600160a01b039290921691821790556040519081527f480b37e3d134e44cb444c9703493c7db564c707cb8a18cecea165f340431da1f90602090a1005b60405162461bcd60e51b81526020600482015260126024820152716f7261636c653a206f776e6572206f6e6c7960701b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b038211176103dd57604052565b6103a8565b604051906103f16080836103bc565b565b906103f160405192836103bc565b6001600160401b0381116103dd57601f01601f191660200190565b92919261042882610401565b9161043660405193846103bc565b82948184528183011161016b578281602093845f960137010152565b9080601f8301121561016b5781602061046d9335910161041c565b90565b3461016b57604036600319011261016b576004356001600160401b03811161016b576001600160401b036104b66104ad6080933690600401610452565b60243590611189565b91846040959495519516855260208501526040840152166060820152f35b602060031982011261016b57600435906001600160401b03821161016b5761046d91600401610452565b3461016b5760206102ef610511366104d4565b6105196112e3565b611dc8565b3461016b575f36600319011261016b5760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b3461016b575f36600319011261016b5761072c6101606105ae60405191826103bc565b61012b81527f436865636b6564206f6e20636861696e3a20686561646572206861736865732060208201527f616e6420706172656e74206c696e6b7320746f2061206365727469666965642060408201527f636865636b706f696e742c2074686520636f696e62617365206d65726b6c652060608201527f706174682c20746865207365676d656e74207265636f7264206c61796f75742c60808201527f20616e6420746865206163636f756e7420616e642073746f726167652070726f60a08201527f6f667320756e64657220706f73745f726f6f742e204e6f7420636865636b656460c08201527f206f6e20636861696e20696e207468697320736c6963653a207468652061676760e08201527f72656761746f72277320424c53207369676e6174757265206f766572207468656101008201527f207365676d656e74207265636f726420616e6420746865205a4b2070726f6f666101208201526a103132b434b7321034ba1760a91b61014082015260405191829182610561565b0390f35b3461016b576060610748610743366104d4565b611310565b9060405192835260208301526040820152f35b3461016b5760206102ef61076e366104d4565b6105196113da565b606060031982011261016b576004356001600160401b038116810361016b57916024356001600160a01b038116810361016b5791604435906001600160401b03821161016b576107c8916004016101e0565b9091565b3461016b5760206107f26107ea6107e236610776565b939092610b9f565b505050612067565b5050915050604051908152f35b3461016b575f36600319011261016b576001546040516001600160a01b039091168152602090f35b60c060031982011261016b5761083d6004610185565b916024356001600160401b03811161016b578261085c916004016101e0565b92909291604435916001600160401b03831161016b578060238401121561016b578260040135926001600160401b03841161016b57816024858301011161016b57602401929160643591608435906001600160401b03821161016b576108c4916004016101e0565b909160a43590565b3461016b576108ef6108dd36610827565b9688999896919695929594939461174b565b9091936001600160401b03841692835f52600260205260405f2054868115918215610a6f575b505015610a14576109f57fb650e8bdb81a79cecbd85292ffa6c38212615677fdc7f99f3332f642d3b1ce2d936109c761094c6103e2565b8981528460208201528260408201526109718660608301906001600160401b03169052565b61098c896001600160401b03165f52600260205260405f2090565b606060036001600160401b039284518155602085015160018201556040850151600282015501920151166001600160401b0319825416179055565b6040519384938985909493926001600160401b03906060936080840197845260208401521660408201520152565b0390a2604080516001600160401b039290921682526020820192909252f35b60405162461bcd60e51b815260206004820152602d60248201527f6f7261636c653a20616e6f7468657220726f6f742069732073746f726564206660448201526c6f72207468617420626c6f636b60981b6064820152608490fd5b149050865f610915565b3461016b57610a8f610a8a366104d4565b61149c565b60408051928352602083019190915290f35b3461016b576080610ac3610ab436610827565b9796909695919594929461174b565b916001600160401b0360405194168452602084015260408301526060820152f35b3461016b5760a0610afa6107ea6107e236610776565b9260409291925194151585526020850152604084015260608301526080820152f35b3461016b57606036600319011261016b576004356001600160401b03811161016b57610b4f610a8f913690600401610452565b60243560443591611945565b3461016b57606036600319011261016b576004356044356024356001600160401b03821161016b57602092610b976102ef9336906004016101e0565b929091611ab3565b6001600160401b03165f52600260205260405f2080548015610bdb576001820154926001600160401b0360036002850154940154169193929190565b60405162461bcd60e51b815260206004820152602560248201527f6f7261636c653a206e6f2070726f76656e20726f6f7420666f72207468617420604482015264626c6f636b60d81b6064820152608490fd5b634e487b7160e01b5f52603260045260245ffd5b9015610c7c57803590601e198136030182121561016b5701908135916001600160401b03831161016b57602001823603811361016b579190565b610c2e565b9190811015610c7c5760051b81013590601e198136030182121561016b5701908135916001600160401b03831161016b57602001823603811361016b579190565b15610cc957565b60405162461bcd60e51b815260206004820152603c60248201527f686561646572733a20612068656164657220646f6573206e6f74206e616d652060448201527f7468652070726576696f7573206f6e65206173206120706172656e74000000006064820152608490fd5b15610d3b57565b60405162461bcd60e51b815260206004820152603860248201527f686561646572733a20746865206c61737420686561646572206973206e6f742060448201527f7468652063657274696669656420636865636b706f696e7400000000000000006064820152608490fd5b919290925f935f938115610e43575f915f5b818110610dcd57505050906103f19114610d34565b610de2610ddb828486610c81565b369161041c565b96610dec88611310565b92919690841597885f14610e235750505050610e0b90976105196113da565b93610e19575b600101610db8565b9296508692610e11565b610e0b945091610e3991610e3e938d959d611b64565b610cc2565b61076e565b60405162461bcd60e51b815260206004820152600d60248201526c686561646572733a206e6f6e6560981b6044820152606490fd5b906107ea610e8b94929796959397610b9f565b50959291505015610e9f5761046d93611c10565b50509050610eab575f90565b60405162461bcd60e51b815260206004820152602860248201527f6d70743a2073746f726167652070726f6f6620666f7220616e20616273656e74604482015267081858d8dbdd5b9d60c21b6064820152608490fd5b634e487b7160e01b5f52601160045260245ffd5b9060018201809211610f2357565b610f01565b90600a8201809211610f2357565b9060128201809211610f2357565b9060768201809211610f2357565b9060088201809211610f2357565b9060108201809211610f2357565b9060948201809211610f2357565b6008019081600811610f2357565b9060248201809211610f2357565b9060028201809211610f2357565b9060228201809211610f2357565b6013019081601311610f2357565b9060138201809211610f2357565b6080019081608011610f2357565b91908201809211610f2357565b9061024a82029180830461024a1490151715610f2357565b600581901b91906001600160fb1b03811603610f2357565b908160011b9180830460021490151715610f2357565b1561103857565b606460405162461bcd60e51b815260206004820152602060248201527f7265636f72643a20696e646578206265796f6e64207468652073656374696f6e6044820152fd5b1561108357565b60405162461bcd60e51b815260206004820152603560248201527f7265636f72643a2073746174656d656e74206973206e6f7420666f7220746865604482015274207365676d656e742773206c61737420626c6f636b60581b6064820152608490fd5b156110ed57565b60405162461bcd60e51b815260206004820152602960248201527f7265636f72643a20626c6f636b2068617368206973206e6f74207468652073746044820152686174656d656e74277360b81b6064820152608490fd5b1561114b57565b60405162461bcd60e51b81526020600482015260166024820152751c9958dbdc990e881e995c9bc81c1bdcdd17dc9bdbdd60521b6044820152606490fd5b919061119e6111978461149c565b9085611945565b61024a810661129157826111be6111ca926111c36111be6111d097610f15565b610feb565b1115611031565b90610fde565b6111e26111dc82610f28565b84611d16565b906111fe6111f86111f283610f36565b86611d41565b91610f44565b926112866112246112186112128789611d41565b60c01c90565b6001600160401b031690565b9261127f6001600160401b0361126d61124b6112186112126112458c610f52565b8d611d41565b9961126761126161125b8c610f60565b83611d41565b9a610f6e565b90611d41565b96166001600160401b0389161461107c565b85146110e6565b6103f1831515611144565b60405162461bcd60e51b81526020600482015260166024820152750e4cac6dee4c87440e6cac6e8d2dedc40d8cadccee8d60531b6044820152606490fd5b604051906112de6020836103bc565b5f8252565b604051906112f26040836103bc565b600f82526e0a8e4c2dce6c2c6e8d2dedc90c2e6d608b1b6020830152565b906001600160401b0361132283611cd0565b1690600182106113955761133861121884611cee565b9160129361134f61134885611003565b6012610fde565b906001925b808410611366575061046d9250611d41565b909161138b816111ca61138661138161121860019689611d16565b611003565b610f7c565b9301929190611354565b60405162461bcd60e51b815260206004820152601860248201527f6865616465723a206e6f20706172656e74206c6576656c7300000000000000006044820152606490fd5b604051906113e96040836103bc565b6009825268084d8dec6d690c2e6d60bb1b6020830152565b1561140857565b60405162461bcd60e51b815260206004820152600f60248201526e18dbda5b98985cd94e881cda1bdc9d608a1b6044820152606490fd5b908151811015610c7c570160200190565b1561145757565b60405162461bcd60e51b815260206004820152601a60248201527f636f696e626173653a207061796c6f6164206f76657272756e730000000000006044820152606490fd5b9061ffff6114a983611d02565b166114b661121884611cd0565b90600a9060015f91109283159384925b878382106115b8576114eb94506114e593506112189250859150611d16565b91610f52565b905f5b81811061152f5750506115019150610f8a565b906103f161151b6115156112188587611d16565b93610f52565b936115268486610fde565b90511015611450565b61154d61153d859394610f28565b6111ca611386611218838b611d16565b9361155f575b600101929190926114ee565b926115a260019161157288518210611401565b60ff611598611592611584848c61143f565b516001600160f81b03191690565b60f81c90565b166115aa57610f15565b939050611553565b6115b390610fa6565b610f15565b916115dd6115e792936111ca6113866112186115d686999a9b610f8a565b8094611d16565b9061160d57610f52565b936115f9575b600101908492916114c6565b92611605600191610f98565b9390506115ed565b61161690610f15565b610f52565b9081602091031261016b575190565b6040513d5f823e3d90fd5b1561163c57565b60405162461bcd60e51b8152602060048201526024808201527f6f7261636c653a206e6f206365727469666963617465206174207468617420696044820152630dcc8caf60e31b6064820152608490fd5b1561169457565b60405162461bcd60e51b815260206004820152603a60248201527f6d65726b6c653a207061746820646f6573206e6f74207265616368207468652060448201527f63617272696572277320686173685f6d65726b6c655f726f6f740000000000006064820152608490fd5b1561170657565b60405162461bcd60e51b815260206004820152601a60248201527f7265636f72643a2073746174656d656e7420636861696e2069640000000000006044820152606490fd5b9660206117a4979493929996959a9861177961176d5f5460018060a01b031690565b6001600160a01b031690565b60405180809b819463b1b0945360e01b8352600483019190916001600160401b036020820193169052565b03915afa93841561188c576117e76117dd6117ff966117f9956103f19d6118049c5f9361185b575b506117d8831515611635565b610da6565b95909c369161041c565b956117f4876105196112e3565b611ab3565b1461168d565b611189565b9592939194909493956001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168015918215611848575b50506116ff565b6001600160401b03161490505f80611841565b61187e91935060203d602011611885575b61187681836103bc565b81019061161b565b915f6117cc565b503d61186c565b61162a565b1561189857565b60405162461bcd60e51b815260206004820152601960248201527f636f696e626173653a20736372697074206f76657272756e73000000000000006044820152606490fd5b156118e457565b60405162461bcd60e51b815260206004820152601960248201527f636f696e626173653a206e6f2049474e532073656374696f6e000000000000006044820152606490fd5b600719810191908211610f2357565b91908203918211610f2357565b909291601381106119d95761046d916119b66119af6119a86119be946119a26119806119796119738c610f36565b8861143f565b5160f81c90565b6119948361198d83610fb4565b1115611891565b61199d8b610fc2565b610fde565b98610fde565b87846121ae565b8683612262565b9485916122bd565b6119ca848214156118dd565b6119d48194611929565b611938565b60405162461bcd60e51b815260206004820152601b60248201527f636f696e626173653a207061796c6f616420746f6f2073686f727400000000006044820152606490fd5b9190811015610c7c5760051b0190565b60405190611a3d6040836103bc565b601082526f09acae4d6d8ca84e4c2dcc6d090c2e6d60831b6020830152565b15611a6357565b60405162461bcd60e51b815260206004820152602260248201527f6d65726b6c653a206c65616620696e646578206265796f6e64207468652070616044820152610e8d60f31b6064820152608490fd5b939290915f915b808310611ace575050506103f19015611a5c565b90919294611b29600191828816155f14611b3257611b2290611b1a611af4888789611a1e565b60408051602081019490945290359083015281606081015b03601f1981018352826103bc565b610519611a2e565b9660011c90565b93019190611aba565b611b5f90611b1a611b44888789611a1e565b60408051913560208301528101929092528160608101611b0c565b611b22565b909291925f5b848110611b7a5750505050505f90565b6001600160fb1b0381168103610f23578060051b8201808311610f2357611ba2859185611d41565b14611baf57600101611b6a565b5050505050600190565b15611bc057565b60405162461bcd60e51b815260206004820152602260248201527f6d70743a2073746f726167652076616c7565206973206e6f74206120737472696044820152616e6760f01b6064820152608490fd5b611c389392916040516020810191825260208152611c2f6040826103bc565b519020906125ee565b9015611c8f57611c4781612b4f565b90815115151580611c70575b91611c6061046d93611bb9565b6060604082015191015191612d4f565b5060408201519160608101518301809311610f23578151909214611c53565b505f90565b15611c9b57565b60405162461bcd60e51b815260206004820152600d60248201526c1a195859195c8e881cda1bdc9d609a1b6044820152606490fd5b602261046d91611ce48151600a1115611c94565b015160c01c612ddd565b602a61046d91611ce4815160121115611c94565b602061046d91611ce4815160081115611c94565b906008810190818111610f235782611d3660209361046d95511015611c94565b01015160c01c612ddd565b906020810191828211610f2357611d5d60209382511015611c94565b01015190565b15611d6a57565b60405162461bcd60e51b81526020600482015260136024820152720c4d8c2d6ca64c47440d6caf240d8cadccee8d606b1b6044820152606490fd5b6040516101009190611db783826103bc565b60d5815291601f1901366020840137565b611ddd81518015159081611fc4575b50611d63565b611de5611da5565b91611df16101006103f3565b676a09e667f3bcc908815267bb67ae8584caa73b6020820152673c6ef372fe94f82b604082015267a54ff53a5f1d36f1606082015267510e527fade682d16080820152679b05688c2b3e6c1f60a0820152671f83d9abfb41bd6b60c0820152675be0cd19137e217960e0820152611ea66301010020611e8a611e7a86516001600160401b031690565b60081b67ffffffffffffff001690565b83516001600160401b0316181882906001600160401b03169052565b600c60238501535f5b60088110611f7d575050805191611eda8460c45f918260648201528260848201528260a48201520152565b80516020606486019201825e611ef1831585612e4d565b5f5b838110611f0557505050506024015190565b80611f13611f349286611938565b9060808211611f74575b60808210611f51575b81602082870101855e610fde565b90611f4b611f4183610fd0565b8584149087612ec3565b90611ef3565b611f6f8760c45f918260648201528260848201528260a48201520152565b611f26565b60809150611f1d565b8060051b8201515f905f905b60088210611fa957505060c01b600382901b860160240152600101611eaf565b909160019060ff838560031b1c169060081b17920190611f89565b6040915011155f611dd7565b15611fd757565b60405162461bcd60e51b815260206004820152601a60248201527f6d70743a206163636f756e74206973206e6f742061206c6973740000000000006044820152606490fd5b1561202357565b606460405162461bcd60e51b815260206004820152602060248201527f6d70743a206163636f756e7420686173206e6f7420666f7572206669656c64736044820152fd5b60405160609290921b6bffffffffffffffffffffffff191660208301908152612099949392611c2f8160348101611b0c565b9190156121a1576120a982612b4f565b9081516120b590151590565b6120be90611fd0565b604082019182516120cf9085612c55565b9160408301948551936060019384516120e791610fde565b6120f19082612c55565b94604086019586519060600190815161210991610fde565b6121139084612c55565b90604082019687519260600192835161212b91610fde565b6121359086612c55565b93604085019788519560600195865161214d91610fde565b9151906060015161215d91610fde565b146121679061201c565b6001995190516121779186612d4f565b975190516121859185612d4f565b955190516121939184612ed9565b935190519061046d92612ed9565b5f91508190819081908190565b6008820190818311610f23578391821061225c57016324a3a72360e11b63ffffffff60e01b601c83015116036122575782600719810111610f23576018015161222e9060e081901c906122249060c81c63ff000000165b62ff0000600884901b161761ff00600884901c16179160181c60ff1690565b1763ffffffff1690565b9061224261223b83610f52565b9184611938565b10612253576119d461046d92611929565b5090565b505090565b50505090565b6008820190818311610f23578391821061225c570163049474e560e41b63ffffffff60e01b601c83015116036122575782600719810111610f23576018015161222e9060e081901c906122249060c81c63ff00000016612205565b6008820190818311610f23578391821061225c57016349474e5360e01b63ffffffff60e01b601c83015116036122575782600719810111610f23576018015161222e9060e081901c906122249060c81c63ff00000016612205565b1561231f57565b60405162461bcd60e51b815260206004820152602260248201527f6d70743a206e6f206e6f64657320666f722061206e6f6e2d656d70747920726f6044820152611bdd60f21b6064820152608490fd5b1561237657565b60405162461bcd60e51b815260206004820152602360248201527f6d70743a20746865206669727374206e6f6465206973206e6f742074686520726044820152621bdbdd60ea1b6064820152608490fd5b156123ce57565b60405162461bcd60e51b815260206004820152601760248201527f6d70743a206e6f6465206973206e6f742061206c6973740000000000000000006044820152606490fd5b6040519061022061242481846103bc565b368337565b1561243057565b60405162461bcd60e51b81526020600482015260136024820152726d70743a20746f6f206d616e79206974656d7360681b6044820152606490fd5b5f198114610f235760010190565b906011811015610c7c5760051b0190565b60405190608082018281106001600160401b038211176103dd576040525f6060838281528260208201528260408201520152565b156124c557565b60405162461bcd60e51b815260206004820152600d60248201526c0dae0e87440c4c2c840e0c2e8d609b1b6044820152606490fd5b1561250157565b60405162461bcd60e51b81526020600482015260126024820152716d70743a20626164207265666572656e636560701b6044820152606490fd5b1561254257565b60405162461bcd60e51b815260206004820152602160248201527f6d70743a2061207265666572656e636564206e6f6465206973206d697373696e6044820152606760f81b6064820152608490fd5b1561259857565b60405162461bcd60e51b815260206004820152602860248201527f6d70743a206e6f646520646f6573206e6f74206861736820746f20697473207260448201526765666572656e636560c01b6064820152608490fd5b939291938215612a545761261a61260c610ddb858897969597610c42565b91825160208401201461236f565b5f918290600190825b605084106126655760405162461bcd60e51b815260206004820152601260248201527106d70743a207061746820746f6f20646565760741b6044820152606490fd5b61266f9085612c55565b9461268261267d8751151590565b6123c7565b61268a612413565b965f986040880197606089519101905b6126a78a51835190610fde565b81101561270257906126f68c836126e58e9f9d9e9d6126a7968e6126d060116126d59410612429565b612c55565b926126df8161246b565b9e612479565b526060604082015191015190610fde565b9a999b9a90915061269a565b505096509796909694919461271561248a565b50601181036128365750604087146127e95761275161274a6127579261274461273e8b8b612f22565b60ff1690565b90612479565b5183612c55565b96610f15565b955b80516127d957606081018051156127c5576020929161277c8460409351146124fa565b01510101519261278d81831061253b565b6127b56127a7610ddb61279f8561246b565b94848c610c81565b948551602087012014612591565b60015f935b019296959496612623565b505050505050505090505f9061046d6112cf565b60206001919592950151936127ba565b93509596505050612808925061280191506102000190565b5182612c55565b9060608201805115612829576040612824930151905191612f49565b600191565b5050505f9061046d6112cf565b909690600203612a0f5761284b875183612c55565b9061285d6128598351151590565b1590565b80612a02575b61286c906124be565b604082019061289b606061289361288a61159261158487518a61143f565b60041c600f1690565b94015161101b565b60018416158015916128b7916129f95760ff60015b1690611938565b925f5b84811061291c575050506128dd6128d66002936128e493610fde565b9960200190565b5184612c55565b911615612759579697509492505050604091500361291057816060604061282494015191015191612f49565b50505f9061046d6112cf565b5f9c979b96999a92939495989c50835f146129e15789600161296161159261158461294b60ff855b1687610fde565b9461295b88516111ca8860011c90565b9061143f565b91166129d95760041c600f165b604061297a8388610fde565b10908115916129b5575b5061299d576001019b97949392919998959a969b6128ba565b50505050505050955050505050505f9061046d6112cf565b905060ff6129cf61273e6129c9858a610fde565b87612f22565b911614155f612984565b600f1661296e565b89600161296161159261158461294b60ff6002612944565b60ff60026128b0565b5060608201511515612863565b60405162461bcd60e51b815260206004820181905260248201527f6d70743a206e6f6465207769746820616e206f6464206974656d20636f756e746044820152606490fd5b9050612a859293507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612318565b5f9061046d6112cf565b15612a9657565b60405162461bcd60e51b815260206004820152600a6024820152691c9b1c0e881cda1bdc9d60b21b6044820152606490fd5b60ff60f6199116019060ff8211610f2357565b60ff60bf199116019060ff8211610f2357565b60ff60b6199116019060ff8211610f2357565b60ff607f199116019060ff8211610f2357565b15612b1b57565b60405162461bcd60e51b815260206004820152600c60248201526b3936381d1037bb32b9393ab760a11b6044820152606490fd5b906103f1612b5b61248a565b92612b6881511515612a8f565b612b786115926115845f8461143f565b5f602086015260ff81166080811015612bb75750505f6040850152600160608501525b612bae6040850151606086015190610fde565b90511015612b14565b60b8811015612be5575061273e612bcd91612b01565b6060850152612bdb5f610f15565b6040850152612b9b565b60c0811015612c1f5750612bfe61273e612bdb92612aee565b612c1181612c0b5f610f15565b85612f84565b606087015261199d5f610f15565b60f81115612c3d5761273e612bcd91612c388760019052565b612adb565b612c4c61273e612bdb92612ac8565b60018652612bfe565b6103f190929192612c6461248a565b93612c7182518210612a8f565b612c81611592611584838561143f565b9080602087015260ff8216608081105f14612cb2575060408601819052600160608701819052612bae925090610fde565b60b8811015612cd55750612ccb61273e612bdb93612b01565b6060870152610f15565b60c0811015612d0f575061199d612cf161273e612bdb94612aee565b91612d0583612cff83610f15565b87612f84565b6060890152610f15565b60f81115612d2b57612ccb61273e612bdb93612c388960019052565b61199d612d3d61273e612bdb94612ac8565b6001885291612d0583612cff83610f15565b9092915f9360208211612da05791905f925b818410612d6e5750505050565b9091929460081b85820190818311610f2357612d9561273e6115926115846001958961143f565b179501929190612d61565b60405162461bcd60e51b8152602060048201526015602482015274726c703a20696e746567657220746f6f207769646560581b6044820152606490fd5b612e4967ff00000000000000603883901b8116600884811b64ff000000001690601886901b65ff00000000001690602887901b66ff000000000000169063ff0000009088901c16931717171762ff0000601885901c161761ff00602885901c1617921660381c60ff1690565b1790565b604091612e5a6080612ddd565b60c01b60e4830152612eb7575b60d5602060248301920160095afa15612e7c57565b60405162461bcd60e51b8152602060048201526013602482015272626c616b6532623a20707265636f6d70696c6560681b6044820152606490fd5b600160f4820153612e67565b9091612e5a6001600160401b0360409416612ddd565b91602003612ee957016020015190565b60405162461bcd60e51b8152602060048201526011602482015270726c703a206e6f7420333220627974657360781b6044820152606490fd5b8160011c906020821015610c7c57901a90600116612f435760041c60ff1690565b600f1690565b9291906020612f5783610401565b91612f6560405193846103bc565b838352612f7184610401565b8284019390601f1901368537950101905e565b9291905f93602083111580613019575b15612fe25791905f925b828410612fab5750505050565b90919294612fbb60019160081b90565b612fd761273e611592611584612fd18b89610fde565b8761143f565b179501929190612f9e565b60405162461bcd60e51b815260206004820152600f60248201526e0e4d8e07440c4c2c840d8cadccee8d608b1b6044820152606490fd5b50828201808311610f235781511015612f9456fea2646970667358221220ce879094835d769d272d5d167c77090fc9d7fde70913d367e3ed7080aa3b6bfd64736f6c634300081c0033" +} diff --git a/tools/reference-apps/oracle/artifacts/StubCertificateVerifier.json b/tools/reference-apps/oracle/artifacts/StubCertificateVerifier.json new file mode 100644 index 000000000..b009a1eeb --- /dev/null +++ b/tools/reference-apps/oracle/artifacts/StubCertificateVerifier.json @@ -0,0 +1,212 @@ +{ + "name": "StubCertificateVerifier", + "solc": "0.8.28+commit.7893614a.Emscripten.clang", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "index", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "checkpoint", + "type": "bytes32" + } + ], + "name": "Recorded", + "type": "event" + }, + { + "inputs": [], + "name": "chainId", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "index", + "type": "uint64" + } + ], + "name": "finalCheckpoint", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "checkpoint", + "type": "bytes32" + } + ], + "name": "isFinal", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "index", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "checkpoint", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "submitCertificate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "tableId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "bytes[]", + "name": "proof", + "type": "bytes[]" + } + ], + "name": "verifyAccount", + "outputs": [ + { + "internalType": "bool", + "name": "exists", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "storageRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "codeHash", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "index", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "checkpoint", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "verifyCertificate", + "outputs": [ + { + "internalType": "bool", + "name": "ok", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "signedWeight", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalWeight", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608080604052346015576114c8908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80635e9c528a14610084578063662464951461007f5780639a8a05921461007a578063a59da8f714610075578063b1b0945314610070578063c2c1e2cb1461006b5763da3686de14610066575f80fd5b61043c565b610402565b6103c8565b610289565b610221565b6101c5565b3461012c57606036600319011261012c576024356004356001600160a01b038216820361012c57604435906001600160401b03821161012c573660238301121561012c578160040135906001600160401b03821161012c573660248360051b8501011161012c576101289360246100fc9401916105fe565b6040805195151586526020860194909452928401919091526060830152608082015290819060a0820190565b0390f35b5f80fd5b9181601f8401121561012c578235916001600160401b03831161012c576020838186019501011161012c57565b608060031982011261012c576004356001600160401b038116810361012c5791602435916044356001600160401b03811161012c578161019f91600401610130565b92909291606435906001600160401b03821161012c576101c191600401610130565b9091565b3461012c5760606001600160401b036101dd3661015d565b50505050911615159081610217575b50801561020f5760ff60015b604051921515835216602082015260016040820152f35b60ff5f6101f8565b905015155f6101ec565b3461012c575f36600319011261012c576040805190610240818361047f565b600f825260208201916e69676e65756d2d6465766e65742d3360881b83528151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b3461012c576102973661015d565b505050506001600160401b03821691821515806103bf575b1561036657817f99f47e4a7ab820120d8b7a21d713cce18c78fa6a1d27124cc2e0c2a5069a26a4926103248361030e6102fb610357966001600160401b03165f525f60205260405f2090565b5484811591821561035c575b50506104d4565b6001600160401b03165f525f60205260405f2090565b5561034761033a825f52600160205260405f2090565b805460ff19166001179055565b6040519081529081906020820190565b0390a2005b149050845f610307565b60405162461bcd60e51b815260206004820152602b60248201527f737475623a20696e64657820616e6420636865636b706f696e74206d7573742060448201526a6265206e6f6e2d7a65726f60a81b6064820152608490fd5b508115156102af565b3461012c57602036600319011261012c576004356001600160401b03811680910361012c575f525f602052602060405f2054604051908152f35b3461012c575f36600319011261012c5760206040517f859962dfd79b64b7948cb28d6252ff8d57d5d13693b86df35a60a583de6220cc8152f35b3461012c57602036600319011261012c576004355f526001602052602060ff60405f2054166040519015158152f35b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b038211176104a057604052565b61046b565b6001600160401b0381116104a057601f01601f191660200190565b604051906104cf60208361047f565b5f8252565b156104db57565b60405162461bcd60e51b815260206004820152602a60248201527f737475623a20696e64657820616c72656164792068617320616e6f746865722060448201526918da1958dadc1bda5b9d60b21b6064820152608490fd5b1561053a57565b60405162461bcd60e51b815260206004820152601a60248201527f6d70743a206163636f756e74206973206e6f742061206c6973740000000000006044820152606490fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116105a157565b61057f565b919082018092116105a157565b156105ba57565b606460405162461bcd60e51b815260206004820152602060248201527f6d70743a206163636f756e7420686173206e6f7420666f7572206669656c64736044820152fd5b60405160609290921b6bffffffffffffffffffffffff1916602083019081526014835261063b94939261063260348261047f565b51902090610b27565b9190156107465761064b826110a9565b90815161065790151590565b61066090610533565b6040820191825161067190856111b6565b916040830194855193606001938451610689916105a6565b61069390826111b6565b9460408601958651906060019081516106ab916105a6565b6106b590846111b6565b9060408201968751926060019283516106cd916105a6565b6106d790866111b6565b9360408501978851956060019586516106ef916105a6565b915190606001516106ff916105a6565b14610709906105b3565b60019951905161071991866112b0565b9751905161072791856112b0565b95519051610735918461133e565b93519051906107439261133e565b90565b5f91508190819081908190565b1561075a57565b60405162461bcd60e51b815260206004820152602260248201527f6d70743a206e6f206e6f64657320666f722061206e6f6e2d656d70747920726f6044820152611bdd60f21b6064820152608490fd5b634e487b7160e01b5f52603260045260245ffd5b90156107f857803590601e198136030182121561012c5701908135916001600160401b03831161012c57602001823603811361012c579190565b6107aa565b91908110156107f85760051b81013590601e198136030182121561012c5701908135916001600160401b03831161012c57602001823603811361012c579190565b92919261084a826104a5565b91610858604051938461047f565b82948184528183011161012c578281602093845f960137010152565b1561087b57565b60405162461bcd60e51b815260206004820152602360248201527f6d70743a20746865206669727374206e6f6465206973206e6f742074686520726044820152621bdbdd60ea1b6064820152608490fd5b156108d357565b60405162461bcd60e51b815260206004820152601760248201527f6d70743a206e6f6465206973206e6f742061206c6973740000000000000000006044820152606490fd5b60405190610220610929818461047f565b368337565b1561093557565b60405162461bcd60e51b81526020600482015260136024820152726d70743a20746f6f206d616e79206974656d7360681b6044820152606490fd5b5f1981146105a15760010190565b9060118110156107f85760051b0190565b60405190608082018281106001600160401b038211176104a0576040525f6060838281528260208201528260408201520152565b156109ca57565b60405162461bcd60e51b815260206004820152600d60248201526c0dae0e87440c4c2c840e0c2e8d609b1b6044820152606490fd5b9081518110156107f8570160200190565b908160011b91808304600214901517156105a157565b919082039182116105a157565b15610a3a57565b60405162461bcd60e51b81526020600482015260126024820152716d70743a20626164207265666572656e636560701b6044820152606490fd5b15610a7b57565b60405162461bcd60e51b815260206004820152602160248201527f6d70743a2061207265666572656e636564206e6f6465206973206d697373696e6044820152606760f81b6064820152608490fd5b15610ad157565b60405162461bcd60e51b815260206004820152602860248201527f6d70743a206e6f646520646f6573206e6f74206861736820746f20697473207260448201526765666572656e636560c01b6064820152608490fd5b939291938215610fae57610b5a610b4c610b458588979695976107be565b369161083e565b918251602084012014610874565b5f918290600190825b60508410610ba55760405162461bcd60e51b815260206004820152601260248201527106d70743a207061746820746f6f20646565760741b6044820152606490fd5b610baf90856111b6565b94610bc2610bbd8751151590565b6108cc565b610bca610918565b965f986040880197606089519101905b610be78a518351906105a6565b811015610c425790610c368c83610c258e9f9d9e9d610be7968e610c106011610c15941061092e565b6111b6565b92610c1f81610970565b9e61097e565b5260606040820151910151906105a6565b9a999b9a909150610bda565b5050965097969096949194610c5561098f565b5060118103610d76575060408714610d2957610c91610c8a610c9792610c84610c7e8b8b611387565b60ff1690565b9061097e565b51836111b6565b96610593565b955b8051610d195760608101805115610d055760209291610cbc846040935114610a33565b015101015192610ccd818310610a74565b610cf5610ce7610b45610cdf85610970565b94848c6107fd565b948551602087012014610aca565b60015f935b019296959496610b63565b505050505050505090505f906107436104c0565b6020600191959295015193610cfa565b93509596505050610d489250610d4191506102000190565b51826111b6565b9060608201805115610d69576040610d649301519051916113ae565b600191565b5050505f906107436104c0565b909690600203610f6957610d8b8751836111b6565b90610d9d610d998351151590565b1590565b80610f5c575b610dac906109c3565b6040820190610def6060610de7610dde610dd8610dca87518a6109ff565b516001600160f81b03191690565b60f81c90565b60041c600f1690565b940151610a10565b6001841615801591610e0b91610f535760ff60015b1690610a26565b925f5b848110610e7057505050610e31610e2a600293610e38936105a6565b9960200190565b51846111b6565b911615610c995796975094925050506040915003610e64578160606040610d64940151910151916113ae565b50505f906107436104c0565b5f9c979b96999a92939495989c50835f14610f3b57896001610ebb610dd8610dca610e9f60ff855b16876105a6565b94610eb58851610eaf8860011c90565b906105a6565b906109ff565b9116610f335760041c600f165b6040610ed483886105a6565b1090811591610f0f575b50610ef7576001019b97949392919998959a969b610e0e565b50505050505050955050505050505f906107436104c0565b905060ff610f29610c7e610f23858a6105a6565b87611387565b911614155f610ede565b600f16610ec8565b896001610ebb610dd8610dca610e9f60ff6002610e98565b60ff6002610e04565b5060608201511515610da3565b60405162461bcd60e51b815260206004820181905260248201527f6d70743a206e6f6465207769746820616e206f6464206974656d20636f756e746044820152606490fd5b9050610fdf9293507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014610753565b5f906107436104c0565b15610ff057565b60405162461bcd60e51b815260206004820152600a6024820152691c9b1c0e881cda1bdc9d60b21b6044820152606490fd5b60ff60f6199116019060ff82116105a157565b60ff60bf199116019060ff82116105a157565b60ff60b6199116019060ff82116105a157565b60ff607f199116019060ff82116105a157565b1561107557565b60405162461bcd60e51b815260206004820152600c60248201526b3936381d1037bb32b9393ab760a11b6044820152606490fd5b906111116110b561098f565b926110c281511515610fe9565b6110d2610dd8610dca5f846109ff565b5f602086015260ff811660808110156111135750505f6040850152600160608501525b61110860408501516060860151906105a6565b9051101561106e565b565b60b88110156111415750610c7e6111299161105b565b60608501526111375f610593565b60408501526110f5565b60c0811015611180575061115a610c7e61113792611048565b61116d816111675f610593565b856113e9565b606087015261117b5f610593565b6105a6565b60f8111561119e57610c7e611129916111998760019052565b611035565b6111ad610c7e61113792611022565b6001865261115a565b611111909291926111c561098f565b936111d282518210610fe9565b6111e2610dd8610dca83856109ff565b9080602087015260ff8216608081105f146112135750604086018190526001606087018190526111089250906105a6565b60b8811015611236575061122c610c7e6111379361105b565b6060870152610593565b60c0811015611270575061117b611252610c7e61113794611048565b916112668361126083610593565b876113e9565b6060890152610593565b60f8111561128c5761122c610c7e611137936111998960019052565b61117b61129e610c7e61113794611022565b60018852916112668361126083610593565b9092915f93602082116113015791905f925b8184106112cf5750505050565b9091929460081b858201908183116105a1576112f6610c7e610dd8610dca600195896109ff565b1795019291906112c2565b60405162461bcd60e51b8152602060048201526015602482015274726c703a20696e746567657220746f6f207769646560581b6044820152606490fd5b9160200361134e57016020015190565b60405162461bcd60e51b8152602060048201526011602482015270726c703a206e6f7420333220627974657360781b6044820152606490fd5b8160011c9060208210156107f857901a906001166113a85760041c60ff1690565b600f1690565b92919060206113bc836104a5565b916113ca604051938461047f565b8383526113d6846104a5565b8284019390601f1901368537950101905e565b9291905f9360208311158061147e575b156114475791905f925b8284106114105750505050565b9091929461142060019160081b90565b61143c610c7e610dd8610dca6114368b896105a6565b876109ff565b179501929190611403565b60405162461bcd60e51b815260206004820152600f60248201526e0e4d8e07440c4c2c840d8cadccee8d608b1b6044820152606490fd5b508282018083116105a157815110156113f956fea2646970667358221220c53733b7178146a825c866a59c165b563029898b6eab335ced53f7e5dc39298364736f6c634300081c0033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c80635e9c528a14610084578063662464951461007f5780639a8a05921461007a578063a59da8f714610075578063b1b0945314610070578063c2c1e2cb1461006b5763da3686de14610066575f80fd5b61043c565b610402565b6103c8565b610289565b610221565b6101c5565b3461012c57606036600319011261012c576024356004356001600160a01b038216820361012c57604435906001600160401b03821161012c573660238301121561012c578160040135906001600160401b03821161012c573660248360051b8501011161012c576101289360246100fc9401916105fe565b6040805195151586526020860194909452928401919091526060830152608082015290819060a0820190565b0390f35b5f80fd5b9181601f8401121561012c578235916001600160401b03831161012c576020838186019501011161012c57565b608060031982011261012c576004356001600160401b038116810361012c5791602435916044356001600160401b03811161012c578161019f91600401610130565b92909291606435906001600160401b03821161012c576101c191600401610130565b9091565b3461012c5760606001600160401b036101dd3661015d565b50505050911615159081610217575b50801561020f5760ff60015b604051921515835216602082015260016040820152f35b60ff5f6101f8565b905015155f6101ec565b3461012c575f36600319011261012c576040805190610240818361047f565b600f825260208201916e69676e65756d2d6465766e65742d3360881b83528151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b3461012c576102973661015d565b505050506001600160401b03821691821515806103bf575b1561036657817f99f47e4a7ab820120d8b7a21d713cce18c78fa6a1d27124cc2e0c2a5069a26a4926103248361030e6102fb610357966001600160401b03165f525f60205260405f2090565b5484811591821561035c575b50506104d4565b6001600160401b03165f525f60205260405f2090565b5561034761033a825f52600160205260405f2090565b805460ff19166001179055565b6040519081529081906020820190565b0390a2005b149050845f610307565b60405162461bcd60e51b815260206004820152602b60248201527f737475623a20696e64657820616e6420636865636b706f696e74206d7573742060448201526a6265206e6f6e2d7a65726f60a81b6064820152608490fd5b508115156102af565b3461012c57602036600319011261012c576004356001600160401b03811680910361012c575f525f602052602060405f2054604051908152f35b3461012c575f36600319011261012c5760206040517f859962dfd79b64b7948cb28d6252ff8d57d5d13693b86df35a60a583de6220cc8152f35b3461012c57602036600319011261012c576004355f526001602052602060ff60405f2054166040519015158152f35b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b038211176104a057604052565b61046b565b6001600160401b0381116104a057601f01601f191660200190565b604051906104cf60208361047f565b5f8252565b156104db57565b60405162461bcd60e51b815260206004820152602a60248201527f737475623a20696e64657820616c72656164792068617320616e6f746865722060448201526918da1958dadc1bda5b9d60b21b6064820152608490fd5b1561053a57565b60405162461bcd60e51b815260206004820152601a60248201527f6d70743a206163636f756e74206973206e6f742061206c6973740000000000006044820152606490fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116105a157565b61057f565b919082018092116105a157565b156105ba57565b606460405162461bcd60e51b815260206004820152602060248201527f6d70743a206163636f756e7420686173206e6f7420666f7572206669656c64736044820152fd5b60405160609290921b6bffffffffffffffffffffffff1916602083019081526014835261063b94939261063260348261047f565b51902090610b27565b9190156107465761064b826110a9565b90815161065790151590565b61066090610533565b6040820191825161067190856111b6565b916040830194855193606001938451610689916105a6565b61069390826111b6565b9460408601958651906060019081516106ab916105a6565b6106b590846111b6565b9060408201968751926060019283516106cd916105a6565b6106d790866111b6565b9360408501978851956060019586516106ef916105a6565b915190606001516106ff916105a6565b14610709906105b3565b60019951905161071991866112b0565b9751905161072791856112b0565b95519051610735918461133e565b93519051906107439261133e565b90565b5f91508190819081908190565b1561075a57565b60405162461bcd60e51b815260206004820152602260248201527f6d70743a206e6f206e6f64657320666f722061206e6f6e2d656d70747920726f6044820152611bdd60f21b6064820152608490fd5b634e487b7160e01b5f52603260045260245ffd5b90156107f857803590601e198136030182121561012c5701908135916001600160401b03831161012c57602001823603811361012c579190565b6107aa565b91908110156107f85760051b81013590601e198136030182121561012c5701908135916001600160401b03831161012c57602001823603811361012c579190565b92919261084a826104a5565b91610858604051938461047f565b82948184528183011161012c578281602093845f960137010152565b1561087b57565b60405162461bcd60e51b815260206004820152602360248201527f6d70743a20746865206669727374206e6f6465206973206e6f742074686520726044820152621bdbdd60ea1b6064820152608490fd5b156108d357565b60405162461bcd60e51b815260206004820152601760248201527f6d70743a206e6f6465206973206e6f742061206c6973740000000000000000006044820152606490fd5b60405190610220610929818461047f565b368337565b1561093557565b60405162461bcd60e51b81526020600482015260136024820152726d70743a20746f6f206d616e79206974656d7360681b6044820152606490fd5b5f1981146105a15760010190565b9060118110156107f85760051b0190565b60405190608082018281106001600160401b038211176104a0576040525f6060838281528260208201528260408201520152565b156109ca57565b60405162461bcd60e51b815260206004820152600d60248201526c0dae0e87440c4c2c840e0c2e8d609b1b6044820152606490fd5b9081518110156107f8570160200190565b908160011b91808304600214901517156105a157565b919082039182116105a157565b15610a3a57565b60405162461bcd60e51b81526020600482015260126024820152716d70743a20626164207265666572656e636560701b6044820152606490fd5b15610a7b57565b60405162461bcd60e51b815260206004820152602160248201527f6d70743a2061207265666572656e636564206e6f6465206973206d697373696e6044820152606760f81b6064820152608490fd5b15610ad157565b60405162461bcd60e51b815260206004820152602860248201527f6d70743a206e6f646520646f6573206e6f74206861736820746f20697473207260448201526765666572656e636560c01b6064820152608490fd5b939291938215610fae57610b5a610b4c610b458588979695976107be565b369161083e565b918251602084012014610874565b5f918290600190825b60508410610ba55760405162461bcd60e51b815260206004820152601260248201527106d70743a207061746820746f6f20646565760741b6044820152606490fd5b610baf90856111b6565b94610bc2610bbd8751151590565b6108cc565b610bca610918565b965f986040880197606089519101905b610be78a518351906105a6565b811015610c425790610c368c83610c258e9f9d9e9d610be7968e610c106011610c15941061092e565b6111b6565b92610c1f81610970565b9e61097e565b5260606040820151910151906105a6565b9a999b9a909150610bda565b5050965097969096949194610c5561098f565b5060118103610d76575060408714610d2957610c91610c8a610c9792610c84610c7e8b8b611387565b60ff1690565b9061097e565b51836111b6565b96610593565b955b8051610d195760608101805115610d055760209291610cbc846040935114610a33565b015101015192610ccd818310610a74565b610cf5610ce7610b45610cdf85610970565b94848c6107fd565b948551602087012014610aca565b60015f935b019296959496610b63565b505050505050505090505f906107436104c0565b6020600191959295015193610cfa565b93509596505050610d489250610d4191506102000190565b51826111b6565b9060608201805115610d69576040610d649301519051916113ae565b600191565b5050505f906107436104c0565b909690600203610f6957610d8b8751836111b6565b90610d9d610d998351151590565b1590565b80610f5c575b610dac906109c3565b6040820190610def6060610de7610dde610dd8610dca87518a6109ff565b516001600160f81b03191690565b60f81c90565b60041c600f1690565b940151610a10565b6001841615801591610e0b91610f535760ff60015b1690610a26565b925f5b848110610e7057505050610e31610e2a600293610e38936105a6565b9960200190565b51846111b6565b911615610c995796975094925050506040915003610e64578160606040610d64940151910151916113ae565b50505f906107436104c0565b5f9c979b96999a92939495989c50835f14610f3b57896001610ebb610dd8610dca610e9f60ff855b16876105a6565b94610eb58851610eaf8860011c90565b906105a6565b906109ff565b9116610f335760041c600f165b6040610ed483886105a6565b1090811591610f0f575b50610ef7576001019b97949392919998959a969b610e0e565b50505050505050955050505050505f906107436104c0565b905060ff610f29610c7e610f23858a6105a6565b87611387565b911614155f610ede565b600f16610ec8565b896001610ebb610dd8610dca610e9f60ff6002610e98565b60ff6002610e04565b5060608201511515610da3565b60405162461bcd60e51b815260206004820181905260248201527f6d70743a206e6f6465207769746820616e206f6464206974656d20636f756e746044820152606490fd5b9050610fdf9293507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014610753565b5f906107436104c0565b15610ff057565b60405162461bcd60e51b815260206004820152600a6024820152691c9b1c0e881cda1bdc9d60b21b6044820152606490fd5b60ff60f6199116019060ff82116105a157565b60ff60bf199116019060ff82116105a157565b60ff60b6199116019060ff82116105a157565b60ff607f199116019060ff82116105a157565b1561107557565b60405162461bcd60e51b815260206004820152600c60248201526b3936381d1037bb32b9393ab760a11b6044820152606490fd5b906111116110b561098f565b926110c281511515610fe9565b6110d2610dd8610dca5f846109ff565b5f602086015260ff811660808110156111135750505f6040850152600160608501525b61110860408501516060860151906105a6565b9051101561106e565b565b60b88110156111415750610c7e6111299161105b565b60608501526111375f610593565b60408501526110f5565b60c0811015611180575061115a610c7e61113792611048565b61116d816111675f610593565b856113e9565b606087015261117b5f610593565b6105a6565b60f8111561119e57610c7e611129916111998760019052565b611035565b6111ad610c7e61113792611022565b6001865261115a565b611111909291926111c561098f565b936111d282518210610fe9565b6111e2610dd8610dca83856109ff565b9080602087015260ff8216608081105f146112135750604086018190526001606087018190526111089250906105a6565b60b8811015611236575061122c610c7e6111379361105b565b6060870152610593565b60c0811015611270575061117b611252610c7e61113794611048565b916112668361126083610593565b876113e9565b6060890152610593565b60f8111561128c5761122c610c7e611137936111998960019052565b61117b61129e610c7e61113794611022565b60018852916112668361126083610593565b9092915f93602082116113015791905f925b8184106112cf5750505050565b9091929460081b858201908183116105a1576112f6610c7e610dd8610dca600195896109ff565b1795019291906112c2565b60405162461bcd60e51b8152602060048201526015602482015274726c703a20696e746567657220746f6f207769646560581b6044820152606490fd5b9160200361134e57016020015190565b60405162461bcd60e51b8152602060048201526011602482015270726c703a206e6f7420333220627974657360781b6044820152606490fd5b8160011c9060208210156107f857901a906001166113a85760041c60ff1690565b600f1690565b92919060206113bc836104a5565b916113ca604051938461047f565b8383526113d6846104a5565b8284019390601f1901368537950101905e565b9291905f9360208311158061147e575b156114475791905f925b8284106114105750505050565b9091929461142060019160081b90565b61143c610c7e610dd8610dca6114368b896105a6565b876109ff565b179501929190611403565b60405162461bcd60e51b815260206004820152600f60248201526e0e4d8e07440c4c2c840d8cadccee8d608b1b6044820152606490fd5b508282018083116105a157815110156113f956fea2646970667358221220c53733b7178146a825c866a59c165b563029898b6eab335ced53f7e5dc39298364736f6c634300081c0033" +} diff --git a/tools/reference-apps/oracle/compile.mjs b/tools/reference-apps/oracle/compile.mjs new file mode 100644 index 000000000..1ca0520e0 --- /dev/null +++ b/tools/reference-apps/oracle/compile.mjs @@ -0,0 +1,35 @@ +// Compiles the oracle contracts with solc-js and writes artifacts/