diff --git a/contracts/deployments/arbitrum_goerli/.chainId b/contracts/deployments/arbitrum_goerli/.chainId new file mode 100644 index 00000000..16be23a3 --- /dev/null +++ b/contracts/deployments/arbitrum_goerli/.chainId @@ -0,0 +1 @@ +421613 \ No newline at end of file diff --git a/contracts/deployments/arbitrum_goerli/CAPE.json b/contracts/deployments/arbitrum_goerli/CAPE.json new file mode 100644 index 00000000..04132e59 --- /dev/null +++ b/contracts/deployments/arbitrum_goerli/CAPE.json @@ -0,0 +1,4516 @@ +{ + "address": "0x81D3877b6b5D8B73C033b54bE0BeC39988E24f26", + "abi": [ + { + "inputs": [ + { + "internalType": "uint64", + "name": "nRoots", + "type": "uint64" + }, + { + "internalType": "address", + "name": "verifierAddr", + "type": "address" + }, + { + "internalType": "address", + "name": "recordsMerkleTreeAddr", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "erc20Address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assetDefinitionCode", + "type": "uint256" + } + ], + "name": "AssetSponsored", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint64", + "name": "height", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "depositCommitments", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "minerAddr", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "noteTypes", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "transferNotes", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "mintNotes", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "freezeNotes", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "burnNotes", + "type": "bytes" + } + ], + "name": "BlockCommitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "roBytes", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "address", + "name": "erc20TokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "from", + "type": "address" + } + ], + "name": "Erc20TokensDeposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "roBytes", + "type": "bytes" + } + ], + "name": "FaucetInitialized", + "type": "event" + }, + { + "inputs": [], + "name": "CAPE_BURN_MAGIC_BYTES", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CAPE_BURN_MAGIC_BYTES_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CAP_NATIVE_ASSET_CODE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOM_SEP_DOMESTIC_ASSET", + "outputs": [ + { + "internalType": "bytes14", + "name": "", + "type": "bytes14" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOM_SEP_FOREIGN_ASSET", + "outputs": [ + { + "internalType": "bytes13", + "name": "", + "type": "bytes13" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_NUM_PENDING_DEPOSIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "assets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "blockHeight", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deployer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "assetDef", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "userAddr", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "encKey", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "freezeFlag", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "blind", + "type": "uint256" + } + ], + "internalType": "struct CAPE.RecordOpening", + "name": "ro", + "type": "tuple" + }, + { + "internalType": "address", + "name": "erc20Address", + "type": "address" + } + ], + "name": "depositErc20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "faucetInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "faucetManagerAddress", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "faucetManagerEncKey", + "type": "bytes32" + } + ], + "name": "faucetSetupForTestnet", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getRootValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "assetDefinition", + "type": "tuple" + } + ], + "name": "isCapeAssetRegistered", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "assetDefinition", + "type": "tuple" + } + ], + "name": "lookup", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeDomesticAsset", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "assetDefinition", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nullifiers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pendingDeposits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "erc20Address", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "newAsset", + "type": "tuple" + } + ], + "name": "sponsorCapeAsset", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "minerAddr", + "type": "tuple" + }, + { + "internalType": "enum CAPE.NoteType[]", + "name": "noteTypes", + "type": "uint8[]" + }, + { + "components": [ + { + "internalType": "uint256[]", + "name": "inputNullifiers", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "outputCommitments", + "type": "uint256[]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "ephemeralKey", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "data", + "type": "uint256[]" + } + ], + "internalType": "struct CAPE.AuditMemo", + "name": "auditMemo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "merkleRoot", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "fee", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "validUntil", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "txnMemoVerKey", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "extraProofBoundData", + "type": "bytes" + } + ], + "internalType": "struct CAPE.TransferAuxInfo", + "name": "auxInfo", + "type": "tuple" + } + ], + "internalType": "struct CAPE.TransferNote[]", + "name": "transferNotes", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "inputNullifier", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "chgComm", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mintComm", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "mintAmount", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "mintAssetDef", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "mintInternalAssetCode", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "ephemeralKey", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "data", + "type": "uint256[]" + } + ], + "internalType": "struct CAPE.AuditMemo", + "name": "auditMemo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "merkleRoot", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "fee", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "txnMemoVerKey", + "type": "tuple" + } + ], + "internalType": "struct CAPE.MintAuxInfo", + "name": "auxInfo", + "type": "tuple" + } + ], + "internalType": "struct CAPE.MintNote[]", + "name": "mintNotes", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint256[]", + "name": "inputNullifiers", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "outputCommitments", + "type": "uint256[]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "merkleRoot", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "fee", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "txnMemoVerKey", + "type": "tuple" + } + ], + "internalType": "struct CAPE.FreezeAuxInfo", + "name": "auxInfo", + "type": "tuple" + } + ], + "internalType": "struct CAPE.FreezeNote[]", + "name": "freezeNotes", + "type": "tuple[]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256[]", + "name": "inputNullifiers", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "outputCommitments", + "type": "uint256[]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "ephemeralKey", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "data", + "type": "uint256[]" + } + ], + "internalType": "struct CAPE.AuditMemo", + "name": "auditMemo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "merkleRoot", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "fee", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "validUntil", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "txnMemoVerKey", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "extraProofBoundData", + "type": "bytes" + } + ], + "internalType": "struct CAPE.TransferAuxInfo", + "name": "auxInfo", + "type": "tuple" + } + ], + "internalType": "struct CAPE.TransferNote", + "name": "transferNote", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "assetDef", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "userAddr", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "encKey", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "freezeFlag", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "blind", + "type": "uint256" + } + ], + "internalType": "struct CAPE.RecordOpening", + "name": "recordOpening", + "type": "tuple" + } + ], + "internalType": "struct CAPE.BurnNote[]", + "name": "burnNotes", + "type": "tuple[]" + } + ], + "internalType": "struct CAPE.CapeBlock", + "name": "newBlock", + "type": "tuple" + } + ], + "name": "submitCapeBlock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "minerAddr", + "type": "tuple" + }, + { + "internalType": "enum CAPE.NoteType[]", + "name": "noteTypes", + "type": "uint8[]" + }, + { + "components": [ + { + "internalType": "uint256[]", + "name": "inputNullifiers", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "outputCommitments", + "type": "uint256[]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "ephemeralKey", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "data", + "type": "uint256[]" + } + ], + "internalType": "struct CAPE.AuditMemo", + "name": "auditMemo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "merkleRoot", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "fee", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "validUntil", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "txnMemoVerKey", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "extraProofBoundData", + "type": "bytes" + } + ], + "internalType": "struct CAPE.TransferAuxInfo", + "name": "auxInfo", + "type": "tuple" + } + ], + "internalType": "struct CAPE.TransferNote[]", + "name": "transferNotes", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "inputNullifier", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "chgComm", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mintComm", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "mintAmount", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "mintAssetDef", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "mintInternalAssetCode", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "ephemeralKey", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "data", + "type": "uint256[]" + } + ], + "internalType": "struct CAPE.AuditMemo", + "name": "auditMemo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "merkleRoot", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "fee", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "txnMemoVerKey", + "type": "tuple" + } + ], + "internalType": "struct CAPE.MintAuxInfo", + "name": "auxInfo", + "type": "tuple" + } + ], + "internalType": "struct CAPE.MintNote[]", + "name": "mintNotes", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint256[]", + "name": "inputNullifiers", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "outputCommitments", + "type": "uint256[]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "merkleRoot", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "fee", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "txnMemoVerKey", + "type": "tuple" + } + ], + "internalType": "struct CAPE.FreezeAuxInfo", + "name": "auxInfo", + "type": "tuple" + } + ], + "internalType": "struct CAPE.FreezeNote[]", + "name": "freezeNotes", + "type": "tuple[]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256[]", + "name": "inputNullifiers", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "outputCommitments", + "type": "uint256[]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof", + "name": "proof", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "ephemeralKey", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "data", + "type": "uint256[]" + } + ], + "internalType": "struct CAPE.AuditMemo", + "name": "auditMemo", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "merkleRoot", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "fee", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "validUntil", + "type": "uint64" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "txnMemoVerKey", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "extraProofBoundData", + "type": "bytes" + } + ], + "internalType": "struct CAPE.TransferAuxInfo", + "name": "auxInfo", + "type": "tuple" + } + ], + "internalType": "struct CAPE.TransferNote", + "name": "transferNote", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "code", + "type": "uint256" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "auditorPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "credPk", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "freezerPk", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "revealMap", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "revealThreshold", + "type": "uint128" + } + ], + "internalType": "struct AssetRegistry.AssetPolicy", + "name": "policy", + "type": "tuple" + } + ], + "internalType": "struct AssetRegistry.AssetDefinition", + "name": "assetDef", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct EdOnBN254.EdOnBN254Point", + "name": "userAddr", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "encKey", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "freezeFlag", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "blind", + "type": "uint256" + } + ], + "internalType": "struct CAPE.RecordOpening", + "name": "recordOpening", + "type": "tuple" + } + ], + "internalType": "struct CAPE.BurnNote[]", + "name": "burnNotes", + "type": "tuple[]" + } + ], + "internalType": "struct CAPE.CapeBlock", + "name": "newBlock", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "submitCapeBlockWithMemos", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x81f4f4fcb36d39b4062db59ccc8b405a79c68f4e7e6a766cb60ca34103566ce1", + "receipt": { + "to": null, + "from": "0x21a49524e319C0b28dAA1d79d50B6D7A346490B2", + "contractAddress": "0x81D3877b6b5D8B73C033b54bE0BeC39988E24f26", + "transactionIndex": 1, + "gasUsed": "5152390", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6c83763baf7c2a1d5c0e0a7fb256ad9d7aac7d1fcd028a4247bb4a2f22ab2b79", + "transactionHash": "0x81f4f4fcb36d39b4062db59ccc8b405a79c68f4e7e6a766cb60ca34103566ce1", + "logs": [], + "blockNumber": 1220981, + "cumulativeGasUsed": "5152390", + "status": 1, + "byzantium": true + }, + "args": [ + 40, + "0x013bD50e91B788c1eA1a679B1A7962d96315B168", + "0x4650e4737C366aE86354F8A3E3CFD23F41E90F77" + ], + "numDeployments": 1, + "solcInputHash": "72a14774796fae5d4ac4d3b6f26df06c", + "metadata": "{\"compiler\":{\"version\":\"0.8.13+commit.abaa5c0e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nRoots\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"verifierAddr\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recordsMerkleTreeAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"erc20Address\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assetDefinitionCode\",\"type\":\"uint256\"}],\"name\":\"AssetSponsored\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"depositCommitments\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"minerAddr\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"noteTypes\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"transferNotes\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"mintNotes\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"freezeNotes\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"burnNotes\",\"type\":\"bytes\"}],\"name\":\"BlockCommitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"roBytes\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"erc20TokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"Erc20TokensDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"roBytes\",\"type\":\"bytes\"}],\"name\":\"FaucetInitialized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CAPE_BURN_MAGIC_BYTES\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CAPE_BURN_MAGIC_BYTES_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CAP_NATIVE_ASSET_CODE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOM_SEP_DOMESTIC_ASSET\",\"outputs\":[{\"internalType\":\"bytes14\",\"name\":\"\",\"type\":\"bytes14\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOM_SEP_FOREIGN_ASSET\",\"outputs\":[{\"internalType\":\"bytes13\",\"name\":\"\",\"type\":\"bytes13\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_PENDING_DEPOSIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"assets\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blockHeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deployer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"assetDef\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"userAddr\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"encKey\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"freezeFlag\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"blind\",\"type\":\"uint256\"}],\"internalType\":\"struct CAPE.RecordOpening\",\"name\":\"ro\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"erc20Address\",\"type\":\"address\"}],\"name\":\"depositErc20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"faucetInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"faucetManagerAddress\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"faucetManagerEncKey\",\"type\":\"bytes32\"}],\"name\":\"faucetSetupForTestnet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRootValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"assetDefinition\",\"type\":\"tuple\"}],\"name\":\"isCapeAssetRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"assetDefinition\",\"type\":\"tuple\"}],\"name\":\"lookup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nativeDomesticAsset\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"assetDefinition\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"nullifiers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"pendingDeposits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"erc20Address\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"newAsset\",\"type\":\"tuple\"}],\"name\":\"sponsorCapeAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"minerAddr\",\"type\":\"tuple\"},{\"internalType\":\"enum CAPE.NoteType[]\",\"name\":\"noteTypes\",\"type\":\"uint8[]\"},{\"components\":[{\"internalType\":\"uint256[]\",\"name\":\"inputNullifiers\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"outputCommitments\",\"type\":\"uint256[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"ephemeralKey\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"data\",\"type\":\"uint256[]\"}],\"internalType\":\"struct CAPE.AuditMemo\",\"name\":\"auditMemo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"merkleRoot\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"validUntil\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"txnMemoVerKey\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"extraProofBoundData\",\"type\":\"bytes\"}],\"internalType\":\"struct CAPE.TransferAuxInfo\",\"name\":\"auxInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.TransferNote[]\",\"name\":\"transferNotes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"inputNullifier\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"chgComm\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintComm\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"mintAmount\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"mintAssetDef\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"mintInternalAssetCode\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"ephemeralKey\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"data\",\"type\":\"uint256[]\"}],\"internalType\":\"struct CAPE.AuditMemo\",\"name\":\"auditMemo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"merkleRoot\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"txnMemoVerKey\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.MintAuxInfo\",\"name\":\"auxInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.MintNote[]\",\"name\":\"mintNotes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256[]\",\"name\":\"inputNullifiers\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"outputCommitments\",\"type\":\"uint256[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"merkleRoot\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"txnMemoVerKey\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.FreezeAuxInfo\",\"name\":\"auxInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.FreezeNote[]\",\"name\":\"freezeNotes\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256[]\",\"name\":\"inputNullifiers\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"outputCommitments\",\"type\":\"uint256[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"ephemeralKey\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"data\",\"type\":\"uint256[]\"}],\"internalType\":\"struct CAPE.AuditMemo\",\"name\":\"auditMemo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"merkleRoot\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"validUntil\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"txnMemoVerKey\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"extraProofBoundData\",\"type\":\"bytes\"}],\"internalType\":\"struct CAPE.TransferAuxInfo\",\"name\":\"auxInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.TransferNote\",\"name\":\"transferNote\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"assetDef\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"userAddr\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"encKey\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"freezeFlag\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"blind\",\"type\":\"uint256\"}],\"internalType\":\"struct CAPE.RecordOpening\",\"name\":\"recordOpening\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.BurnNote[]\",\"name\":\"burnNotes\",\"type\":\"tuple[]\"}],\"internalType\":\"struct CAPE.CapeBlock\",\"name\":\"newBlock\",\"type\":\"tuple\"}],\"name\":\"submitCapeBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"minerAddr\",\"type\":\"tuple\"},{\"internalType\":\"enum CAPE.NoteType[]\",\"name\":\"noteTypes\",\"type\":\"uint8[]\"},{\"components\":[{\"internalType\":\"uint256[]\",\"name\":\"inputNullifiers\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"outputCommitments\",\"type\":\"uint256[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"ephemeralKey\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"data\",\"type\":\"uint256[]\"}],\"internalType\":\"struct CAPE.AuditMemo\",\"name\":\"auditMemo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"merkleRoot\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"validUntil\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"txnMemoVerKey\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"extraProofBoundData\",\"type\":\"bytes\"}],\"internalType\":\"struct CAPE.TransferAuxInfo\",\"name\":\"auxInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.TransferNote[]\",\"name\":\"transferNotes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"inputNullifier\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"chgComm\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintComm\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"mintAmount\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"mintAssetDef\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"mintInternalAssetCode\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"ephemeralKey\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"data\",\"type\":\"uint256[]\"}],\"internalType\":\"struct CAPE.AuditMemo\",\"name\":\"auditMemo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"merkleRoot\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"txnMemoVerKey\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.MintAuxInfo\",\"name\":\"auxInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.MintNote[]\",\"name\":\"mintNotes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256[]\",\"name\":\"inputNullifiers\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"outputCommitments\",\"type\":\"uint256[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"merkleRoot\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"txnMemoVerKey\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.FreezeAuxInfo\",\"name\":\"auxInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.FreezeNote[]\",\"name\":\"freezeNotes\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256[]\",\"name\":\"inputNullifiers\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"outputCommitments\",\"type\":\"uint256[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"ephemeralKey\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"data\",\"type\":\"uint256[]\"}],\"internalType\":\"struct CAPE.AuditMemo\",\"name\":\"auditMemo\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"merkleRoot\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"validUntil\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"txnMemoVerKey\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"extraProofBoundData\",\"type\":\"bytes\"}],\"internalType\":\"struct CAPE.TransferAuxInfo\",\"name\":\"auxInfo\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.TransferNote\",\"name\":\"transferNote\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"code\",\"type\":\"uint256\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"auditorPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"credPk\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"freezerPk\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"revealMap\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"revealThreshold\",\"type\":\"uint128\"}],\"internalType\":\"struct AssetRegistry.AssetPolicy\",\"name\":\"policy\",\"type\":\"tuple\"}],\"internalType\":\"struct AssetRegistry.AssetDefinition\",\"name\":\"assetDef\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct EdOnBN254.EdOnBN254Point\",\"name\":\"userAddr\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"encKey\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"freezeFlag\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"blind\",\"type\":\"uint256\"}],\"internalType\":\"struct CAPE.RecordOpening\",\"name\":\"recordOpening\",\"type\":\"tuple\"}],\"internalType\":\"struct CAPE.BurnNote[]\",\"name\":\"burnNotes\",\"type\":\"tuple[]\"}],\"internalType\":\"struct CAPE.CapeBlock\",\"name\":\"newBlock\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"submitCapeBlockWithMemos\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"nRoots\":\"number of the most recent roots of the records merkle tree to be stored\",\"verifierAddr\":\"address of the Plonk Verifier contract\"}},\"depositErc20((uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256),address)\":{\"params\":{\"erc20Address\":\"address of the ERC-20 token corresponding to the deposit\",\"ro\":\"record opening that will be inserted in the records merkle tree once the deposit is validated\"}},\"faucetSetupForTestnet((uint256,uint256),bytes32)\":{\"params\":{\"faucetManagerAddress\":\"address of public key of faucet manager for CAP native token (testnet only!)\",\"faucetManagerEncKey\":\"public key of faucet manager for CAP native token (testnet only!)\"}},\"isCapeAssetRegistered((uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))\":{\"params\":{\"assetDefinition\":\"an asset definition\"},\"returns\":{\"_0\":\"True if the asset type is registered, false otherwise.\"}},\"lookup((uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))\":{\"params\":{\"assetDefinition\":\"an asset definition\"},\"returns\":{\"_0\":\"An ERC-20 address\"}},\"sponsorCapeAsset(address,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))\":{\"params\":{\"erc20Address\":\"An ERC-20 token address\",\"newAsset\":\"An asset type to be registered in the contract\"}},\"submitCapeBlock(((uint256,uint256),uint8[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes))[],(uint256,uint256,uint256,uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,(uint256,uint256)))[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint128,(uint256,uint256)))[],((uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes)),(uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256))[]))\":{\"details\":\"Transactions are validated and the blockchain state is updated. Moreover *BURN* transactions trigger the unwrapping of cape asset records into erc20 tokens.\",\"params\":{\"newBlock\":\"block to be processed by the CAPE contract.\"}},\"submitCapeBlockWithMemos(((uint256,uint256),uint8[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes))[],(uint256,uint256,uint256,uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,(uint256,uint256)))[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint128,(uint256,uint256)))[],((uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes)),(uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256))[]),bytes)\":{\"params\":{\"\":\"{bytes} extraData data to be stored in calldata; this data is ignored by the contract function\",\"newBlock\":\"block to be processed by the CAPE contract\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"CAPE contract constructor method.\"},\"depositErc20((uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256),address)\":{\"notice\":\"Wraps ERC-20 tokens into a CAPE asset defined in the record opening.\"},\"faucetSetupForTestnet((uint256,uint256),bytes32)\":{\"notice\":\"Allocate native token faucet to a manager. For testnet only.\"},\"isCapeAssetRegistered((uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))\":{\"notice\":\"Is the given asset definition registered?\"},\"lookup((uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))\":{\"notice\":\"Fetch the ERC-20 token address corresponding to the given asset definition.\"},\"nativeDomesticAsset()\":{\"notice\":\"Return the CAP-native asset definition.\"},\"sponsorCapeAsset(address,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))\":{\"notice\":\"Create and register a new asset type associated with an ERC-20 token. Will revert if the asset type is already registered or the ERC-20 token address is zero.\"},\"submitCapeBlock(((uint256,uint256),uint8[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes))[],(uint256,uint256,uint256,uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,(uint256,uint256)))[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint128,(uint256,uint256)))[],((uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes)),(uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256))[]))\":{\"notice\":\"Submit a new block to the CAPE contract.\"},\"submitCapeBlockWithMemos(((uint256,uint256),uint8[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes))[],(uint256,uint256,uint256,uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,(uint256,uint256)))[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint128,(uint256,uint256)))[],((uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes)),(uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256))[]),bytes)\":{\"notice\":\"Submit a new block with extra data to the CAPE contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/CAPE.sol\":\"CAPE\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and make it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x842ccf9a6cd33e17b7acef8372ca42090755217b358fe0c44c98e951ea549d3a\",\"license\":\"MIT\"},\"@rari-capital/solmate/src/tokens/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)\\n/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\\n/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\\nabstract contract ERC20 {\\n /*///////////////////////////////////////////////////////////////\\n EVENTS\\n //////////////////////////////////////////////////////////////*/\\n\\n event Transfer(address indexed from, address indexed to, uint256 amount);\\n\\n event Approval(address indexed owner, address indexed spender, uint256 amount);\\n\\n /*///////////////////////////////////////////////////////////////\\n METADATA STORAGE\\n //////////////////////////////////////////////////////////////*/\\n\\n string public name;\\n\\n string public symbol;\\n\\n uint8 public immutable decimals;\\n\\n /*///////////////////////////////////////////////////////////////\\n ERC20 STORAGE\\n //////////////////////////////////////////////////////////////*/\\n\\n uint256 public totalSupply;\\n\\n mapping(address => uint256) public balanceOf;\\n\\n mapping(address => mapping(address => uint256)) public allowance;\\n\\n /*///////////////////////////////////////////////////////////////\\n EIP-2612 STORAGE\\n //////////////////////////////////////////////////////////////*/\\n\\n bytes32 public constant PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n uint256 internal immutable INITIAL_CHAIN_ID;\\n\\n bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;\\n\\n mapping(address => uint256) public nonces;\\n\\n /*///////////////////////////////////////////////////////////////\\n CONSTRUCTOR\\n //////////////////////////////////////////////////////////////*/\\n\\n constructor(\\n string memory _name,\\n string memory _symbol,\\n uint8 _decimals\\n ) {\\n name = _name;\\n symbol = _symbol;\\n decimals = _decimals;\\n\\n INITIAL_CHAIN_ID = block.chainid;\\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n ERC20 LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function approve(address spender, uint256 amount) public virtual returns (bool) {\\n allowance[msg.sender][spender] = amount;\\n\\n emit Approval(msg.sender, spender, amount);\\n\\n return true;\\n }\\n\\n function transfer(address to, uint256 amount) public virtual returns (bool) {\\n balanceOf[msg.sender] -= amount;\\n\\n // Cannot overflow because the sum of all user\\n // balances can't exceed the max uint256 value.\\n unchecked {\\n balanceOf[to] += amount;\\n }\\n\\n emit Transfer(msg.sender, to, amount);\\n\\n return true;\\n }\\n\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual returns (bool) {\\n uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.\\n\\n if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;\\n\\n balanceOf[from] -= amount;\\n\\n // Cannot overflow because the sum of all user\\n // balances can't exceed the max uint256 value.\\n unchecked {\\n balanceOf[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n return true;\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n EIP-2612 LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n require(deadline >= block.timestamp, \\\"PERMIT_DEADLINE_EXPIRED\\\");\\n\\n // Unchecked because the only math done is incrementing\\n // the owner's nonce which cannot realistically overflow.\\n unchecked {\\n bytes32 digest = keccak256(\\n abi.encodePacked(\\n \\\"\\\\x19\\\\x01\\\",\\n DOMAIN_SEPARATOR(),\\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\\n )\\n );\\n\\n address recoveredAddress = ecrecover(digest, v, r, s);\\n\\n require(recoveredAddress != address(0) && recoveredAddress == owner, \\\"INVALID_SIGNER\\\");\\n\\n allowance[recoveredAddress][spender] = value;\\n }\\n\\n emit Approval(owner, spender, value);\\n }\\n\\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\\n return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\\n }\\n\\n function computeDomainSeparator() internal view virtual returns (bytes32) {\\n return\\n keccak256(\\n abi.encode(\\n keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n keccak256(bytes(name)),\\n keccak256(\\\"1\\\"),\\n block.chainid,\\n address(this)\\n )\\n );\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n INTERNAL MINT/BURN LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function _mint(address to, uint256 amount) internal virtual {\\n totalSupply += amount;\\n\\n // Cannot overflow because the sum of all user\\n // balances can't exceed the max uint256 value.\\n unchecked {\\n balanceOf[to] += amount;\\n }\\n\\n emit Transfer(address(0), to, amount);\\n }\\n\\n function _burn(address from, uint256 amount) internal virtual {\\n balanceOf[from] -= amount;\\n\\n // Cannot underflow because a user's balance\\n // will never be larger than the total supply.\\n unchecked {\\n totalSupply -= amount;\\n }\\n\\n emit Transfer(from, address(0), amount);\\n }\\n}\\n\",\"keccak256\":\"0x698cdbf614109fafc2bf00057b60715fa3aba9dad447c42f4f8b749ae16ce84f\",\"license\":\"AGPL-3.0-only\"},\"@rari-capital/solmate/src/utils/SafeTransferLib.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\nimport {ERC20} from \\\"../tokens/ERC20.sol\\\";\\n\\n/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)\\n/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)\\n/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.\\nlibrary SafeTransferLib {\\n /*///////////////////////////////////////////////////////////////\\n ETH OPERATIONS\\n //////////////////////////////////////////////////////////////*/\\n\\n function safeTransferETH(address to, uint256 amount) internal {\\n bool callStatus;\\n\\n assembly {\\n // Transfer the ETH and store if it succeeded or not.\\n callStatus := call(gas(), to, amount, 0, 0, 0, 0)\\n }\\n\\n require(callStatus, \\\"ETH_TRANSFER_FAILED\\\");\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n ERC20 OPERATIONS\\n //////////////////////////////////////////////////////////////*/\\n\\n function safeTransferFrom(\\n ERC20 token,\\n address from,\\n address to,\\n uint256 amount\\n ) internal {\\n bool callStatus;\\n\\n assembly {\\n // Get a pointer to some free memory.\\n let freeMemoryPointer := mload(0x40)\\n\\n // Write the abi-encoded calldata to memory piece by piece:\\n mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\\n mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \\\"from\\\" argument.\\n mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \\\"to\\\" argument.\\n mstore(add(freeMemoryPointer, 68), amount) // Finally append the \\\"amount\\\" argument. No mask as it's a full 32 byte value.\\n\\n // Call the token and store if it succeeded or not.\\n // We use 100 because the calldata length is 4 + 32 * 3.\\n callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)\\n }\\n\\n require(didLastOptionalReturnCallSucceed(callStatus), \\\"TRANSFER_FROM_FAILED\\\");\\n }\\n\\n function safeTransfer(\\n ERC20 token,\\n address to,\\n uint256 amount\\n ) internal {\\n bool callStatus;\\n\\n assembly {\\n // Get a pointer to some free memory.\\n let freeMemoryPointer := mload(0x40)\\n\\n // Write the abi-encoded calldata to memory piece by piece:\\n mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\\n mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \\\"to\\\" argument.\\n mstore(add(freeMemoryPointer, 36), amount) // Finally append the \\\"amount\\\" argument. No mask as it's a full 32 byte value.\\n\\n // Call the token and store if it succeeded or not.\\n // We use 68 because the calldata length is 4 + 32 * 2.\\n callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)\\n }\\n\\n require(didLastOptionalReturnCallSucceed(callStatus), \\\"TRANSFER_FAILED\\\");\\n }\\n\\n function safeApprove(\\n ERC20 token,\\n address to,\\n uint256 amount\\n ) internal {\\n bool callStatus;\\n\\n assembly {\\n // Get a pointer to some free memory.\\n let freeMemoryPointer := mload(0x40)\\n\\n // Write the abi-encoded calldata to memory piece by piece:\\n mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\\n mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \\\"to\\\" argument.\\n mstore(add(freeMemoryPointer, 36), amount) // Finally append the \\\"amount\\\" argument. No mask as it's a full 32 byte value.\\n\\n // Call the token and store if it succeeded or not.\\n // We use 68 because the calldata length is 4 + 32 * 2.\\n callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)\\n }\\n\\n require(didLastOptionalReturnCallSucceed(callStatus), \\\"APPROVE_FAILED\\\");\\n }\\n\\n /*///////////////////////////////////////////////////////////////\\n INTERNAL HELPER LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {\\n assembly {\\n // Get how many bytes the call returned.\\n let returnDataSize := returndatasize()\\n\\n // If the call reverted:\\n if iszero(callStatus) {\\n // Copy the revert message into memory.\\n returndatacopy(0, 0, returnDataSize)\\n\\n // Revert with the same message.\\n revert(0, returnDataSize)\\n }\\n\\n switch returnDataSize\\n case 32 {\\n // Copy the return data into memory.\\n returndatacopy(0, 0, returnDataSize)\\n\\n // Set success to whether it returned true.\\n success := iszero(iszero(mload(0)))\\n }\\n case 0 {\\n // There was no return data.\\n success := 1\\n }\\n default {\\n // It returned some malformed input.\\n success := 0\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcc39d0f5693925ea1e8c517f7cc24211a9899c83a57e62d806180cdb056b6b75\",\"license\":\"AGPL-3.0-only\"},\"contracts/AssetRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./libraries/BN254.sol\\\";\\nimport \\\"./libraries/EdOnBN254.sol\\\";\\n\\ncontract AssetRegistry {\\n bytes13 public constant DOM_SEP_FOREIGN_ASSET = \\\"FOREIGN_ASSET\\\";\\n bytes14 public constant DOM_SEP_DOMESTIC_ASSET = \\\"DOMESTIC_ASSET\\\";\\n uint256 public constant CAP_NATIVE_ASSET_CODE = 1;\\n\\n event AssetSponsored(address erc20Address, uint256 assetDefinitionCode);\\n\\n mapping(bytes32 => address) public assets;\\n\\n struct AssetDefinition {\\n uint256 code;\\n AssetPolicy policy;\\n }\\n\\n struct AssetPolicy {\\n EdOnBN254.EdOnBN254Point auditorPk;\\n EdOnBN254.EdOnBN254Point credPk;\\n EdOnBN254.EdOnBN254Point freezerPk;\\n uint256 revealMap;\\n uint128 revealThreshold;\\n }\\n\\n /// @notice Return the CAP-native asset definition.\\n function nativeDomesticAsset() public pure returns (AssetDefinition memory assetDefinition) {\\n assetDefinition.code = CAP_NATIVE_ASSET_CODE;\\n // affine representation of zero point in arkwork is (0,1)\\n assetDefinition.policy.auditorPk.y = 1;\\n assetDefinition.policy.credPk.y = 1;\\n assetDefinition.policy.freezerPk.y = 1;\\n }\\n\\n /// @notice Fetch the ERC-20 token address corresponding to the\\n /// given asset definition.\\n /// @param assetDefinition an asset definition\\n /// @return An ERC-20 address\\n function lookup(AssetDefinition memory assetDefinition) public view returns (address) {\\n bytes32 key = keccak256(abi.encode(assetDefinition));\\n return assets[key];\\n }\\n\\n /// @notice Is the given asset definition registered?\\n /// @param assetDefinition an asset definition\\n /// @return True if the asset type is registered, false otherwise.\\n function isCapeAssetRegistered(AssetDefinition memory assetDefinition)\\n public\\n view\\n returns (bool)\\n {\\n return lookup(assetDefinition) != address(0);\\n }\\n\\n /// @notice Create and register a new asset type associated with an\\n /// ERC-20 token. Will revert if the asset type is already\\n /// registered or the ERC-20 token address is zero.\\n /// @param erc20Address An ERC-20 token address\\n /// @param newAsset An asset type to be registered in the contract\\n function sponsorCapeAsset(address erc20Address, AssetDefinition memory newAsset) external {\\n require(erc20Address != address(0), \\\"Bad asset address\\\");\\n require(!isCapeAssetRegistered(newAsset), \\\"Asset already registered\\\");\\n\\n _checkForeignAssetCode(newAsset.code, erc20Address, msg.sender, newAsset.policy);\\n\\n bytes32 key = keccak256(abi.encode(newAsset));\\n assets[key] = erc20Address;\\n\\n emit AssetSponsored(erc20Address, newAsset.code);\\n }\\n\\n /// @notice Throws an exception if the asset definition code is\\n /// not correctly derived from the ERC-20 address of the token and\\n /// the address of the sponsor.\\n /// @dev Requires \\\"view\\\" to access msg.sender.\\n /// @param assetDefinitionCode The code of an asset definition\\n /// @param erc20Address The ERC-20 address bound to the asset definition\\n /// @param sponsor The sponsor address of this wrapped asset\\n /// @param policy asset policy\\n function _checkForeignAssetCode(\\n uint256 assetDefinitionCode,\\n address erc20Address,\\n address sponsor,\\n AssetPolicy memory policy\\n ) internal pure {\\n bytes memory description = _computeAssetDescription(erc20Address, sponsor, policy);\\n require(\\n assetDefinitionCode ==\\n BN254.fromLeBytesModOrder(\\n bytes.concat(keccak256(bytes.concat(DOM_SEP_FOREIGN_ASSET, description)))\\n ),\\n \\\"Wrong foreign asset code\\\"\\n );\\n }\\n\\n /// @dev Checks if the asset definition code is correctly derived from the internal asset code.\\n /// @param assetDefinitionCode asset definition code\\n /// @param internalAssetCode internal asset code\\n function _checkDomesticAssetCode(uint256 assetDefinitionCode, uint256 internalAssetCode)\\n internal\\n pure\\n {\\n require(\\n assetDefinitionCode ==\\n BN254.fromLeBytesModOrder(\\n bytes.concat(\\n keccak256(\\n bytes.concat(\\n DOM_SEP_DOMESTIC_ASSET,\\n bytes32(Utils.reverseEndianness(internalAssetCode))\\n )\\n )\\n )\\n ),\\n \\\"Wrong domestic asset code\\\"\\n );\\n }\\n\\n /// @dev Compute the asset description from the address of the\\n /// ERC-20 token and the address of the sponsor.\\n /// @param erc20Address address of the erc20 token\\n /// @param sponsor address of the sponsor\\n /// @param policy asset policy\\n /// @return The asset description\\n function _computeAssetDescription(\\n address erc20Address,\\n address sponsor,\\n AssetPolicy memory policy\\n ) internal pure returns (bytes memory) {\\n return\\n bytes.concat(\\n \\\"EsSCAPE ERC20\\\",\\n bytes20(erc20Address),\\n \\\"sponsored by\\\",\\n bytes20(sponsor),\\n \\\"policy\\\",\\n abi.encode(policy)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x7042798137db4adf2b98463632bee095f632080197bd8a4f3c2d94875956f198\",\"license\":\"GPL-3.0-or-later\"},\"contracts/CAPE.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\n/// @title Configurable Anonymous Payments for Ethereum\\n/// CAPE provides auditable anonymous payments on Ethereum.\\n/// @author Espresso Systems \\n\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\nimport \\\"@rari-capital/solmate/src/utils/SafeTransferLib.sol\\\";\\n\\nimport \\\"solidity-bytes-utils/contracts/BytesLib.sol\\\";\\nimport \\\"./libraries/AccumulatingArray.sol\\\";\\nimport \\\"./libraries/EdOnBN254.sol\\\";\\nimport \\\"./libraries/RescueLib.sol\\\";\\nimport \\\"./libraries/VerifyingKeys.sol\\\";\\nimport \\\"./interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./interfaces/IRecordsMerkleTree.sol\\\";\\nimport \\\"./AssetRegistry.sol\\\";\\nimport \\\"./RootStore.sol\\\";\\n\\ncontract CAPE is RootStore, AssetRegistry, ReentrancyGuard {\\n using AccumulatingArray for AccumulatingArray.Data;\\n\\n mapping(uint256 => bool) public nullifiers;\\n uint64 public blockHeight;\\n IPlonkVerifier private _verifier;\\n IRecordsMerkleTree internal _recordsMerkleTree;\\n uint256[] public pendingDeposits;\\n\\n // NOTE: used for faucet in testnet only, will be removed for mainnet\\n address public deployer;\\n bool public faucetInitialized;\\n\\n bytes public constant CAPE_BURN_MAGIC_BYTES = \\\"EsSCAPE burn\\\";\\n uint256 public constant CAPE_BURN_MAGIC_BYTES_SIZE = 12;\\n // In order to avoid the contract running out of gas if the queue is too large\\n // we set the maximum number of pending deposits record commitments to process\\n // when a new block is submitted. This is a temporary solution.\\n // See https://github.com/EspressoSystems/cape/issues/400\\n uint256 public constant MAX_NUM_PENDING_DEPOSIT = 10;\\n\\n event FaucetInitialized(bytes roBytes);\\n\\n event BlockCommitted(\\n uint64 indexed height,\\n uint256[] depositCommitments,\\n // What follows is a `CapeBlock` struct split up into fields.\\n // This may no longer be necessary once\\n // https://github.com/gakonst/ethers-rs/issues/1220\\n // is fixed.\\n bytes minerAddr,\\n bytes noteTypes,\\n bytes transferNotes,\\n bytes mintNotes,\\n bytes freezeNotes,\\n bytes burnNotes\\n );\\n\\n event Erc20TokensDeposited(bytes roBytes, address erc20TokenAddress, address from);\\n\\n struct AuditMemo {\\n EdOnBN254.EdOnBN254Point ephemeralKey;\\n uint256[] data;\\n }\\n\\n enum NoteType {\\n TRANSFER,\\n MINT,\\n FREEZE,\\n BURN\\n }\\n\\n struct TransferNote {\\n uint256[] inputNullifiers;\\n uint256[] outputCommitments;\\n IPlonkVerifier.PlonkProof proof;\\n AuditMemo auditMemo;\\n TransferAuxInfo auxInfo;\\n }\\n\\n struct BurnNote {\\n TransferNote transferNote;\\n RecordOpening recordOpening;\\n }\\n\\n struct MintNote {\\n /// nullifier for the input (i.e. transaction fee record)\\n uint256 inputNullifier;\\n /// output commitment for the fee change\\n uint256 chgComm;\\n /// output commitment for the minted asset\\n uint256 mintComm;\\n /// the amount of the minted asset\\n uint128 mintAmount;\\n /// the asset definition of the asset\\n AssetDefinition mintAssetDef;\\n /// Internal asset code\\n uint256 mintInternalAssetCode;\\n /// the validity proof of this note\\n IPlonkVerifier.PlonkProof proof;\\n /// memo for policy compliance specified for the designated auditor\\n AuditMemo auditMemo;\\n /// auxiliary information\\n MintAuxInfo auxInfo;\\n }\\n\\n struct FreezeNote {\\n uint256[] inputNullifiers;\\n uint256[] outputCommitments;\\n IPlonkVerifier.PlonkProof proof;\\n FreezeAuxInfo auxInfo;\\n }\\n\\n struct TransferAuxInfo {\\n uint256 merkleRoot;\\n uint128 fee;\\n uint64 validUntil;\\n EdOnBN254.EdOnBN254Point txnMemoVerKey;\\n bytes extraProofBoundData;\\n }\\n\\n struct MintAuxInfo {\\n uint256 merkleRoot;\\n uint128 fee;\\n EdOnBN254.EdOnBN254Point txnMemoVerKey;\\n }\\n\\n struct FreezeAuxInfo {\\n uint256 merkleRoot;\\n uint128 fee;\\n EdOnBN254.EdOnBN254Point txnMemoVerKey;\\n }\\n\\n struct RecordOpening {\\n uint128 amount;\\n AssetDefinition assetDef;\\n EdOnBN254.EdOnBN254Point userAddr;\\n bytes32 encKey;\\n bool freezeFlag;\\n uint256 blind;\\n }\\n\\n struct CapeBlock {\\n EdOnBN254.EdOnBN254Point minerAddr;\\n NoteType[] noteTypes;\\n TransferNote[] transferNotes;\\n MintNote[] mintNotes;\\n FreezeNote[] freezeNotes;\\n BurnNote[] burnNotes;\\n }\\n\\n /// @notice CAPE contract constructor method.\\n /// @param nRoots number of the most recent roots of the records merkle tree to be stored\\n /// @param verifierAddr address of the Plonk Verifier contract\\n constructor(\\n uint64 nRoots,\\n address verifierAddr,\\n address recordsMerkleTreeAddr\\n ) RootStore(nRoots) {\\n _verifier = IPlonkVerifier(verifierAddr);\\n _recordsMerkleTree = IRecordsMerkleTree(recordsMerkleTreeAddr);\\n\\n // NOTE: used for faucet in testnet only, will be removed for mainnet\\n deployer = msg.sender;\\n }\\n\\n /// @notice Allocate native token faucet to a manager. For testnet only.\\n /// @param faucetManagerAddress address of public key of faucet manager for CAP native token (testnet only!)\\n /// @param faucetManagerEncKey public key of faucet manager for CAP native token (testnet only!)\\n function faucetSetupForTestnet(\\n EdOnBN254.EdOnBN254Point memory faucetManagerAddress,\\n bytes32 faucetManagerEncKey\\n ) external {\\n // faucet can only be set up once by the manager\\n require(msg.sender == deployer, \\\"Only invocable by deployer\\\");\\n require(!faucetInitialized, \\\"Faucet already set up\\\");\\n\\n // allocate maximum possible amount of native CAP token to faucet manager on testnet\\n // max amount len is set to 63 bits: https://github.com/EspressoSystems/cap/blob/main/src/constants.rs#L50-L51\\n RecordOpening memory ro = RecordOpening(\\n type(uint128).max / 2,\\n nativeDomesticAsset(),\\n faucetManagerAddress,\\n faucetManagerEncKey,\\n false,\\n 0 // arbitrary blind factor\\n );\\n uint256[] memory recordCommitments = new uint256[](1);\\n recordCommitments[0] = _deriveRecordCommitment(ro);\\n\\n // Insert the record into record accumulator.\\n //\\n // This is a call to our own contract, not an arbitrary external contract.\\n // slither-disable-next-line reentrancy-no-eth\\n _recordsMerkleTree.updateRecordsMerkleTree(recordCommitments);\\n // slither-disable-next-line reentrancy-benign\\n _addRoot(_recordsMerkleTree.getRootValue());\\n\\n // slither-disable-next-line reentrancy-events\\n emit FaucetInitialized(abi.encode(ro));\\n faucetInitialized = true;\\n }\\n\\n /// @notice Publish an array of nullifiers.\\n /// @dev Requires all nullifiers to be unique and unpublished.\\n /// @dev A block creator must not submit notes with duplicate nullifiers.\\n /// @param newNullifiers list of nullifiers to publish\\n function _publish(uint256[] memory newNullifiers) internal {\\n for (uint256 j = 0; j < newNullifiers.length; j++) {\\n _publish(newNullifiers[j]);\\n }\\n }\\n\\n /// @notice Publish a nullifier if it hasn't been published before.\\n /// @dev Reverts if the nullifier is already published.\\n /// @param nullifier nullifier to publish\\n function _publish(uint256 nullifier) internal {\\n require(!nullifiers[nullifier], \\\"Nullifier already published\\\");\\n nullifiers[nullifier] = true;\\n }\\n\\n /// @notice Wraps ERC-20 tokens into a CAPE asset defined in the record opening.\\n /// @param ro record opening that will be inserted in the records merkle tree once the deposit is validated\\n /// @param erc20Address address of the ERC-20 token corresponding to the deposit\\n function depositErc20(RecordOpening memory ro, address erc20Address) external nonReentrant {\\n require(isCapeAssetRegistered(ro.assetDef), \\\"Asset definition not registered\\\");\\n require(lookup(ro.assetDef) == erc20Address, \\\"Wrong ERC20 address\\\");\\n\\n // We skip the sanity checks mentioned in the rust specification as they are optional.\\n if (pendingDeposits.length >= MAX_NUM_PENDING_DEPOSIT) {\\n revert(\\\"Pending deposits queue is full\\\");\\n }\\n pendingDeposits.push(_deriveRecordCommitment(ro));\\n\\n SafeTransferLib.safeTransferFrom(\\n ERC20(erc20Address),\\n msg.sender,\\n address(this),\\n ro.amount\\n );\\n\\n emit Erc20TokensDeposited(abi.encode(ro), erc20Address, msg.sender);\\n }\\n\\n /// @notice Submit a new block with extra data to the CAPE contract.\\n /// @param newBlock block to be processed by the CAPE contract\\n /// @param {bytes} extraData data to be stored in calldata; this data is ignored by the contract function\\n function submitCapeBlockWithMemos(\\n CapeBlock memory newBlock,\\n bytes calldata /* extraData */\\n ) external {\\n submitCapeBlock(newBlock);\\n }\\n\\n /// @notice Submit a new block to the CAPE contract.\\n /// @dev Transactions are validated and the blockchain state is updated. Moreover *BURN* transactions trigger the unwrapping of cape asset records into erc20 tokens.\\n /// @param newBlock block to be processed by the CAPE contract.\\n function submitCapeBlock(CapeBlock memory newBlock) public nonReentrant {\\n AccumulatingArray.Data memory commitments = AccumulatingArray.create(\\n _computeNumCommitments(newBlock) + pendingDeposits.length\\n );\\n\\n uint256 numNotes = newBlock.noteTypes.length;\\n\\n // Batch verify plonk proofs\\n IPlonkVerifier.VerifyingKey[] memory vks = new IPlonkVerifier.VerifyingKey[](numNotes);\\n uint256[][] memory publicInputs = new uint256[][](numNotes);\\n IPlonkVerifier.PlonkProof[] memory proofs = new IPlonkVerifier.PlonkProof[](numNotes);\\n bytes[] memory extraMsgs = new bytes[](numNotes);\\n\\n // Preserve the ordering of the (sub) arrays of notes.\\n uint256 transferIdx = 0;\\n uint256 mintIdx = 0;\\n uint256 freezeIdx = 0;\\n uint256 burnIdx = 0;\\n\\n // We require either the block or the pending deposits queue to be non empty. That is we expect the block submission to trigger some change in the blockchain state.\\n // The reason is that, due to race conditions, it is possible to have the relayer send an empty block while the pending deposits queue is still empty.\\n // If we do not reject the block, the `blockHeight` contract variable will be incremented, yet the set of records merkle tree roots will be unchanged.\\n // On the other side, the wallet assumes that the blockHeight is equal to the number of roots and thus, in the case of a block submission that only increments `blockHeight`,\\n // the wallet and the contract states become inconsistent.\\n require(!((numNotes == 0) && (pendingDeposits.length == 0)), \\\"Block must be non-empty\\\");\\n\\n for (uint256 i = 0; i < numNotes; i++) {\\n NoteType noteType = newBlock.noteTypes[i];\\n\\n if (noteType == NoteType.TRANSFER) {\\n TransferNote memory note = newBlock.transferNotes[transferIdx];\\n transferIdx += 1;\\n\\n _checkContainsRoot(note.auxInfo.merkleRoot);\\n _checkTransfer(note);\\n require(!_isExpired(note), \\\"Expired note\\\");\\n\\n _publish(note.inputNullifiers);\\n\\n commitments.add(note.outputCommitments);\\n\\n (vks[i], publicInputs[i], proofs[i], extraMsgs[i]) = _prepareForProofVerification(\\n note\\n );\\n } else if (noteType == NoteType.MINT) {\\n MintNote memory note = newBlock.mintNotes[mintIdx];\\n mintIdx += 1;\\n\\n _checkContainsRoot(note.auxInfo.merkleRoot);\\n _checkDomesticAssetCode(note.mintAssetDef.code, note.mintInternalAssetCode);\\n\\n _publish(note.inputNullifier);\\n\\n commitments.add(note.chgComm);\\n commitments.add(note.mintComm);\\n\\n (vks[i], publicInputs[i], proofs[i], extraMsgs[i]) = _prepareForProofVerification(\\n note\\n );\\n } else if (noteType == NoteType.FREEZE) {\\n FreezeNote memory note = newBlock.freezeNotes[freezeIdx];\\n freezeIdx += 1;\\n\\n _checkContainsRoot(note.auxInfo.merkleRoot);\\n\\n _publish(note.inputNullifiers);\\n\\n commitments.add(note.outputCommitments);\\n\\n (vks[i], publicInputs[i], proofs[i], extraMsgs[i]) = _prepareForProofVerification(\\n note\\n );\\n } else if (noteType == NoteType.BURN) {\\n BurnNote memory note = newBlock.burnNotes[burnIdx];\\n burnIdx += 1;\\n\\n _checkContainsRoot(note.transferNote.auxInfo.merkleRoot);\\n _checkBurn(note);\\n\\n _publish(note.transferNote.inputNullifiers);\\n\\n // Insert all the output commitments to the records merkle tree except from the second one (corresponding to the burned output)\\n for (uint256 j = 0; j < note.transferNote.outputCommitments.length; j++) {\\n if (j != 1) {\\n commitments.add(note.transferNote.outputCommitments[j]);\\n }\\n }\\n\\n (vks[i], publicInputs[i], proofs[i], extraMsgs[i]) = _prepareForProofVerification(\\n note\\n );\\n\\n // Send the tokens\\n _handleWithdrawal(note);\\n } else {\\n revert(\\\"Cape: unreachable!\\\");\\n }\\n }\\n\\n // Skip the batch plonk verification if the block is empty\\n if (numNotes > 0) {\\n require(\\n _verifier.batchVerify(vks, publicInputs, proofs, extraMsgs),\\n \\\"Cape: batch verify failed.\\\"\\n );\\n }\\n\\n // Process the pending deposits obtained after calling `depositErc20`\\n for (uint256 i = 0; i < pendingDeposits.length; i++) {\\n commitments.add(pendingDeposits[i]);\\n }\\n\\n // Only update the merkle tree and add the root if the list of records commitments is non empty\\n if (!commitments.isEmpty()) {\\n // This is a call to our own contract, not an arbitrary external contract.\\n // slither-disable-next-line reentrancy-no-eth\\n _recordsMerkleTree.updateRecordsMerkleTree(commitments.items);\\n // slither-disable-next-line reentrancy-benign\\n _addRoot(_recordsMerkleTree.getRootValue());\\n }\\n\\n // In all cases (the block is empty or not), the height is incremented.\\n blockHeight += 1;\\n\\n // Inform clients about the new block and the processed deposits.\\n // slither-disable-next-line reentrancy-events\\n _emitBlockEvent(newBlock);\\n\\n // Empty the queue now that the record commitments have been inserted\\n delete pendingDeposits;\\n }\\n\\n /// @notice This function only exists to avoid a stack too deep compilation error.\\n function _emitBlockEvent(CapeBlock memory newBlock) internal {\\n emit BlockCommitted(\\n blockHeight,\\n pendingDeposits,\\n abi.encode(newBlock.minerAddr),\\n abi.encode(newBlock.noteTypes),\\n abi.encode(newBlock.transferNotes),\\n abi.encode(newBlock.mintNotes),\\n abi.encode(newBlock.freezeNotes),\\n abi.encode(newBlock.burnNotes)\\n );\\n }\\n\\n /// @dev send the ERC-20 tokens equivalent to the asset records being burnt. Recall that the burned record opening is contained inside the note.\\n /// @param note note of type *BURN*\\n function _handleWithdrawal(BurnNote memory note) internal {\\n address ercTokenAddress = lookup(note.recordOpening.assetDef);\\n\\n // Extract recipient address\\n address recipientAddress = BytesLib.toAddress(\\n note.transferNote.auxInfo.extraProofBoundData,\\n CAPE_BURN_MAGIC_BYTES_SIZE\\n );\\n SafeTransferLib.safeTransfer(\\n ERC20(ercTokenAddress),\\n recipientAddress,\\n note.recordOpening.amount\\n );\\n }\\n\\n /// @dev Compute an upper bound on the number of records to be inserted\\n function _computeNumCommitments(CapeBlock memory newBlock) internal pure returns (uint256) {\\n // MintNote always has 2 commitments: mint_comm, chg_comm\\n uint256 numComms = 2 * newBlock.mintNotes.length;\\n for (uint256 i = 0; i < newBlock.transferNotes.length; i++) {\\n numComms += newBlock.transferNotes[i].outputCommitments.length;\\n }\\n for (uint256 i = 0; i < newBlock.burnNotes.length; i++) {\\n // Subtract one for the burn record commitment that is not inserted.\\n // The function _containsBurnRecord checks that there are at least 2 output commitments.\\n numComms += newBlock.burnNotes[i].transferNote.outputCommitments.length - 1;\\n }\\n for (uint256 i = 0; i < newBlock.freezeNotes.length; i++) {\\n numComms += newBlock.freezeNotes[i].outputCommitments.length;\\n }\\n return numComms;\\n }\\n\\n /// @dev Verify if a note is of type *TRANSFER*.\\n /// @param note note which could be of type *TRANSFER* or *BURN*\\n function _checkTransfer(TransferNote memory note) internal pure {\\n require(\\n !_containsBurnPrefix(note.auxInfo.extraProofBoundData),\\n \\\"Burn prefix in transfer note\\\"\\n );\\n }\\n\\n /// @dev Check if a note has expired.\\n /// @param note note for which we want to check its timestamp against the current block height\\n function _isExpired(TransferNote memory note) internal view returns (bool) {\\n return note.auxInfo.validUntil < blockHeight;\\n }\\n\\n /// @dev Check if a burn note is well formed.\\n /// @param note note of type *BURN*\\n function _checkBurn(BurnNote memory note) internal view {\\n bytes memory extra = note.transferNote.auxInfo.extraProofBoundData;\\n require(_containsBurnPrefix(extra), \\\"Bad burn tag\\\");\\n require(_containsBurnRecord(note), \\\"Bad record commitment\\\");\\n }\\n\\n /// @dev Checks if a sequence of bytes contains hardcoded prefix.\\n /// @param byteSeq sequence of bytes\\n function _containsBurnPrefix(bytes memory byteSeq) internal pure returns (bool) {\\n if (byteSeq.length < CAPE_BURN_MAGIC_BYTES_SIZE) {\\n return false;\\n }\\n return\\n BytesLib.equal(\\n BytesLib.slice(byteSeq, 0, CAPE_BURN_MAGIC_BYTES_SIZE),\\n CAPE_BURN_MAGIC_BYTES\\n );\\n }\\n\\n /// @dev Check if the burned record opening and the record commitment in position 1 are consistent.\\n /// @param note note of type *BURN*\\n function _containsBurnRecord(BurnNote memory note) internal view returns (bool) {\\n if (note.transferNote.outputCommitments.length < 2) {\\n return false;\\n }\\n uint256 rc = _deriveRecordCommitment(note.recordOpening);\\n return rc == note.transferNote.outputCommitments[1];\\n }\\n\\n /// @dev Compute the commitment of a record opening.\\n /// @param ro record opening\\n function _deriveRecordCommitment(RecordOpening memory ro) internal view returns (uint256 rc) {\\n require(ro.assetDef.policy.revealMap < 2**12, \\\"Reveal map exceeds 12 bits\\\");\\n\\n // No overflow check, only 12 bits in reveal map\\n uint256 revealMapAndFreezeFlag = 2 *\\n ro.assetDef.policy.revealMap +\\n (ro.freezeFlag ? 1 : 0);\\n\\n // blind in front of rest -> 13 elements, pad to 15 (5 x 3)\\n uint256[15] memory inputs = [\\n ro.blind,\\n ro.amount,\\n ro.assetDef.code,\\n ro.userAddr.x,\\n ro.userAddr.y,\\n ro.assetDef.policy.auditorPk.x,\\n ro.assetDef.policy.auditorPk.y,\\n ro.assetDef.policy.credPk.x,\\n ro.assetDef.policy.credPk.y,\\n ro.assetDef.policy.freezerPk.x,\\n ro.assetDef.policy.freezerPk.y,\\n revealMapAndFreezeFlag,\\n ro.assetDef.policy.revealThreshold,\\n 0,\\n 0\\n ];\\n\\n return RescueLib.commit(inputs);\\n }\\n\\n /// @dev An overloaded function (one for each note type) to prepare all inputs necessary for batch verification of the plonk proof.\\n /// @param note note of type *TRANSFER*\\n function _prepareForProofVerification(TransferNote memory note)\\n internal\\n view\\n returns (\\n IPlonkVerifier.VerifyingKey memory vk,\\n uint256[] memory publicInput,\\n IPlonkVerifier.PlonkProof memory proof,\\n bytes memory transcriptInitMsg\\n )\\n {\\n // load the correct (hardcoded) vk\\n // slither-disable-next-line calls-loop\\n vk = VerifyingKeys.getVkById(\\n VerifyingKeys.getEncodedId(\\n uint8(NoteType.TRANSFER),\\n uint8(note.inputNullifiers.length),\\n uint8(note.outputCommitments.length),\\n uint8(_recordsMerkleTree.getHeight())\\n )\\n );\\n // prepare public inputs\\n // 4: root, native_asset_code, valid_until, fee\\n // 2: audit_memo.ephemeral_key (x and y)\\n publicInput = new uint256[](\\n 4 +\\n note.inputNullifiers.length +\\n note.outputCommitments.length +\\n 2 +\\n note.auditMemo.data.length\\n );\\n publicInput[0] = note.auxInfo.merkleRoot;\\n publicInput[1] = CAP_NATIVE_ASSET_CODE;\\n publicInput[2] = note.auxInfo.validUntil;\\n publicInput[3] = note.auxInfo.fee;\\n {\\n uint256 idx = 4;\\n for (uint256 i = 0; i < note.inputNullifiers.length; i++) {\\n publicInput[idx + i] = note.inputNullifiers[i];\\n }\\n idx += note.inputNullifiers.length;\\n\\n for (uint256 i = 0; i < note.outputCommitments.length; i++) {\\n publicInput[idx + i] = note.outputCommitments[i];\\n }\\n idx += note.outputCommitments.length;\\n\\n publicInput[idx] = note.auditMemo.ephemeralKey.x;\\n publicInput[idx + 1] = note.auditMemo.ephemeralKey.y;\\n idx += 2;\\n\\n for (uint256 i = 0; i < note.auditMemo.data.length; i++) {\\n publicInput[idx + i] = note.auditMemo.data[i];\\n }\\n }\\n\\n // extract out proof\\n proof = note.proof;\\n\\n // prepare transcript init messages\\n transcriptInitMsg = abi.encodePacked(\\n EdOnBN254.serialize(note.auxInfo.txnMemoVerKey),\\n note.auxInfo.extraProofBoundData\\n );\\n }\\n\\n /// @dev An overloaded function (one for each note type) to prepare all inputs necessary for batch verification of the plonk proof.\\n /// @param note note of type *BURN*\\n function _prepareForProofVerification(BurnNote memory note)\\n internal\\n view\\n returns (\\n IPlonkVerifier.VerifyingKey memory,\\n uint256[] memory,\\n IPlonkVerifier.PlonkProof memory,\\n bytes memory\\n )\\n {\\n return _prepareForProofVerification(note.transferNote);\\n }\\n\\n /// @dev An overloaded function (one for each note type) to prepare all inputs necessary for batch verification of the plonk proof.\\n /// @param note note of type *MINT*\\n function _prepareForProofVerification(MintNote memory note)\\n internal\\n view\\n returns (\\n IPlonkVerifier.VerifyingKey memory vk,\\n uint256[] memory publicInput,\\n IPlonkVerifier.PlonkProof memory proof,\\n bytes memory transcriptInitMsg\\n )\\n {\\n // load the correct (hardcoded) vk\\n // slither-disable-next-line calls-loop\\n vk = VerifyingKeys.getVkById(\\n VerifyingKeys.getEncodedId(\\n uint8(NoteType.MINT),\\n 1, // num of input\\n 2, // num of output\\n uint8(_recordsMerkleTree.getHeight())\\n )\\n );\\n\\n // prepare public inputs\\n // 9: see below; 8: asset policy; rest: audit memo\\n publicInput = new uint256[](9 + 8 + 2 + note.auditMemo.data.length);\\n publicInput[0] = note.auxInfo.merkleRoot;\\n publicInput[1] = CAP_NATIVE_ASSET_CODE;\\n publicInput[2] = note.inputNullifier;\\n publicInput[3] = note.auxInfo.fee;\\n publicInput[4] = note.mintComm;\\n publicInput[5] = note.chgComm;\\n publicInput[6] = note.mintAmount;\\n publicInput[7] = note.mintAssetDef.code;\\n publicInput[8] = note.mintInternalAssetCode;\\n\\n publicInput[9] = note.mintAssetDef.policy.revealMap;\\n publicInput[10] = note.mintAssetDef.policy.auditorPk.x;\\n publicInput[11] = note.mintAssetDef.policy.auditorPk.y;\\n publicInput[12] = note.mintAssetDef.policy.credPk.x;\\n publicInput[13] = note.mintAssetDef.policy.credPk.y;\\n publicInput[14] = note.mintAssetDef.policy.freezerPk.x;\\n publicInput[15] = note.mintAssetDef.policy.freezerPk.y;\\n publicInput[16] = note.mintAssetDef.policy.revealThreshold;\\n\\n {\\n publicInput[17] = note.auditMemo.ephemeralKey.x;\\n publicInput[18] = note.auditMemo.ephemeralKey.y;\\n\\n uint256 idx = 19;\\n for (uint256 i = 0; i < note.auditMemo.data.length; i++) {\\n publicInput[idx + i] = note.auditMemo.data[i];\\n }\\n }\\n\\n // extract out proof\\n proof = note.proof;\\n\\n // prepare transcript init messages\\n transcriptInitMsg = EdOnBN254.serialize(note.auxInfo.txnMemoVerKey);\\n }\\n\\n /// @dev An overloaded function (one for each note type) to prepare all inputs necessary for batch verification of the plonk proof.\\n /// @param note note of type *FREEZE*\\n function _prepareForProofVerification(FreezeNote memory note)\\n internal\\n view\\n returns (\\n IPlonkVerifier.VerifyingKey memory vk,\\n uint256[] memory publicInput,\\n IPlonkVerifier.PlonkProof memory proof,\\n bytes memory transcriptInitMsg\\n )\\n {\\n // load the correct (hardcoded) vk\\n // slither-disable-next-line calls-loop\\n vk = VerifyingKeys.getVkById(\\n VerifyingKeys.getEncodedId(\\n uint8(NoteType.FREEZE),\\n uint8(note.inputNullifiers.length),\\n uint8(note.outputCommitments.length),\\n uint8(_recordsMerkleTree.getHeight())\\n )\\n );\\n\\n // prepare public inputs\\n publicInput = new uint256[](\\n 3 + note.inputNullifiers.length + note.outputCommitments.length\\n );\\n publicInput[0] = note.auxInfo.merkleRoot;\\n publicInput[1] = CAP_NATIVE_ASSET_CODE;\\n publicInput[2] = note.auxInfo.fee;\\n {\\n uint256 idx = 3;\\n for (uint256 i = 0; i < note.inputNullifiers.length; i++) {\\n publicInput[idx + i] = note.inputNullifiers[i];\\n }\\n idx += note.inputNullifiers.length;\\n\\n for (uint256 i = 0; i < note.outputCommitments.length; i++) {\\n publicInput[idx + i] = note.outputCommitments[i];\\n }\\n }\\n\\n // extract out proof\\n proof = note.proof;\\n\\n // prepare transcript init messages\\n transcriptInitMsg = EdOnBN254.serialize(note.auxInfo.txnMemoVerKey);\\n }\\n\\n function getRootValue() external view returns (uint256) {\\n return _recordsMerkleTree.getRootValue();\\n }\\n}\\n\",\"keccak256\":\"0x02ff982d7c486dc5ea6ff03fe5bfe7f0b23d6af47fe7882f69eb43aa642e70ac\",\"license\":\"GPL-3.0-or-later\"},\"contracts/RootStore.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\ncontract RootStore {\\n uint256[] internal _roots;\\n mapping(uint256 => bool) internal _rootsMap;\\n uint64 internal _writeHead;\\n\\n /// @dev Create a root store.\\n /// @param nRoots The maximum number of roots to store\\n constructor(uint64 nRoots) {\\n // Set up the circular buffer for handling the last N roots\\n require(nRoots > 1, \\\"A least 2 roots required\\\");\\n\\n _roots = new uint256[](nRoots);\\n\\n // Initially all roots are set to zero.\\n // This value is such that no adversary can extend a branch from this root node.\\n // See proposition 2, page 48 of the AT-Spec document EspressoSystems/AT-spec@01f71ce\\n }\\n\\n /// @dev Add a root value. Only keep the latest nRoots ones.\\n /// @param newRoot The value of the new root\\n function _addRoot(uint256 newRoot) internal {\\n require(!_rootsMap[newRoot], \\\"Root already exists\\\");\\n\\n // Ensure the root we will \\\"overwrite\\\" is removed.\\n _rootsMap[_roots[_writeHead]] = false;\\n\\n _roots[_writeHead] = newRoot;\\n _rootsMap[newRoot] = true;\\n\\n _writeHead = (_writeHead + 1) % uint64(_roots.length);\\n }\\n\\n /// @dev Is the root value contained in the store?\\n /// @param root The root value to find\\n /// @return _ True if the root value is in the store, false otherwise\\n function _containsRoot(uint256 root) internal view returns (bool) {\\n return _rootsMap[root];\\n }\\n\\n /// @dev Raise an exception if the root is not present in the store.\\n /// @param root The required root value\\n function _checkContainsRoot(uint256 root) internal view {\\n require(_containsRoot(root), \\\"Root not found\\\");\\n }\\n}\\n\",\"keccak256\":\"0x41570a2d4808373962efc66b1f0576d01ff0b9c716d9b5ac3f2fc38f25cb4129\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IPlonkVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../libraries/BN254.sol\\\";\\n\\ninterface IPlonkVerifier {\\n // Flatten out TurboPlonk proof\\n struct PlonkProof {\\n // the first 5 are 4 inputs and 1 output wire poly commmitments\\n // i.e., batch_proof.wires_poly_comms_vec.iter()\\n // wire0 is 32 bytes which is a pointer to BN254.G1Point\\n BN254.G1Point wire0; // 0x00\\n BN254.G1Point wire1; // 0x20\\n BN254.G1Point wire2; // 0x40\\n BN254.G1Point wire3; // 0x60\\n BN254.G1Point wire4; // 0x80\\n // the next one is the product permutation poly commitment\\n // i.e., batch_proof.prod_perm_poly_comms_vec.iter()\\n BN254.G1Point prodPerm; // 0xA0\\n // the next 5 are split quotient poly commmitments\\n // i.e., batch_proof.split_quot_poly_comms\\n BN254.G1Point split0; // 0xC0\\n BN254.G1Point split1; // 0xE0\\n BN254.G1Point split2; // 0x100\\n BN254.G1Point split3; // 0x120\\n BN254.G1Point split4; // 0x140\\n // witness poly com for aggregated opening at `zeta`\\n // i.e., batch_proof.opening_proof\\n BN254.G1Point zeta; // 0x160\\n // witness poly com for shifted opening at `zeta * \\\\omega`\\n // i.e., batch_proof.shifted_opening_proof\\n BN254.G1Point zetaOmega; // 0x180\\n // wire poly eval at `zeta`\\n uint256 wireEval0; // 0x1A0\\n uint256 wireEval1; // 0x1C0\\n uint256 wireEval2; // 0x1E0\\n uint256 wireEval3; // 0x200\\n uint256 wireEval4; // 0x220\\n // extended permutation (sigma) poly eval at `zeta`\\n // last (sigmaEval4) is saved by Maller Optimization\\n uint256 sigmaEval0; // 0x240\\n uint256 sigmaEval1; // 0x260\\n uint256 sigmaEval2; // 0x280\\n uint256 sigmaEval3; // 0x2A0\\n // product permutation poly eval at `zeta * \\\\omega`\\n uint256 prodPermZetaOmegaEval; // 0x2C0\\n }\\n\\n // The verifying key for Plonk proofs.\\n struct VerifyingKey {\\n uint256 domainSize; // 0x00\\n uint256 numInputs; // 0x20\\n // commitment to extended perm (sigma) poly\\n BN254.G1Point sigma0; // 0x40\\n BN254.G1Point sigma1; // 0x60\\n BN254.G1Point sigma2; // 0x80\\n BN254.G1Point sigma3; // 0xA0\\n BN254.G1Point sigma4; // 0xC0\\n // commitment to selector poly\\n // first 4 are linear combination selector\\n BN254.G1Point q1; // 0xE0\\n BN254.G1Point q2; // 0x100\\n BN254.G1Point q3; // 0x120\\n BN254.G1Point q4; // 0x140\\n // multiplication selector for 1st, 2nd wire\\n BN254.G1Point qM12; // 0x160\\n // multiplication selector for 3rd, 4th wire\\n BN254.G1Point qM34; // 0x180\\n // output selector\\n BN254.G1Point qO; // 0x1A0\\n // constant term selector\\n BN254.G1Point qC; // 0x1C0\\n // rescue selector qH1 * w_ai^5\\n BN254.G1Point qH1; // 0x1E0\\n // rescue selector qH2 * w_bi^5\\n BN254.G1Point qH2; // 0x200\\n // rescue selector qH3 * w_ci^5\\n BN254.G1Point qH3; // 0x220\\n // rescue selector qH4 * w_di^5\\n BN254.G1Point qH4; // 0x240\\n // elliptic curve selector\\n BN254.G1Point qEcc; // 0x260\\n }\\n\\n /// @dev Batch verify multiple TurboPlonk proofs.\\n /// @param verifyingKeys An array of verifying keys\\n /// @param publicInputs A two-dimensional array of public inputs.\\n /// @param proofs An array of Plonk proofs\\n /// @param extraTranscriptInitMsgs An array of bytes from\\n /// transcript initialization messages\\n /// @return _ A boolean that is true for successful verification, false otherwise\\n function batchVerify(\\n VerifyingKey[] memory verifyingKeys,\\n uint256[][] memory publicInputs,\\n PlonkProof[] memory proofs,\\n bytes[] memory extraTranscriptInitMsgs\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x05bacaa9c265b454292a0e68d4746c5c8ae1624459c8ba76248abd513100b8d1\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IRecordsMerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\ninterface IRecordsMerkleTree {\\n /// @param elements The list of elements to be appended to the current merkle tree described by the frontier.\\n function updateRecordsMerkleTree(uint256[] memory elements) external;\\n\\n /// @notice Returns the root value of the Merkle tree.\\n function getRootValue() external view returns (uint256);\\n\\n /// @notice Returns the height of the Merkle tree.\\n function getHeight() external view returns (uint8);\\n\\n /// @notice Returns the number of leaves of the Merkle tree.\\n function getNumLeaves() external view returns (uint64);\\n}\\n\",\"keccak256\":\"0x180b3baa88726ac2ab70c037ccb5b8daf024b23d07a70640d9d97c62c9a702a4\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/AccumulatingArray.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\n/// @title AccumulatingArray library\\n/// @dev This library simplifies inserting elements into an array by keeping track\\n/// of the insertion index.\\n\\nlibrary AccumulatingArray {\\n struct Data {\\n uint256[] items;\\n uint256 index;\\n }\\n\\n /// @dev Create a new AccumulatingArray\\n /// @param length the number of items that will be inserted\\n function create(uint256 length) internal pure returns (Data memory) {\\n return Data(new uint256[](length), 0);\\n }\\n\\n /// @param items the items to accumulate\\n /// @dev Will revert if items past length are added.\\n function add(Data memory self, uint256[] memory items) internal pure {\\n for (uint256 i = 0; i < items.length; i++) {\\n self.items[i + self.index] = items[i];\\n }\\n self.index += items.length;\\n }\\n\\n /// @param item the item to accumulate.\\n /// @dev Will revert if items past length are added.\\n function add(Data memory self, uint256 item) internal pure {\\n self.items[self.index] = item;\\n self.index += 1;\\n }\\n\\n function isEmpty(Data memory self) internal pure returns (bool) {\\n return (self.index == 0);\\n }\\n}\\n\",\"keccak256\":\"0x3adc9f06696da4710f34d8c6229dbb4e0fc7116b794da5d048af891466a6d3bd\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/BN254.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n//\\n// Based on:\\n// - Christian Reitwiessner: https://gist.githubusercontent.com/chriseth/f9be9d9391efc5beb9704255a8e2989d/raw/4d0fb90847df1d4e04d507019031888df8372239/snarktest.solidity\\n// - Aztec: https://github.com/AztecProtocol/aztec-2-bug-bounty\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Utils.sol\\\";\\n\\n/// @notice Barreto-Naehrig curve over a 254 bit prime field\\nlibrary BN254 {\\n // use notation from https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/\\n //\\n // Elliptic curve is defined over a prime field GF(p), with embedding degree k.\\n // Short Weierstrass (SW form) is, for a, b \\\\in GF(p^n) for some natural number n > 0:\\n // E: y^2 = x^3 + a * x + b\\n //\\n // Pairing is defined over cyclic subgroups G1, G2, both of which are of order r.\\n // G1 is a subgroup of E(GF(p)), G2 is a subgroup of E(GF(p^k)).\\n //\\n // BN family are parameterized curves with well-chosen t,\\n // p = 36 * t^4 + 36 * t^3 + 24 * t^2 + 6 * t + 1\\n // r = 36 * t^4 + 36 * t^3 + 18 * t^2 + 6 * t + 1\\n // for some integer t.\\n // E has the equation:\\n // E: y^2 = x^3 + b\\n // where b is a primitive element of multiplicative group (GF(p))^* of order (p-1).\\n // A pairing e is defined by taking G1 as a subgroup of E(GF(p)) of order r,\\n // G2 as a subgroup of E'(GF(p^2)),\\n // and G_T as a subgroup of a multiplicative group (GF(p^12))^* of order r.\\n //\\n // BN254 is defined over a 254-bit prime order p, embedding degree k = 12.\\n uint256 public constant P_MOD =\\n 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n uint256 public constant R_MOD =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n struct G1Point {\\n uint256 x;\\n uint256 y;\\n }\\n\\n // G2 group element where x \\\\in Fp2 = x0 * z + x1\\n struct G2Point {\\n uint256 x0;\\n uint256 x1;\\n uint256 y0;\\n uint256 y1;\\n }\\n\\n /// @return the generator of G1\\n // solhint-disable-next-line func-name-mixedcase\\n function P1() internal pure returns (G1Point memory) {\\n return G1Point(1, 2);\\n }\\n\\n /// @return the generator of G2\\n // solhint-disable-next-line func-name-mixedcase\\n function P2() internal pure returns (G2Point memory) {\\n return\\n G2Point({\\n x0: 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2,\\n x1: 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed,\\n y0: 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b,\\n y1: 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa\\n });\\n }\\n\\n /// @dev check if a G1 point is Infinity\\n /// @notice precompile bn256Add at address(6) takes (0, 0) as Point of Infinity,\\n /// some crypto libraries (such as arkwork) uses a boolean flag to mark PoI, and\\n /// just use (0, 1) as affine coordinates (not on curve) to represents PoI.\\n function isInfinity(G1Point memory point) internal pure returns (bool result) {\\n assembly {\\n let x := mload(point)\\n let y := mload(add(point, 0x20))\\n result := and(iszero(x), iszero(y))\\n }\\n }\\n\\n /// @return r the negation of p, i.e. p.add(p.negate()) should be zero.\\n function negate(G1Point memory p) internal pure returns (G1Point memory) {\\n if (isInfinity(p)) {\\n return p;\\n }\\n return G1Point(p.x, P_MOD - (p.y % P_MOD));\\n }\\n\\n /// @return res = -fr the negation of scalar field element.\\n function negate(uint256 fr) internal pure returns (uint256 res) {\\n return R_MOD - (fr % R_MOD);\\n }\\n\\n /// @return r the sum of two points of G1\\n function add(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {\\n uint256[4] memory input;\\n input[0] = p1.x;\\n input[1] = p1.y;\\n input[2] = p2.x;\\n input[3] = p2.y;\\n bool success;\\n assembly {\\n success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60)\\n // Use \\\"invalid\\\" to make gas estimation work\\n switch success\\n case 0 {\\n revert(0, 0)\\n }\\n }\\n require(success, \\\"Bn254: group addition failed!\\\");\\n }\\n\\n /// @return r the product of a point on G1 and a scalar, i.e.\\n /// p == p.mul(1) and p.add(p) == p.mul(2) for all points p.\\n function scalarMul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {\\n uint256[3] memory input;\\n input[0] = p.x;\\n input[1] = p.y;\\n input[2] = s;\\n bool success;\\n assembly {\\n success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60)\\n // Use \\\"invalid\\\" to make gas estimation work\\n switch success\\n case 0 {\\n revert(0, 0)\\n }\\n }\\n require(success, \\\"Bn254: scalar mul failed!\\\");\\n }\\n\\n /// @dev Multi-scalar Mulitiplication (MSM)\\n /// @return r = \\\\Prod{B_i^s_i} where {s_i} are `scalars` and {B_i} are `bases`\\n function multiScalarMul(G1Point[] memory bases, uint256[] memory scalars)\\n internal\\n view\\n returns (G1Point memory r)\\n {\\n require(scalars.length == bases.length, \\\"MSM error: length does not match\\\");\\n\\n r = scalarMul(bases[0], scalars[0]);\\n for (uint256 i = 1; i < scalars.length; i++) {\\n r = add(r, scalarMul(bases[i], scalars[i]));\\n }\\n }\\n\\n /// @dev Compute f^-1 for f \\\\in Fr scalar field\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function invert(uint256 fr) internal view returns (uint256 output) {\\n bool success;\\n uint256 p = R_MOD;\\n assembly {\\n let mPtr := mload(0x40)\\n mstore(mPtr, 0x20)\\n mstore(add(mPtr, 0x20), 0x20)\\n mstore(add(mPtr, 0x40), 0x20)\\n mstore(add(mPtr, 0x60), fr)\\n mstore(add(mPtr, 0x80), sub(p, 2))\\n mstore(add(mPtr, 0xa0), p)\\n success := staticcall(gas(), 0x05, mPtr, 0xc0, 0x00, 0x20)\\n output := mload(0x00)\\n }\\n require(success, \\\"Bn254: pow precompile failed!\\\");\\n }\\n\\n /**\\n * validate the following:\\n * x != 0\\n * y != 0\\n * x < p\\n * y < p\\n * y^2 = x^3 + 3 mod p\\n */\\n /// @dev validate G1 point and check if it is on curve\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function validateG1Point(G1Point memory point) internal pure {\\n bool isWellFormed;\\n uint256 p = P_MOD;\\n assembly {\\n let x := mload(point)\\n let y := mload(add(point, 0x20))\\n\\n isWellFormed := and(\\n and(and(lt(x, p), lt(y, p)), not(or(iszero(x), iszero(y)))),\\n eq(mulmod(y, y, p), addmod(mulmod(x, mulmod(x, x, p), p), 3, p))\\n )\\n }\\n require(isWellFormed, \\\"Bn254: invalid G1 point\\\");\\n }\\n\\n /// @dev Validate scalar field, revert if invalid (namely if fr > r_mod).\\n /// @notice Writing this inline instead of calling it might save gas.\\n function validateScalarField(uint256 fr) internal pure {\\n bool isValid;\\n assembly {\\n isValid := lt(fr, R_MOD)\\n }\\n require(isValid, \\\"Bn254: invalid scalar field\\\");\\n }\\n\\n /// @dev Evaluate the following pairing product:\\n /// @dev e(a1, a2).e(-b1, b2) == 1\\n /// @dev caller needs to ensure that a1, a2, b1 and b2 are within proper group\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function pairingProd2(\\n G1Point memory a1,\\n G2Point memory a2,\\n G1Point memory b1,\\n G2Point memory b2\\n ) internal view returns (bool) {\\n uint256 out;\\n bool success;\\n assembly {\\n let mPtr := mload(0x40)\\n mstore(mPtr, mload(a1))\\n mstore(add(mPtr, 0x20), mload(add(a1, 0x20)))\\n mstore(add(mPtr, 0x40), mload(a2))\\n mstore(add(mPtr, 0x60), mload(add(a2, 0x20)))\\n mstore(add(mPtr, 0x80), mload(add(a2, 0x40)))\\n mstore(add(mPtr, 0xa0), mload(add(a2, 0x60)))\\n\\n mstore(add(mPtr, 0xc0), mload(b1))\\n mstore(add(mPtr, 0xe0), mload(add(b1, 0x20)))\\n mstore(add(mPtr, 0x100), mload(b2))\\n mstore(add(mPtr, 0x120), mload(add(b2, 0x20)))\\n mstore(add(mPtr, 0x140), mload(add(b2, 0x40)))\\n mstore(add(mPtr, 0x160), mload(add(b2, 0x60)))\\n success := staticcall(gas(), 8, mPtr, 0x180, 0x00, 0x20)\\n out := mload(0x00)\\n }\\n require(success, \\\"Bn254: Pairing check failed!\\\");\\n return (out != 0);\\n }\\n\\n function fromLeBytesModOrder(bytes memory leBytes) internal pure returns (uint256 ret) {\\n for (uint256 i = 0; i < leBytes.length; i++) {\\n ret = mulmod(ret, 256, R_MOD);\\n ret = addmod(ret, uint256(uint8(leBytes[leBytes.length - 1 - i])), R_MOD);\\n }\\n }\\n\\n /// @dev Check if y-coordinate of G1 point is negative.\\n function isYNegative(G1Point memory point) internal pure returns (bool) {\\n return (point.y << 1) < P_MOD;\\n }\\n\\n // @dev Perform a modular exponentiation.\\n // @return base^exponent (mod modulus)\\n // This method is ideal for small exponents (~64 bits or less), as it is cheaper than using the pow precompile\\n // @notice credit: credit: Aztec, Spilsbury Holdings Ltd\\n function powSmall(\\n uint256 base,\\n uint256 exponent,\\n uint256 modulus\\n ) internal pure returns (uint256) {\\n uint256 result = 1;\\n uint256 input = base;\\n uint256 count = 1;\\n\\n assembly {\\n let endpoint := add(exponent, 0x01)\\n for {\\n\\n } lt(count, endpoint) {\\n count := add(count, count)\\n } {\\n if and(exponent, count) {\\n result := mulmod(result, input, modulus)\\n }\\n input := mulmod(input, input, modulus)\\n }\\n }\\n\\n return result;\\n }\\n\\n function g1Serialize(G1Point memory point) internal pure returns (bytes memory) {\\n uint256 mask = 0;\\n\\n // Set the 254-th bit to 1 for infinity\\n // https://docs.rs/ark-serialize/0.3.0/src/ark_serialize/flags.rs.html#117\\n if (isInfinity(point)) {\\n mask |= 0x4000000000000000000000000000000000000000000000000000000000000000;\\n }\\n\\n // Set the 255-th bit to 1 for positive Y\\n // https://docs.rs/ark-serialize/0.3.0/src/ark_serialize/flags.rs.html#118\\n if (!isYNegative(point)) {\\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\\n }\\n\\n return abi.encodePacked(Utils.reverseEndianness(point.x | mask));\\n }\\n\\n function g1Deserialize(bytes32 input) internal view returns (G1Point memory point) {\\n uint256 mask = 0x4000000000000000000000000000000000000000000000000000000000000000;\\n uint256 x = Utils.reverseEndianness(uint256(input));\\n uint256 y;\\n bool isQuadraticResidue;\\n bool isYPositive;\\n if (x & mask != 0) {\\n // the 254-th bit == 1 for infinity\\n x = 0;\\n y = 0;\\n } else {\\n // Set the 255-th bit to 1 for positive Y\\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\\n isYPositive = (x & mask != 0);\\n // mask off the first two bits of x\\n mask = 0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n x &= mask;\\n\\n // solve for y where E: y^2 = x^3 + 3\\n y = mulmod(x, x, P_MOD);\\n y = mulmod(y, x, P_MOD);\\n y = addmod(y, 3, P_MOD);\\n (isQuadraticResidue, y) = quadraticResidue(y);\\n\\n require(isQuadraticResidue, \\\"deser fail: not on curve\\\");\\n\\n if (isYPositive) {\\n y = P_MOD - y;\\n }\\n }\\n\\n point = G1Point(x, y);\\n }\\n\\n function quadraticResidue(uint256 x)\\n internal\\n view\\n returns (bool isQuadraticResidue, uint256 a)\\n {\\n bool success;\\n // e = (p+1)/4\\n uint256 e = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52;\\n uint256 p = P_MOD;\\n\\n // we have p == 3 mod 4 therefore\\n // a = x^((p+1)/4)\\n assembly {\\n // credit: Aztec\\n let mPtr := mload(0x40)\\n mstore(mPtr, 0x20)\\n mstore(add(mPtr, 0x20), 0x20)\\n mstore(add(mPtr, 0x40), 0x20)\\n mstore(add(mPtr, 0x60), x)\\n mstore(add(mPtr, 0x80), e)\\n mstore(add(mPtr, 0xa0), p)\\n success := staticcall(gas(), 0x05, mPtr, 0xc0, 0x00, 0x20)\\n a := mload(0x00)\\n }\\n require(success, \\\"pow precompile call failed!\\\");\\n\\n // ensure a < p/2\\n if (a << 1 > p) {\\n a = p - a;\\n }\\n\\n // check if a^2 = x, if not x is not a quadratic residue\\n e = mulmod(a, a, p);\\n\\n isQuadraticResidue = (e == x);\\n }\\n}\\n\",\"keccak256\":\"0x3607d86e6e230526d4cb8f5ae427d9ad04f7f77455f4994ee4f1c6d8d7e829ca\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/EdOnBN254.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../libraries/Utils.sol\\\";\\n\\n/// @notice Edward curve on BN254.\\n/// This library only implements a serialization function that is consistent with\\n/// Arkworks' format. It does not support any group operations.\\nlibrary EdOnBN254 {\\n uint256 public constant P_MOD =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n struct EdOnBN254Point {\\n uint256 x;\\n uint256 y;\\n }\\n\\n /// @dev Check if y-coordinate of G1 point is negative.\\n function isYNegative(EdOnBN254Point memory point) internal pure returns (bool) {\\n return (point.y << 1) < P_MOD;\\n }\\n\\n function serialize(EdOnBN254Point memory point) internal pure returns (bytes memory res) {\\n uint256 mask = 0;\\n // Edward curve does not have an infinity flag.\\n // Set the 255-th bit to 1 for positive Y\\n // See: https://github.com/arkworks-rs/algebra/blob/d6365c3a0724e5d71322fe19cbdb30f979b064c8/serialize/src/flags.rs#L148\\n if (!EdOnBN254.isYNegative(point)) {\\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\\n }\\n\\n return abi.encodePacked(Utils.reverseEndianness(point.x | mask));\\n }\\n}\\n\",\"keccak256\":\"0x74b010da16219e4a9ab8ce1a2627a97c64ae7b2a515757932cb2a9cdf6e82e4c\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Freeze2In2Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Freeze2In2Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 7)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 5118137774697846205332813764527928981094534629179826197661885163309718792664\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 21444510867008360096097791654924066970628086592132286765149218644570218218958\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 8803078987858664729272498900762799875194584982758288268215987493230494163132\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 2433303804972293717223914306424233027859258355453999879123493306111951897773\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 3260803333275595200572169884988811547059839215101652317716205725226978273005\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 3613466037895382109608881276133312019690204476510004381563636709063308697093\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 2899439069156777615431510251772750434873724497570948892914993632800602868003\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 8379069052308825781842073463279139505822176676050290986587894691217284563176\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 11732815069861807091165298838511758216456754114248634732985660813617441774658\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 13166648630773672378735632573860809427570624939066078822309995911184719468349\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 3491113372305405096734724369052497193940883294098266073462122391919346338715\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 9827940866231584614489847721346069816554104560301469101889136447541239075558\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 13435736629650136340196094187820825115318808951343660439499146542480924445056\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 17982003639419860944219119425071532203644939147988825284644182004036282633420\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 9420441314344923881108805693844267870391289724837370305813596950535269618889\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 14052028114719021167053334693322209909986772869796949309216011765205181071250\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 5993794253539477186956400554691260472169114800994727061541419240125118730670\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 7932960467420473760327919608797843731121974235494949218022535850994096308221\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 20429406452243707916630058273965650451352739230543746812138739882954609124362\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 19692763177526054221606086118119451355223254880919552106296824049356634107628\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 5116116081275540865026368436909879211124168610156815899416152073819842308833\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 19842614482623746480218449373220727139999815807703100436601033251034509288020\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 3222495709067365879961349438698872943831082393186134710609177690951286365439\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 3703532585269560394637679600890000571417416525562741673639173852507841008896\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 14390471925844384916287376853753782482889671388409569687933776522892272411453\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 12261059506574689542871751331715340905672203590996080541963527436628201655551\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 212133813390818941086614328570019936880884093617125797928913969643819686094\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 2058275687345409085609950154451527352761528547310163982911053914079075244754\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 7507728187668840967683000771945777493711131652056583548804845913578647015848\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 15764897865018924692970368330703479768257677759902236501992745661340099646248\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 18302496468173370667823199324779836313672317342261283918121073083547306893947\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 8286815911028648157724790867291052312955947067988434001008620797971639607610\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 3470304694844212768511296992238419575123994956442939632524758781128057967608\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 9660892985889164184033149081062412611630238705975373538019042544308335432760\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 2964316839877400858567376484261923751031240259689039666960763176068018735519\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 12811532772714855857084788747474913882317963037829729036129619334772557515102\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0xaed0ac1a38ac4b0efd28b720b24fe33648f5e74105f8edfcb965b48c32453edf\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Freeze3In3Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Freeze3In3Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 9)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 13960731824189571867091334541157339805012676983241098249236778497915465352053\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 15957967148909612161116218663566087497068811688498797226467515095325657152045\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 10072587287838607559866316765624459623039578259829899225485734337870604479821\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 15609102652788964903340031795269302405421393375766454476378251576322947285858\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 6565707169634610873662073730120423414251877113110818166564470784428289496576\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 9611712776953584296612678707999788907754017999002246476393974258810867124564\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 19122400063214294010991425447556532201595762243736666161415050184531098654161\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 8531074110951311734071734321378003618052738734286317677359289798683215129985\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 18914674706112982859579196036464470962561796494057486369943014188445892675591\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 8521550178820292984099911306615540388090622911114862049753515592863829430736\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 14630335835391046544786473024276900306274085179180854494149987003151236405693\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 11927636740621831793456799535735389934490350641107279163802406976389995490906\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 12724914112829888521503996001370933887413324349676112061904353298191125761834\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 3433370683786676509006167821257247081483834358490691629467376279251656650897\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 9566744544381523978155846140753126684369534823789897373672815695046810310988\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 260017699035964770662690666115311602214922546306804012310168827438556483441\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 18742890127040989288898023133652949889864689947035150783791742574000686319400\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 18749161983189150319356152659011703669863797011859087161475368338926038180308\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 20773233313791930222139945008080890514898946888819625041024291924369611870607\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 13521724424975535658347353167027580945107539483287924982357298371687877483981\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 10660982607928179139814177842882617778440401746692506684983260589289268170379\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 15139413484465466645149010003574654339361200137557967877891360282092282891685\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 17250558007005834955604250406579207360748810924758511953913092810009135851470\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 11258418978437321501318046240697776859180107275977030400553604411488978149668\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 18952078950487788846193130112459018587473354670050028821020889375362878213321\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 17193026626593699161155564126784943150078109362562131961513990003707313130311\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 14543481681504505345294846715453463092188884601462120536722150134676588633429\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 18051927297986484527611703191585266713528321784715802343699150271856051244721\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 17183091890960203175777065490726876011944304977299231686457191186480347944964\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 4490401529426574565331238171714181866458606184922225399124187058005801778892\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 1221754396433704762941109064372027557900417150628742839724350141274324105531\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 5852202975250895807153833762470523277935452126865915206223172229093142057204\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 15942219407079940317108327336758085920828255563342347502490598820248118460133\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 13932908789216121516788648116401360726086794781411868046768741292235436938527\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 11253921189643581015308547816247612243572238063440388125238308675751100437670\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 21538818198962061056994656088458979220103547193654086011201760604068846580076\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0xdd07fbe21dbdc1be9a602fc27b2ad4cbcecab74f4ff763ac190fb7be09d84d83\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Mint1In2Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Mint1In2Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 16384)\\n // num of public inputs\\n mstore(add(vk, 0x20), 22)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 18715857233450097233566665862469612667705408112918632327151254517366615510853\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 12056659507165533739511169991607046566607546589228993432633519678105063191994\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 14824195002671574468331715635494727121571793218927771429557442195822888294112\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 15545363005844852395434066542267547241977074468438704526560481952507920680442\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 12730937992652390663908670084945912580250489721157445258662047611384656062589\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 13922972325643955705903067190275250069235823502347080251607855678412413832655\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 11205515283341717493374802581094446196264159623530455592177314841729924213298\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 21626228139140341994554265888140425084500331880890693761295353772893134873176\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 1297892505212470170669591175924901147071008882331974691087297632739019966869\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 5046998337256619649328073625306172605427225136111531257681027197976756517579\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 3416126502361838053757816729968531801453964981226124461039874315717193603949\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 13457539169423794765649307630863376252412201646715715024708233511728175887361\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 14560725448400229197269899568322480538530865768296597131421754928016376186765\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 948706310326485520368947730671484733882983133515374382612890953953178516965\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 3629576662585230443325226017156907801568659344982452092584030101519414013585\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 11755059153403672321764085695058203755528587063932979109812536973510125660021\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 11004655709419206490244680738164512138236779409731663166100876015592834374329\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 3075086625849477481019461602494583874758896233088021555313650923393327170396\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 5116214943488395672472205024247672892505731883467355177124324350502474270399\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 5862627121952215177093377764664762757373132220173512585597211838016077936314\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 17591159830764396623974345916017368127032492198578190405514161605820133619635\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 21823861194811124564815272373053730365073236057851878678286985577859771922838\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 4270340305067371269951830198578603793146745643909898988425564374444309637164\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 3429516859933338020020014748205944416226065682096817012737681215798779959358\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 18140449432973717159678873762584078749849242918610972566667541337332136871548\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 9496973080403650076452512345486781056144944295333639818676842964799046293494\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 2679601553769052076036509170798838073426403353317218807312666276919478214029\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 8104020893469546307958011379600482565107943832349081304458473817724197756534\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 15359849857211682094089890949757251089555853826462724721381029431330976452771\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 16491566299722544741678927866350154870498939946959249271831955257228312538659\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 12100931690223724084472313998885551549102209045806672061992493151022394323721\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 789632069622495739311692844331711309820973570859008137449744966665497183364\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 9372499437356245507830218065264333778849228240985893278867565670067559001476\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 5071314442263159884139201702429590502916613589463313571011317767821015131114\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 13714688610643446356217590887080562811494820054657712165894734861828853586333\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 1823119861575201921550763026703044012616621870847156108104965194178825195245\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcd67c9657c6f07e963aa52abdf8596aec671a8f7d3a0a7c8b3587941a3d4ab01\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/RescueLib.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nlibrary RescueLib {\\n /// The constants are obtained from the Sage script\\n /// https://github.com/EspressoSystems/Marvellous/blob/fcd4c41672f485ac2f62526bc87a16789d4d0459/rescue254.sage\\n\\n // These constants are no longer used, left here for readability.\\n // uint256 private constant _N_ROUNDS = 12;\\n // uint256 private constant _STATE_SIZE = 4;\\n // uint256 private constant _SCHEDULED_KEY_SIZE = (2 * _N_ROUNDS + 1) * _STATE_SIZE;\\n // uint256 private constant _ALPHA = 5;\\n\\n // Obtained by running KeyScheduling([0,0,0,0]). See Algorithm 2 of AT specification document.\\n\\n uint256 private constant _PRIME =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n uint256 private constant _ALPHA_INV =\\n 17510594297471420177797124596205820070838691520332827474958563349260646796493;\\n\\n // MDS is hardcoded\\n function _linearOp(\\n uint256 s0,\\n uint256 s1,\\n uint256 s2,\\n uint256 s3\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n uint256,\\n uint256\\n )\\n {\\n // Matrix multiplication\\n unchecked {\\n return (\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575808479992,\\n s0,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575806058117,\\n s1,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575491214367,\\n s2,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186535831058117,\\n s3,\\n _PRIME\\n ),\\n mulmod(19500, s0, _PRIME) +\\n mulmod(3026375, s1, _PRIME) +\\n mulmod(393529500, s2, _PRIME) +\\n mulmod(49574560750, s3, _PRIME),\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575808491587,\\n s0,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575807886437,\\n s1,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575729688812,\\n s2,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186565891044437,\\n s3,\\n _PRIME\\n ),\\n mulmod(156, s0, _PRIME) +\\n mulmod(20306, s1, _PRIME) +\\n mulmod(2558556, s2, _PRIME) +\\n mulmod(320327931, s3, _PRIME)\\n );\\n }\\n }\\n\\n function _expAlphaInv4Setup(uint256[6] memory scratch) private pure {\\n assembly {\\n let p := scratch\\n mstore(p, 0x20) // Length of Base\\n mstore(add(p, 0x20), 0x20) // Length of Exponent\\n mstore(add(p, 0x40), 0x20) // Length of Modulus\\n mstore(add(p, 0x80), _ALPHA_INV) // Exponent\\n mstore(add(p, 0xa0), _PRIME) // Modulus\\n }\\n }\\n\\n function _expAlphaInv4(\\n uint256[6] memory scratch,\\n uint256 s0,\\n uint256 s1,\\n uint256 s2,\\n uint256 s3\\n )\\n private\\n view\\n returns (\\n uint256 o0,\\n uint256 o1,\\n uint256 o2,\\n uint256 o3\\n )\\n {\\n assembly {\\n // define pointer\\n let p := scratch\\n let basep := add(p, 0x60)\\n mstore(basep, s0) // Base\\n // store data assembly-favouring ways\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o0 := mload(basep)\\n mstore(basep, s1) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o1 := mload(basep)\\n mstore(basep, s2) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o2 := mload(basep)\\n mstore(basep, s3) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o3 := mload(basep)\\n }\\n }\\n\\n // Computes the Rescue permutation on some input\\n // Recall that the scheduled key is precomputed in our case\\n // @param input input for the permutation\\n // @return permutation output\\n function perm(\\n // slither-disable-next-line write-after-write\\n uint256 s0,\\n // slither-disable-next-line write-after-write\\n uint256 s1,\\n // slither-disable-next-line write-after-write\\n uint256 s2,\\n // slither-disable-next-line write-after-write\\n uint256 s3\\n )\\n internal\\n view\\n returns (\\n uint256,\\n uint256,\\n uint256,\\n uint256\\n )\\n {\\n // slither-disable-next-line uninitialized-local\\n uint256[6] memory alphaInvScratch;\\n\\n _expAlphaInv4Setup(alphaInvScratch);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 14613516837064033601098425266946467918409544647446217386229959902054563533267,\\n s1 + 376600575581954944138907282479272751264978206975465380433764825531344567663,\\n s2 + 7549886658634274343394883631367643327196152481472281919735617268044202589860,\\n s3 + 3682071510138521345600424597536598375718773365536872232193107639375194756918\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 18657517374128716281071590782771170166993445602755371021955596036781411817786;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 7833794394096838639430144230563403530989402760602204539559270044687522640191;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 21303828694647266539931030987057572024333442749881970102454081226349775826204;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 10601447988834057856019990466870413629636256450824419416829818546423193802418;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 3394657260998945409283098835682964352503279447198495330506177586645995289229,\\n s1 + 18437084083724939316390841967750487133622937044030373241106776324730657101302,\\n s2 + 9281739916935170266925270432337475828741505406943764438550188362765269530037,\\n s3 + 7363758719535652813463843693256839865026387361836644774317493432208443086206\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 307094088106440279963968943984309088038734274328527845883669678290790702381;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 20802277384865839022876847241719852837518994021170013346790603773477912819001;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 19754579269464973651593381036132218829220609572271224048608091445854164824042;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 3618840933841571232310395486452077846249117988789467996234635426899783130819;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 2604166168648013711791424714498680546427073388134923208733633668316805639713,\\n s1 + 21355705619901626246699129842094174300693414345856149669339147704587730744579,\\n s2 + 492957643799044929042114590851019953669919577182050726596188173945730031352,\\n s3 + 8495959434717951575638107349559891417392372124707619959558593515759091841138\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 15608173629791582453867933160400609222904457931922627396107815347244961625587;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 16346164988481725869223011419855264063160651334419415042919928342589111681923;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 21085652277104054699752179865196164165969290053517659864117475352262716334100;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 20640310021063232205677193759981403045043444605175178332133134865746039279935;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 6015589261538006311719125697023069952804098656652050863009463360598997670240,\\n s1 + 12498423882721726012743791752811798719201859023192663855805526312393108407357,\\n s2 + 10785527781711732350693172404486938622378708235957779975342240483505724965040,\\n s3 + 5563181134859229953817163002660048854420912281911747312557025480927280392569\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 4585980485870975597083581718044393941512074846925247225127276913719050121968;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 8135760428078872176830812746579993820254685977237403304445687861806698035222;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 4525715538433244696411192727226186804883202134636681498489663161593606654720;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 2537497100749435007113677475828631400227339157221711397900070636998427379023;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 6957758175844522415482704083077249782181516476067074624906502033584870962925,\\n s1 + 17134288156316028142861248367413235848595762718317063354217292516610545487813,\\n s2 + 20912428573104312239411321877435657586184425249645076131891636094671938892815,\\n s3 + 16000236205755938926858829908701623009580043315308207671921283074116709575629\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 10226182617544046880850643054874064693998595520540061157646952229134207239372;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 18584346134948015676264599354709457865255277240606855245909703396343731224626;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 9263628039314899758000383385773954136696958567872461042004915206775147151562;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 21095966719856094705113273596585696209808876361583941931684481364905087347856;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 2671157351815122058649197205531097090514563992249109660044882868649840700911,\\n s1 + 19371695134219415702961622134896564229962454573253508904477489696588594622079,\\n s2 + 5458968308231210904289987830881528056037123818964633914555287871152343390175,\\n s3 + 7336332584551233792026746889434554547883125466404119632794862500961953384162\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 10351436748086126474964482623536554036637945319698748519226181145454116702488;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 10588209357420186457766745724579739104572139534486480334142455690083813419064;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 14330277147584936710957102218096795520430543834717433464500965846826655802131;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 20752197679372238381408962682213349118865256502118746003818603260257076802028;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 19390446529582160674621825412345750405397926216690583196542690617266028463414,\\n s1 + 4169994013656329171830126793466321040216273832271989491631696813297571003664,\\n s2 + 3014817248268674641565961681956715664833306954478820029563459099892548946802,\\n s3 + 14285412497877984113655094566695921704826935980354186365694472961163628072901\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 16224484149774307577146165975762490690838415946665379067259822320752729067513;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 5404416528124718330316441408560295270695591369912905197499507811036327404407;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 20127204244332635127213425090893250761286848618448128307344971109698523903374;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 14939477686176063572999014162186372798386193194442661892600584389296609365740;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 183740587182448242823071506013879595265109215202349952517434740768878294134,\\n s1 + 15366166801397358994305040367078329374182896694582870542425225835844885654667,\\n s2 + 10066796014802701613007252979619633540090232697942390802486559078446300507813,\\n s3 + 4824035239925904398047276123907644574421550988870123756876333092498925242854\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 5526416022516734657935645023952329824887761902324086126076396040056459740202;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 18157816292703983306114736850721419851645159304249709756659476015594698876611;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 767446206481623130855439732549764381286210118638028499466788453347759203223;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 16303412231051555792435190427637047658258796056382698277687500021321460387129;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 15475465085113677237835653765189267963435264152924949727326000496982746660612,\\n s1 + 14574823710073720047190393602502575509282844662732045439760066078137662816054,\\n s2 + 13746490178929963947720756220409862158443939172096620003896874772477437733602,\\n s3 + 13804898145881881347835367366352189037341704254740510664318597456840481739975\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 3523599105403569319090449327691358425990456728660349400211678603795116364226;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 8632053982708637954870974502506145434219829622278773822242070316888003350278;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 20293222318844554840191640739970825558851264905959070636369796127300969629060;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 7583204376683983181255811699503668584283525661852773339144064901897953897564;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 7562572155566079175343789986900217168516831778275127159068657756836798778249,\\n s1 + 12689811910161401007144285031988539999455902164332232460061366402869461973371,\\n s2 + 21878400680687418538050108788381481970431106443696421074205107984690362920637,\\n s3 + 3428721187625124675258692786364137915132424621324969246210899039774126165479\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 2552744099402346352193097862110515290335034445517764751557635302899937367219;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 13706727374402840004346872704605212996406886221231239230397976011930486183550;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 19786308443934570499119114884492461847023732197118902978413499381102456961966;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 11767081169862697956461405434786280425108140215784390008330611807075539962898;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 1273319740931699377003430019539548781935202579355152343831464213279794249000,\\n s1 + 20225620070386241931202098463018472034137960205721651875253423327929063224115,\\n s2 + 13107884970924459680133954992354588464904218518440707039430314610799573960437,\\n s3 + 10574066469653966216567896842413898230152427846140046825523989742590727910280\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 21386271527766270535632132320974945129946865648321206442664310421414128279311;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 15743262855527118149527268525857865250723531109306484598629175225221686341453;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 16251140915157602891864152518526119259367827194524273940185283798897653655734;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 5420158299017134702074915284768041702367316125403978919545323705661634647751;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 14555572526833606349832007897859411042036463045080050783981107823326880950231,\\n s1 + 15234942318869557310939446038663331226792664588406507247341043508129993934298,\\n s2 + 19560004467494472556570844694553210033340577742756929194362924850760034377042,\\n s3 + 21851693551359717578445799046408060941161959589978077352548456186528047792150\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 19076469206110044175016166349949136119962165667268661130584159239385341119621;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 19132104531774396501521959463346904008488403861940301898725725957519076019017;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 6606159937109409334959297158878571243749055026127553188405933692223704734040;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 13442678592538344046772867528443594004918096722084104155946229264098946917042;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n return (\\n s0 + 11975757366382164299373991853632416786161357061467425182041988114491638264212,\\n s1 + 10571372363668414752587603575617060708758897046929321941050113299303675014148,\\n s2 + 5405426474713644587066466463343175633538103521677501186003868914920014287031,\\n s3 + 18665277628144856329335676361545218245401014824195451740181902217370165017984\\n );\\n }\\n }\\n\\n // Computes the hash of three field elements and returns a single element\\n // In our case the rate is 3 and the capacity is 1\\n // This hash function the one used in the Records Merkle tree.\\n // @param a first element\\n // @param b second element\\n // @param c third element\\n // @return the first element of the Rescue state\\n function hash(\\n uint256 a,\\n uint256 b,\\n uint256 c\\n ) public view returns (uint256 o) {\\n (o, a, b, c) = perm(a % _PRIME, b % _PRIME, c % _PRIME, 0);\\n o %= _PRIME;\\n }\\n\\n function checkBounded(uint256[15] memory inputs) internal pure {\\n for (uint256 i = 0; i < inputs.length; ++i) {\\n require(inputs[i] < _PRIME, \\\"inputs must be below _PRIME\\\");\\n }\\n }\\n\\n // This function is external to ensure that the solidity compiler generates\\n // a separate library contract. This is required to reduce the size of the\\n // CAPE contract.\\n function commit(uint256[15] memory inputs) external view returns (uint256) {\\n checkBounded(inputs);\\n\\n uint256 a;\\n uint256 b;\\n uint256 c;\\n uint256 d;\\n\\n for (uint256 i = 0; i < 5; i++) {\\n unchecked {\\n (a, b, c, d) = perm(\\n (a + inputs[3 * i + 0]) % _PRIME,\\n (b + inputs[3 * i + 1]) % _PRIME,\\n (c + inputs[3 * i + 2]) % _PRIME,\\n d\\n );\\n\\n (a, b, c, d) = (a % _PRIME, b % _PRIME, c % _PRIME, d % _PRIME);\\n }\\n }\\n\\n return a;\\n }\\n}\\n\",\"keccak256\":\"0x5d852913c47167b7e785dadec2913f3a468e3279af846ef0d52de3ce106dd274\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Transfer1In2Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Transfer1In2Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 14)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 6451930258054036397165544866644311272180786776693649154889113517935138989324\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 15824498031290932840309269587075035510403426361110328301862825820425402064333\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 16567945706248183214406921539823721483157024902030706018155219832331943151521\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 14506648136467119081958160505454685757895812203258866143116417397069305366174\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 16908805137848644970538829805684573945187052776129406508429516788865993229946\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 13370902069114408370627021011309095482019563080650295231694581484651030202227\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 11385428061273012554614867838291301202096376350855764984558871671579621291507\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 18938480909096008246537758317235530495583632544865390355616243879170108311037\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 7250836052061444170671162428779548720754588271620290284029438087321333136859\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 9774478170511284714380468511107372909275276960243638784016266344709965751507\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 2164661706057106993702119971892524764909406587180616475316536801798272746351\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 7993083931046493938644389635874939373576598203553188654440768055247347522377\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 17875027092910639802264620931724329796279457509298747494670931666396434012177\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 12276180841132702377773827582398158204508221552359644390751974783173207949116\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 6923045257159434019788850173231395134054684072354814328515094196682490129996\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 10297389981574891432841377306749459633586002482842974197875786670892058142179\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 13566140293342467207563198706820126266175769850278450464476746689910443370750\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 4337013617009771491102950113766314929630396941539697665107262932887431611820\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 19545356440018631139549838928930231615194677294299230322568967706100221743452\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 3905268653568739552774781017975590296651581349403516285498718251384231803637\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 3633513776458243190609011598510312470369153119749343878250857605063953894824\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 10348854780537633653024803962077925757963724802390956695225993897601858375068\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 10515123958235902109894586452633863486298290064878690665500349352367945576213\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 20835963785046732330293306231553834880816750576829504030205004088050809531737\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 10349250837084111252673833558497412287345352572732754388450385078539897036072\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 1295954576893766564415821998145161393110346678014886452040838119568563355556\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 18595738613642013642528283665640490180800278502934355301953048187579782737773\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 5708601727819525671780050950771464619626673626810479676243974296923430650735\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 8105844768413379370590866345497514518639783589779028631263566798017351944465\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 13767799708582015119198203890136804463714948257729839866946279972890684141171\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 13976995316216184532948677497270469464100744949177652840098916826286666391978\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 8782060747227562892357029272916715317651514559557103332761644499318601665300\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 10423258206189675762927713311069351374538317153673220039972782365668263479097\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 12712089727236847935392559371166622501626155101609755726562266635070650647609\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 3447947975392962233948092031223758925923495365282112464857270024948603045088\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 4655198050073279486560411245172865913095816956325221266986314415391129730949\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b675fc4b56b1f9b2580aef2ed84f6823fb8a180a637b97ff4d4603941be6d77\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Transfer2In2Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Transfer2In2Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 27)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 2353344940323935826134936223947938042521909475033774928828281661731550798722\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 9746655158250922067275109215926891774244956160343543537816404835253168644024\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 15455409296542685326830249024223724266624290984578410657713086954481835262616\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 18311379816054123251097409624258299432408683566103718315014121691958807960547\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 3595102568308999621710931895728700858137670894580826466196432246884451756647\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 5971868016111020985417776938700261612639243638290968867440360355753182506016\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 12443289603239702012200478229424802817855243081906319312702825218898138895946\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 14108881420049829870828878537593066975275378607590487898362908473190089969939\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 19679657199741651524390089978450662678686454680964744364368691879627016432652\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 17114067594856558864780849616452660298251042000563020846487894545389438664806\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 4521205613646422234630873762189179209607994647697100090154823061235920789353\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 16106449496625400183304424755719536524421029289605758534728292280016648447637\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 15558337488326969806891656016031810341177100586194811207644366322955582958290\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 154404024660163916069895563430486111291743096749375581648108814279740019496\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 10968315091130697826739702003431871061194509005508422925553623050382577326217\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 15427520064071248215056685014173235486104450904391795026852773491856938894709\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 18552120566932429867086353275996329695634259700395564758868503989836119743976\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 3758067104786429430903075307629079520236919298153864746942709833835554967358\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 15572105585408879365916525794377657194208962207139936775774251314043834098564\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 6020958592977720912767721649577520866900127639444801108025166566775601659967\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 7222736374399006211510699304087942059126683193629769887877014686905908945806\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 3206829195840321731462512861208486643839466222481973961857037286401683735687\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 3354591448826521438380040598853232839565248677422944332090180952953080366288\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 19963668090281374431317017250026510351550118984869870738585126468447913244591\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 17974807300702948996049252322259229942746003444136224778640009295566243156501\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 12052046477897583522878740699736101759681160588792932192885758224246430725626\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 4921034593166626300651198249205635549101612701433540517476055976860959484949\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 10185405862489710856496932329182422458788356942668474473592359869600739434412\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 5878093886505576171449048465070377785955067968838740459103515014923390639639\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 15259888626953734049577795735967576333281508824947666542918638019623811781546\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 19643669610230135658961129468905806322162637394453939877922249528939594418232\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 12224852444220822793589818921506014057813793178254991680570188956045824616826\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 6641963433101155753834035944397107424954075034582038862756599997819459513127\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 3589782713125700501109156506560851754947305163593203470270968608024453926281\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 12330486534063835148740124350008103247243211222952306312071501975705307117092\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 20509504091296584456523257770792088853619865130173628006197630419037120651742\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0x551bf64b658e5842e7e3ab18d5b86e5db9cd36682613d189d02f053e4d13a5bb\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Transfer2In3Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Transfer2In3Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 32)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 11238918059962060895836660665905685183821438171673788872298187887301460117949\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 10312536098428436059770058647883007948230826032311055958980103002216444398029\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 3069296210454062532812049058888182398466997742713116483712055777740542557095\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 10585452901889142818220136732592206035573929406563129602198941778025261934559\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 49796010413150322443747223871067686918728570624660232645490911700120682624\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 19418979289570937603858876101332413214999751685423780259104815571219376501897\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 5017549683124968830897329522528615084825569869584518140023215913256996665369\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 6904459746270415738591583761210331008369254540754508554401155557939093240173\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 15294346261666962115813163162624127728984137808463913539428567756274357657589\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 6335459220235140110171052568798094575702073047123843498885605762024671566976\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 3447729854865352811909348476580581256116229886577313169808953699321178547567\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 10391923178665150678480226437763860904879593811452327022884721625331046561649\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 21331037483834702908326522885638199264097608653827628146912836859219217391521\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 17700979571500030343918100715185217716266526246917146097813330984808052588149\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 19231315187566819499805706567670055518295048760424962411545826184537652443122\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 1786951957014031658307434161704132339929023647859863721152324287915947831283\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 891318259297166657950777135402426115367536796891436125685210585889035809375\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 19080042747384460176894767057995469942920956949014313980914237214240134307208\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 8600864573298799022763786653218006387353791810267845686055695121259061041328\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 16693779427169671344028720673356223282089909563990595319572224701304611776922\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 9157681660736307225301034938839156685740016704526090406950858434609030225480\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 8030757918449598333025173041225419314601924784825356372892442933863889091921\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 13640927194155719878577037989318164230713264172921393074620679102349279698839\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 6900604409783116559678606532527525488965021296050678826316410961047810748517\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 5252746067177671060986834545182465389119363624955154280966570801582394785840\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 9195131821976884258765963928166452788332100806625752840914173681395711439614\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 14977645969508065057243931947507598769856801213808952261859994787935726005589\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 5096294777527669951530261927053173270421982090354495165464932330992574194565\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 3545567189598828405425832938456307851398759232755240447556204001745014820301\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 1941523779920680020402590579224743136261147114116204389037553310789640138016\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 18752226702425153987309996103585848095327330331398325134534482624274124156372\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 11041340585339071070596363521057299677913989755036511157364732122494432877984\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 14590850366538565268612154711126247437677807588903705071677135475079401886274\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 18590050088847501728340953044790139366495591524471631048198965975345765148219\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 21704590671982347430816904792389667189857927953663414983186296915645026530922\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 20891693206558394293557033642999941159043782671912221870570329299710569824990\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0x972a44ce31523b90135b140bf707d5dd82d67c4ea3f7d7f285627969704d03f7\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Transfer3In3Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Transfer3In3Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 65536)\\n // num of public inputs\\n mstore(add(vk, 0x20), 45)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 6745569324574292840123998773726184666805725845966057344477780763812378175216\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 15674359264100532117390420549335759541287602785521062799291583384533749901741\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 3882047939060472482494153851462770573213675187290765799393847015027127043523\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 7630821036627726874781987389422412327209162597154025595018731571961516169947\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 21225224708013383300469954369858606000505504678178518510917526718672976749965\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 16365929799382131762072204211493784381011606251973921052275294268694891754790\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 18816028553810513067728270242942259651783354986329945635353859047149476279687\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 11882680851945303658063593837716037756293837416752296611477056121789431777064\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 21510097154791711734296287821852281209791416779989865544015434367940075374914\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 3430102751397774877173034066414871678821827985103146314887340992082993984329\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 19869597504326919094166107694290620558808748604476313005465666228287903414344\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 7150111322568846997819037419437132637225578315562663408823282538527304893394\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 15160992848460929858090744745540508270198264712727437471403260552347088002356\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 14658479685250391207452586531545916785099257310771621120220342224985727703397\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 8235204123369855002620633544318875073465201482729570929826842086900101734240\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 1315782571791013709741742522230010040948540142932666264718230624795003912658\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 7021080634443416008459948952678027962506306501245829421538884411847588184010\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 6584493294015254847476792897094566004873857428175399671267891995703671301938\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 19199743165408884046745846028664619315169170959180153012829728401858950581623\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 14838749009602762930836652487207610572239367359059811743491751753845995666312\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 10248259393969855960972127876087560001222739594880062140977367664638629457979\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 3405469462517204071666729973707416410254082166076974198995581327928518673875\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 9259807925511910228709408577417518144465439748546649497440413244416264053909\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 4349742126987923639436565898601499377373071260693932114899380098788981806520\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 195924708408078159303893377539882303047203274957430754688974876101940076523\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 2730242103617344574903225508726280194241425124842703262405260488972083367491\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 20219387287202350426068670038890996732790822982376234641416083193417653609683\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 4712902992473903996354956065401616044154872569903741964754702810524685939510\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 20606018511516306199576247848201856706631620007530428100607004704631466340548\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 3431535724436156106895017518971445784357440465218022981124980111332355382620\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 16926802729258759088538388518776752987858809292908095720269836387951179849328\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 17982233223518308144739071673627895392237126231063756253762501987899411496611\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 2769108222659962988853179530681878069454558991374977224908414446449310780711\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 1229799452453481995415811771099188864368739763357472273935665649735041438448\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 4813470345909172814186147928188285492437945113396806975178500704379725081570\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 5911983361843136694947821727682990071782684402361679071602671084421707986423\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0x1b99c5af4d76f09fef1dd76c421b249560d3ff70288fef8f9e50534488401a1f\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Utils.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nlibrary Utils {\\n function reverseEndianness(uint256 input) internal pure returns (uint256 v) {\\n v = input;\\n\\n // swap bytes\\n v =\\n ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) |\\n ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\\n\\n // swap 2-byte long pairs\\n v =\\n ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) |\\n ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\\n\\n // swap 4-byte long pairs\\n v =\\n ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) |\\n ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32);\\n\\n // swap 8-byte long pairs\\n v =\\n ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) |\\n ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64);\\n\\n // swap 16-byte long pairs\\n v = (v >> 128) | (v << 128);\\n }\\n}\\n\",\"keccak256\":\"0x6171f0308aaf0e5379abfee2ed1aa69b81232ef35f0a5576bf7e16d9ad73ac49\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/VerifyingKeys.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./Transfer1In2Out24DepthVk.sol\\\";\\nimport \\\"./Transfer2In2Out24DepthVk.sol\\\";\\nimport \\\"./Transfer2In3Out24DepthVk.sol\\\";\\nimport \\\"./Transfer3In3Out24DepthVk.sol\\\";\\nimport \\\"./Mint1In2Out24DepthVk.sol\\\";\\nimport \\\"./Freeze2In2Out24DepthVk.sol\\\";\\nimport \\\"./Freeze3In3Out24DepthVk.sol\\\";\\n\\nlibrary VerifyingKeys {\\n function getVkById(uint256 encodedId)\\n external\\n pure\\n returns (IPlonkVerifier.VerifyingKey memory)\\n {\\n if (encodedId == getEncodedId(0, 1, 2, 24)) {\\n // transfer/burn-1-input-2-output-24-depth\\n return Transfer1In2Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(0, 2, 2, 24)) {\\n // transfer/burn-2-input-2-output-24-depth\\n return Transfer2In2Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(0, 2, 3, 24)) {\\n // transfer/burn-2-input-3-output-24-depth\\n return Transfer2In3Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(0, 3, 3, 24)) {\\n // transfer/burn-3-input-3-output-24-depth\\n return Transfer3In3Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(1, 1, 2, 24)) {\\n // mint-1-input-2-output-24-depth\\n return Mint1In2Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(2, 2, 2, 24)) {\\n // freeze-2-input-2-output-24-depth\\n return Freeze2In2Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(2, 3, 3, 24)) {\\n // freeze-3-input-3-output-24-depth\\n return Freeze3In3Out24DepthVk.getVk();\\n } else {\\n revert(\\\"Unknown vk ID\\\");\\n }\\n }\\n\\n // returns (noteType, numInput, numOutput, treeDepth) as a 4*8 = 32 byte = uint256\\n // as the encoded ID.\\n function getEncodedId(\\n uint8 noteType,\\n uint8 numInput,\\n uint8 numOutput,\\n uint8 treeDepth\\n ) public pure returns (uint256 encodedId) {\\n assembly {\\n encodedId := add(\\n shl(24, noteType),\\n add(shl(16, numInput), add(shl(8, numOutput), treeDepth))\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe547ada74ff10128a51f61d3c1f5aeedd4efb5cc76399e74fa40aaaf062cd0fb\",\"license\":\"GPL-3.0-or-later\"},\"solidity-bytes-utils/contracts/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 \\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity >=0.8.0 <0.9.0;\\n\\n\\nlibrary BytesLib {\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(\\n fslot,\\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\\n ),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n uint16 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x2), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n uint32 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x4), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n uint64 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x8), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n uint96 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0xc), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n uint128 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x10), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n bytes32 tempBytes32;\\n\\n assembly {\\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempBytes32;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(\\n bytes storage _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n view\\n returns (bool)\\n {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n for {} eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n}\\n\",\"keccak256\":\"0xf75784dfc94ea43668eb195d5690a1dde1b6eda62017e73a3899721583821d29\",\"license\":\"Unlicense\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162005ae538038062005ae58339810160408190526200003491620001d9565b826001816001600160401b031611620000935760405162461bcd60e51b815260206004820152601860248201527f41206c65617374203220726f6f74732072657175697265640000000000000000604482015260640160405180910390fd5b806001600160401b03166001600160401b03811115620000b757620000b762000230565b604051908082528060200260200182016040528015620000e1578160200160208202803683370190505b508051620000f89160009160209091019062000155565b50506001600455600680546001600160a01b039384166801000000000000000002600160401b600160e01b031990911617905560078054919092166001600160a01b03199182161790915560098054909116331790555062000246565b82805482825590600052602060002090810192821562000193579160200282015b828111156200019357825182559160200191906001019062000176565b50620001a1929150620001a5565b5090565b5b80821115620001a15760008155600101620001a6565b80516001600160a01b0381168114620001d457600080fd5b919050565b600080600060608486031215620001ef57600080fd5b83516001600160401b03811681146200020757600080fd5b92506200021760208501620001bc565b91506200022760408501620001bc565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b61588f80620002566000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063a33ba96c116100d8578063d21e82ab1161008c578063f148fb4a11610066578063f148fb4a14610395578063f44ff712146103a8578063fe3cc3f8146103d557600080fd5b8063d21e82ab1461033c578063d56c1ea11461036f578063d5f394881461038257600080fd5b8063b12f7e7b116100bd578063b12f7e7b1461030e578063b4e28f1a14610321578063cb390b981461032957600080fd5b8063a33ba96c146102bf578063a7932794146102fb57600080fd5b80636868dd1f1161012f57806379cf6f5c1161011457806379cf6f5c1461026e5780639dd584b9146102765780639fda5b661461027e57600080fd5b80636868dd1f146102465780636de840601461025957600080fd5b806311829f931161016057806311829f93146101a45780631db6b253146101e55780636444c8d11461023057600080fd5b80630a2121451461017c57806310b4e3a114610191575b600080fd5b61018f61018a366004613c3b565b6103e9565b005b61018f61019f36600461466d565b610557565b6101cf6040518060400160405280600c81526020016b22b9a9a1a0a82290313ab93760a11b81525081565b6040516101dc919061475c565b60405180910390f35b61020c7f444f4d45535449435f415353455400000000000000000000000000000000000081565b60405171ffffffffffffffffffffffffffffffffffff1990911681526020016101dc565b610238610565565b6040519081526020016101dc565b61018f610254366004614776565b6105f1565b6102616107fd565b6040516101dc919061481b565b610238600181565b610238600a81565b6102a761028c36600461482a565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6102d66c1193d4915251d397d054d4d155609a1b81565b60405172ffffffffffffffffffffffffffffffffffffff1990911681526020016101dc565b61023861030936600461482a565b61082b565b61018f61031c366004614843565b61084c565b610238600c81565b61018f61033736600461486e565b610b0e565b61035f61034a36600461482a565b60056020526000908152604090205460ff1681565b60405190151581526020016101dc565b6102a761037d3660046148a3565b611431565b6009546102a7906001600160a01b031681565b61035f6103a33660046148a3565b61147a565b6006546103bc9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101dc565b60095461035f90600160a01b900460ff1681565b6001600160a01b0382166104445760405162461bcd60e51b815260206004820152601160248201527f426164206173736574206164647265737300000000000000000000000000000060448201526064015b60405180910390fd5b61044d8161147a565b1561049a5760405162461bcd60e51b815260206004820152601860248201527f417373657420616c726561647920726567697374657265640000000000000000604482015260640161043b565b6104ae816000015183338460200151611497565b6000816040516020016104c1919061481b565b60408051808303601f19018152828252805160209182012060008181526003835283902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891690811790915586519085529184019190915292507f0538524c1d0e6bf3f9f91710406853761e09b531b4fed8629307955608c82611910160405180910390a1505050565b61056083610b0e565b505050565b600754604080517f6444c8d100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691636444c8d19160048083019260209291908290030181865afa1580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec91906148c0565b905090565b6002600454036106435760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161043b565b600260045560208201516106569061147a565b6106a25760405162461bcd60e51b815260206004820152601f60248201527f417373657420646566696e6974696f6e206e6f74207265676973746572656400604482015260640161043b565b806001600160a01b03166106b98360200151611431565b6001600160a01b03161461070f5760405162461bcd60e51b815260206004820152601360248201527f57726f6e67204552433230206164647265737300000000000000000000000000604482015260640161043b565b600854600a116107615760405162461bcd60e51b815260206004820152601e60248201527f50656e64696e67206465706f736974732071756575652069732066756c6c0000604482015260640161043b565b600861076c83611552565b81546001810183556000928352602090922090910155815161079c908290339030906001600160801b0316611754565b7fe77062441218c146925a31d2ebba4cb3fd6ea3069cdf81c28822c31e3a8ca98e826040516020016107ce9190614935565b60408051601f19818403018152908290526107ec9184903390614944565b60405180910390a150506001600455565b6108056134b0565b600180825260208083018051518201839052805182015182018390525160400151015290565b6008818154811061083b57600080fd5b600091825260209091200154905081565b6009546001600160a01b031633146108a65760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c7920696e766f6361626c65206279206465706c6f796572000000000000604482015260640161043b565b600954600160a01b900460ff16156109005760405162461bcd60e51b815260206004820152601560248201527f46617563657420616c7265616479207365742075700000000000000000000000604482015260640161043b565b60006040518060c0016040528060026001600160801b0361092191906149a3565b6001600160801b031681526020016109376107fd565b815260208101859052604080820185905260006060830181905260809092018290528051600180825281830190925292935090919081602001602082028036833701905050905061098782611552565b8160008151811061099a5761099a6149c9565b602090810291909101015260075460405163330ee6a760e01b81526001600160a01b039091169063330ee6a7906109d5908490600401614a1a565b600060405180830381600087803b1580156109ef57600080fd5b505af1158015610a03573d6000803e3d6000fd5b50505050610a86600760009054906101000a90046001600160a01b03166001600160a01b0316636444c8d16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8191906148c0565b611803565b7fc27eb5ac1e750e98e913252f09c9b96d224b2ef9117e3a3cd446d5ecdd94aa8c82604051602001610ab89190614935565b60408051601f1981840301815290829052610ad29161475c565b60405180910390a15050600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790555050565b600260045403610b605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161043b565b6002600455600854600090610b8790610b788461194b565b610b829190614a2d565b611a70565b60208301515190915060008167ffffffffffffffff811115610bab57610bab613a16565b604051908082528060200260200182016040528015610be457816020015b610bd16134cf565b815260200190600190039081610bc95790505b50905060008267ffffffffffffffff811115610c0257610c02613a16565b604051908082528060200260200182016040528015610c3557816020015b6060815260200190600190039081610c205790505b50905060008367ffffffffffffffff811115610c5357610c53613a16565b604051908082528060200260200182016040528015610c8c57816020015b610c79613748565b815260200190600190039081610c715790505b50905060008467ffffffffffffffff811115610caa57610caa613a16565b604051908082528060200260200182016040528015610cdd57816020015b6060815260200190600190039081610cc85790505b509050600080808088158015610cf35750600854155b15610d405760405162461bcd60e51b815260206004820152601760248201527f426c6f636b206d757374206265206e6f6e2d656d707479000000000000000000604482015260640161043b565b60005b898110156111c45760008c602001518281518110610d6357610d636149c9565b6020026020010151905060006003811115610d8057610d80614a45565b816003811115610d9257610d92614a45565b03610ee85760008d604001518781518110610daf57610daf6149c9565b60200260200101519050600187610dc69190614a2d565b9650610dd9816080015160000151611ae3565b610de281611b44565b60065460808201516040015167ffffffffffffffff91821691161015610e4a5760405162461bcd60e51b815260206004820152600c60248201527f45787069726564206e6f74650000000000000000000000000000000000000000604482015260640161043b565b8051610e5590611ba2565b6020810151610e65908e90611be6565b610e6e81611c69565b8e8781518110610e8057610e806149c9565b602002602001018e8881518110610e9957610e996149c9565b602002602001018e8981518110610eb257610eb26149c9565b602002602001018e8a81518110610ecb57610ecb6149c9565b6020026020010184905284905284905284905250505050506111b1565b6001816003811115610efc57610efc614a45565b03610f8e5760008d606001518681518110610f1957610f196149c9565b60200260200101519050600186610f309190614a2d565b9550610f4481610100015160000151611ae3565b610f5a8160800151600001518260a00151612150565b8051610f65906121f7565b6020810151610f75908e90612271565b6040810151610f85908e90612271565b610e6e816122ab565b6002816003811115610fa257610fa2614a45565b0361100d5760008d608001518581518110610fbf57610fbf6149c9565b60200260200101519050600185610fd69190614a2d565b9450610fe9816060015160000151611ae3565b8051610ff490611ba2565b6020810151611004908e90611be6565b610e6e81612873565b600381600381111561102157611021614a45565b036111695760008d60a00151848151811061103e5761103e6149c9565b602002602001015190506001846110559190614a2d565b8151608001515190945061106890611ae3565b61107181612be8565b80515161107d90611ba2565b60005b815160200151518110156110dc57806001146110ca576110ca82600001516020015182815181106110b3576110b36149c9565b60200260200101518f61227190919063ffffffff16565b806110d481614a5b565b915050611080565b506110e681612c9c565b8e87815181106110f8576110f86149c9565b602002602001018e8881518110611111576111116149c9565b602002602001018e898151811061112a5761112a6149c9565b602002602001018e8a81518110611143576111436149c9565b602002602001018490528490528490528490525050505061116381612ccc565b506111b1565b60405162461bcd60e51b815260206004820152601260248201527f436170653a20756e726561636861626c65210000000000000000000000000000604482015260640161043b565b50806111bc81614a5b565b915050610d43565b5088156112b2576006546040517f830affd6000000000000000000000000000000000000000000000000000000008152680100000000000000009091046001600160a01b03169063830affd690611225908b908b908b908b90600401614d30565b602060405180830381865afa158015611242573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112669190614f9e565b6112b25760405162461bcd60e51b815260206004820152601a60248201527f436170653a20626174636820766572696679206661696c65642e000000000000604482015260640161043b565b60005b600854811015611301576112ef600882815481106112d5576112d56149c9565b90600052602060002001548c61227190919063ffffffff16565b806112f981614a5b565b9150506112b5565b5060208a0151156113c4576007548a5160405163330ee6a760e01b81526001600160a01b039092169163330ee6a79161133c91600401614a1a565b600060405180830381600087803b15801561135657600080fd5b505af115801561136a573d6000803e3d6000fd5b505050506113c4600760009054906101000a90046001600160a01b03166001600160a01b0316636444c8d16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a5d573d6000803e3d6000fd5b60068054600191906000906113e490849067ffffffffffffffff16614fbb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506114138b612d18565b61141f6008600061394d565b50506001600455505050505050505050565b60008082604051602001611445919061481b565b60408051601f198184030181529181528151602092830120600090815260039092529020546001600160a01b03169392505050565b60008061148683611431565b6001600160a01b0316141592915050565b60006114a4848484612e3e565b90506114fd6c1193d4915251d397d054d4d155609a1b826040516020016114cc929190614fe7565b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052612e90565b851461154b5760405162461bcd60e51b815260206004820152601860248201527f57726f6e6720666f726569676e20617373657420636f64650000000000000000604482015260640161043b565b5050505050565b600061100082602001516020015160600151106115b15760405162461bcd60e51b815260206004820152601a60248201527f52657665616c206d617020657863656564732031322062697473000000000000604482015260640161043b565b600082608001516115c35760006115c6565b60015b60ff168360200151602001516060015160026115e29190615023565b6115ec9190614a2d565b604080516101e08101825260a080870151825286516001600160801b0390811660208085019190915280890180515185870152898601805151606087015251820151608080870191909152815183015151519486019490945280518201515182015160c086015280518201518201515160e0860152805182015182015182015161010086015280518201518601515161012086015280518201518601518201516101408601526101608501879052510151909101511661018082015260006101a082018190526101c082015290517f8c5480360000000000000000000000000000000000000000000000000000000081529192509073646396e3fdB1Fbf73eE7F7381D6a25A6f7B919B890638c5480369061170b908490600401615042565b602060405180830381865af4158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c91906148c0565b949350505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af19150506117b781612f34565b61154b5760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000604482015260640161043b565b60008181526001602052604090205460ff16156118625760405162461bcd60e51b815260206004820152601360248201527f526f6f7420616c72656164792065786973747300000000000000000000000000604482015260640161043b565b6002546000805490916001918391829167ffffffffffffffff90911690811061188d5761188d6149c9565b60009182526020808320919091015483528201929092526040018120805460ff191692151592909217909155600254815483929167ffffffffffffffff169081106118da576118da6149c9565b600091825260208083209091019290925582815260019182905260408120805460ff19168317905554600254909161191c9167ffffffffffffffff1690614fbb565b6119269190615074565b6002805467ffffffffffffffff191667ffffffffffffffff9290921691909117905550565b60008082606001515160026119609190615023565b905060005b8360400151518110156119b45783604001518181518110611988576119886149c9565b60200260200101516020015151826119a09190614a2d565b9150806119ac81614a5b565b915050611965565b5060005b8360a0015151811015611a165760018460a0015182815181106119dd576119dd6149c9565b60200260200101516000015160200151516119f8919061509b565b611a029083614a2d565b915080611a0e81614a5b565b9150506119b8565b5060005b836080015151811015611a695783608001518181518110611a3d57611a3d6149c9565b6020026020010151602001515182611a559190614a2d565b915080611a6181614a5b565b915050611a1a565b5092915050565b60408051808201909152606081526000602082015260405180604001604052808367ffffffffffffffff811115611aa957611aa9613a16565b604051908082528060200260200182016040528015611ad2578160200160208202803683370190505b508152600060209091015292915050565b60008181526001602052604090205460ff16611b415760405162461bcd60e51b815260206004820152600e60248201527f526f6f74206e6f7420666f756e64000000000000000000000000000000000000604482015260640161043b565b50565b611b55816080015160800151612f7b565b15611b415760405162461bcd60e51b815260206004820152601c60248201527f4275726e2070726566697820696e207472616e73666572206e6f746500000000604482015260640161043b565b60005b8151811015611be257611bd0828281518110611bc357611bc36149c9565b60200260200101516121f7565b80611bda81614a5b565b915050611ba5565b5050565b60005b8151811015611c4e57818181518110611c0457611c046149c9565b60200260200101518360000151846020015183611c219190614a2d565b81518110611c3157611c316149c9565b602090810291909101015280611c4681614a5b565b915050611be9565b50805182602001818151611c629190614a2d565b9052505050565b611c716134cf565b6060611c7b613748565b606073C4E59193Fcbc2Ef3654B246C5503A3B14F741fbD63b95a6ecc816322e6017b60008951516020808c015151600754604080516319efb11d60e01b8152905192936001600160a01b03909216926319efb11d926004808401939192918290030181865afa158015611cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1691906150b2565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260ff9485166004820152928416602484015290831660448301529091166064820152608401602060405180830381865af4158015611d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da891906148c0565b6040518263ffffffff1660e01b8152600401611dc691815260200190565b6104c060405180830381865af4158015611de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e089190615105565b9350846060015160200151518560200151518660000151516004611e2c9190614a2d565b611e369190614a2d565b611e41906002614a2d565b611e4b9190614a2d565b67ffffffffffffffff811115611e6357611e63613a16565b604051908082528060200260200182016040528015611e8c578160200160208202803683370190505b50925084608001516000015183600081518110611eab57611eab6149c9565b602002602001018181525050600183600181518110611ecc57611ecc6149c9565b60200260200101818152505084608001516040015167ffffffffffffffff1683600281518110611efe57611efe6149c9565b6020026020010181815250508460800151602001516001600160801b031683600381518110611f2f57611f2f6149c9565b6020908102919091010152600460005b865151811015611f9f578651805182908110611f5d57611f5d6149c9565b6020026020010151858284611f729190614a2d565b81518110611f8257611f826149c9565b602090810291909101015280611f9781614a5b565b915050611f3f565b50855151611fad9082614a2d565b905060005b8660200151518110156120175786602001518181518110611fd557611fd56149c9565b6020026020010151858284611fea9190614a2d565b81518110611ffa57611ffa6149c9565b60209081029190910101528061200f81614a5b565b915050611fb2565b506020860151516120289082614a2d565b905085606001516000015160000151848281518110612049576120496149c9565b60209081029190910181019190915260608701515101518461206c836001614a2d565b8151811061207c5761207c6149c9565b6020908102919091010152612092600282614a2d565b905060005b866060015160200151518110156121045786606001516020015181815181106120c2576120c26149c9565b60200260200101518582846120d79190614a2d565b815181106120e7576120e76149c9565b6020908102919091010152806120fc81614a5b565b915050612097565b50508460400151915061211e856080015160600151612fcf565b856080015160800151604051602001612138929190615295565b60405160208183030381529060405290509193509193565b6121a97f444f4d45535449435f415353455400000000000000000000000000000000000061217d83613063565b60405171ffffffffffffffffffffffffffffffffffff199092166020830152602e820152604e016114cc565b8214611be25760405162461bcd60e51b815260206004820152601960248201527f57726f6e6720646f6d657374696320617373657420636f646500000000000000604482015260640161043b565b60008181526005602052604090205460ff16156122565760405162461bcd60e51b815260206004820152601b60248201527f4e756c6c696669657220616c7265616479207075626c69736865640000000000604482015260640161043b565b6000908152600560205260409020805460ff19166001179055565b80826000015183602001518151811061228c5761228c6149c9565b602002602001018181525050600182602001818151611c629190614a2d565b6122b36134cf565b60606122bd613748565b606073C4E59193Fcbc2Ef3654B246C5503A3B14F741fbD63b95a6ecc816322e6017b6001806002600760009054906101000a90046001600160a01b03166001600160a01b03166319efb11d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b91906150b2565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260ff9485166004820152928416602484015290831660448301529091166064820152608401602060405180830381865af41580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed91906148c0565b6040518263ffffffff1660e01b815260040161240b91815260200190565b6104c060405180830381865af4158015612429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244d9190615105565b93508460e00151602001515160136124659190614a2d565b67ffffffffffffffff81111561247d5761247d613a16565b6040519080825280602002602001820160405280156124a6578160200160208202803683370190505b50925084610100015160000151836000815181106124c6576124c66149c9565b6020026020010181815250506001836001815181106124e7576124e76149c9565b60200260200101818152505084600001518360028151811061250b5761250b6149c9565b602002602001018181525050846101000151602001516001600160801b03168360038151811061253d5761253d6149c9565b602002602001018181525050846040015183600481518110612561576125616149c9565b602002602001018181525050846020015183600581518110612585576125856149c9565b60200260200101818152505084606001516001600160801b0316836006815181106125b2576125b26149c9565b602002602001018181525050846080015160000151836007815181106125da576125da6149c9565b6020026020010181815250508460a00151836008815181106125fe576125fe6149c9565b602002602001018181525050846080015160200151606001518360098151811061262a5761262a6149c9565b602002602001018181525050846080015160200151600001516000015183600a8151811061265a5761265a6149c9565b602002602001018181525050846080015160200151600001516020015183600b8151811061268a5761268a6149c9565b602002602001018181525050846080015160200151602001516000015183600c815181106126ba576126ba6149c9565b602002602001018181525050846080015160200151602001516020015183600d815181106126ea576126ea6149c9565b602002602001018181525050846080015160200151604001516000015183600e8151811061271a5761271a6149c9565b602002602001018181525050846080015160200151604001516020015183600f8151811061274a5761274a6149c9565b602002602001018181525050846080015160200151608001516001600160801b03168360108151811061277f5761277f6149c9565b602090810291909101015260e085015151518351849060119081106127a6576127a66149c9565b6020026020010181815250508460e001516000015160200151836012815181106127d2576127d26149c9565b6020908102919091010152601360005b8660e00151602001515181101561284f578660e0015160200151818151811061280d5761280d6149c9565b60200260200101518582846128229190614a2d565b81518110612832576128326149c9565b60209081029190910101528061284781614a5b565b9150506127e2565b50508460c00151915061286a85610100015160400151612fcf565b90509193509193565b61287b6134cf565b6060612885613748565b606073C4E59193Fcbc2Ef3654B246C5503A3B14F741fbD63b95a6ecc816322e6017b60028951516020808c015151600754604080516319efb11d60e01b8152905192936001600160a01b03909216926319efb11d926004808401939192918290030181865afa1580156128fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292091906150b2565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260ff9485166004820152928416602484015290831660448301529091166064820152608401602060405180830381865af415801561298e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b291906148c0565b6040518263ffffffff1660e01b81526004016129d091815260200190565b6104c060405180830381865af41580156129ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a129190615105565b60208601515186515191955090612a2a906003614a2d565b612a349190614a2d565b67ffffffffffffffff811115612a4c57612a4c613a16565b604051908082528060200260200182016040528015612a75578160200160208202803683370190505b50925084606001516000015183600081518110612a9457612a946149c9565b602002602001018181525050600183600181518110612ab557612ab56149c9565b6020026020010181815250508460600151602001516001600160801b031683600281518110612ae657612ae66149c9565b6020908102919091010152600360005b865151811015612b56578651805182908110612b1457612b146149c9565b6020026020010151858284612b299190614a2d565b81518110612b3957612b396149c9565b602090810291909101015280612b4e81614a5b565b915050612af6565b50855151612b649082614a2d565b905060005b866020015151811015612bce5786602001518181518110612b8c57612b8c6149c9565b6020026020010151858284612ba19190614a2d565b81518110612bb157612bb16149c9565b602090810291909101015280612bc681614a5b565b915050612b69565b50508460400151915061286a856060015160400151612fcf565b80516080908101510151612bfb81612f7b565b612c475760405162461bcd60e51b815260206004820152600c60248201527f426164206275726e207461670000000000000000000000000000000000000000604482015260640161043b565b612c50826131af565b611be25760405162461bcd60e51b815260206004820152601560248201527f426164207265636f726420636f6d6d69746d656e740000000000000000000000604482015260640161043b565b612ca46134cf565b6060612cae613748565b6060612cbd8560000151611c69565b93509350935093509193509193565b6000612cdf826020015160200151611431565b90506000612cfa83600001516080015160800151600c613209565b905061056082828560200151600001516001600160801b031661327f565b600654815160405167ffffffffffffffff909216917fc34977751f08a257da613aa9db576f9b4edca0aef20e5b401f9c590a4d0c8fed91600891612d5f91906020016152bb565b6040516020818303038152906040528460200151604051602001612d8391906152d2565b6040516020818303038152906040528560400151604051602001612da79190615431565b6040516020818303038152906040528660600151604051602001612dcb91906154c6565b6040516020818303038152906040528760800151604051602001612def91906155b8565b6040516020818303038152906040528860a00151604051602001612e13919061565a565b60408051601f1981840301815290829052612e33979695949392916156d0565b60405180910390a250565b60608360601b8360601b83604051602001612e599190615799565b60408051601f1981840301815290829052612e789392916020016157a8565b60405160208183030381529060405290509392505050565b6000805b8251811015612f2e577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610100830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838260018651612ef6919061509b565b612f00919061509b565b81518110612f1057612f106149c9565b016020015160f81c8308915080612f2681614a5b565b915050612e94565b50919050565b60003d82612f4657806000803e806000fd5b8060208114612f5e578015612f6f5760009250612f74565b816000803e60005115159250612f74565b600192505b5050919050565b6000600c82511015612f8f57506000919050565b612fc9612f9f836000600c613325565b6040518060400160405280600c81526020016b22b9a9a1a0a82290313ab93760a11b81525061344d565b92915050565b6060600061300683602001517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160019190911b1090565b61302d57507f80000000000000000000000000000000000000000000000000000000000000005b825161303a908217613063565b60405160200161304c91815260200190565b604051602081830303815290604052915050919050565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b600060028260000151602001515110156131cb57506000919050565b60006131da8360200151611552565b90508260000151602001516001815181106131f7576131f76149c9565b60200260200101518114915050919050565b6000613216826014614a2d565b835110156132665760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015260640161043b565b5001602001516c01000000000000000000000000900490565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af19150506132d381612f34565b61331f5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c45440000000000000000000000000000000000604482015260640161043b565b50505050565b60608161333381601f614a2d565b10156133815760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161043b565b61338b8284614a2d565b845110156133db5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161043b565b6060821580156133fa5760405191506000825260208201604052613444565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561343357805183526020928301920161341b565b5050858452601f01601f1916604052505b50949350505050565b81518151600091600191811480831461346957600092506134a6565b600160208701838101602088015b60028483851001036134a15780518351146134955760009650600093505b60209283019201613477565b505050505b5090949350505050565b6040518060400160405280600081526020016134ca61396b565b905290565b6040518061028001604052806000815260200160008152602001613506604051806040016040528060008152602001600081525090565b8152602001613528604051806040016040528060008152602001600081525090565b815260200161354a604051806040016040528060008152602001600081525090565b815260200161356c604051806040016040528060008152602001600081525090565b815260200161358e604051806040016040528060008152602001600081525090565b81526020016135b0604051806040016040528060008152602001600081525090565b81526020016135d2604051806040016040528060008152602001600081525090565b81526020016135f4604051806040016040528060008152602001600081525090565b8152602001613616604051806040016040528060008152602001600081525090565b8152602001613638604051806040016040528060008152602001600081525090565b815260200161365a604051806040016040528060008152602001600081525090565b815260200161367c604051806040016040528060008152602001600081525090565b815260200161369e604051806040016040528060008152602001600081525090565b81526020016136c0604051806040016040528060008152602001600081525090565b81526020016136e2604051806040016040528060008152602001600081525090565b8152602001613704604051806040016040528060008152602001600081525090565b8152602001613726604051806040016040528060008152602001600081525090565b81526020016134ca604051806040016040528060008152602001600081525090565b60408051610320810190915260006102e082018181526103008301919091528190815260200161378b604051806040016040528060008152602001600081525090565b81526020016137ad604051806040016040528060008152602001600081525090565b81526020016137cf604051806040016040528060008152602001600081525090565b81526020016137f1604051806040016040528060008152602001600081525090565b8152602001613813604051806040016040528060008152602001600081525090565b8152602001613835604051806040016040528060008152602001600081525090565b8152602001613857604051806040016040528060008152602001600081525090565b8152602001613879604051806040016040528060008152602001600081525090565b815260200161389b604051806040016040528060008152602001600081525090565b81526020016138bd604051806040016040528060008152602001600081525090565b81526020016138df604051806040016040528060008152602001600081525090565b8152602001613901604051806040016040528060008152602001600081525090565b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5080546000825590600052602060002090810190611b4191906139e1565b6040805160e08101909152600060a0820181815260c0830191909152819081526020016139ab604051806040016040528060008152602001600081525090565b81526020016139cd604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156139f657600081556001016139e2565b5090565b80356001600160a01b0381168114613a1157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b60405290565b60405160a0810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b6040516102e0810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b604051610120810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b6040516080810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b60405160c0810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b604051610280810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b604051601f8201601f1916810167ffffffffffffffff81118282101715613b5357613b53613a16565b604052919050565b600060408284031215613b6d57600080fd5b613b75613a2c565b9050813581526020820135602082015292915050565b80356001600160801b0381168114613a1157600080fd5b6000818303610120811215613bb657600080fd5b613bbe613a2c565b91508235825261010080601f1983011215613bd857600080fd5b613be0613a55565b9150613bef8560208601613b5b565b8252613bfe8560608601613b5b565b6020830152613c108560a08601613b5b565b604083015260e08401356060830152613c2a818501613b8b565b608083015250602082015292915050565b6000806101408385031215613c4f57600080fd5b613c58836139fa565b9150613c678460208501613ba2565b90509250929050565b600067ffffffffffffffff821115613c8a57613c8a613a16565b5060051b60200190565b600082601f830112613ca557600080fd5b81356020613cba613cb583613c70565b613b2a565b82815260059290921b84018101918181019086841115613cd957600080fd5b8286015b84811015613d0257803560048110613cf55760008081fd5b8352918301918301613cdd565b509695505050505050565b600082601f830112613d1e57600080fd5b81356020613d2e613cb583613c70565b82815260059290921b84018101918181019086841115613d4d57600080fd5b8286015b84811015613d025780358352918301918301613d51565b60006104808284031215613d7b57600080fd5b613d83613a78565b9050613d8f8383613b5b565b8152613d9e8360408401613b5b565b6020820152613db08360808401613b5b565b6040820152613dc28360c08401613b5b565b6060820152610100613dd684828501613b5b565b6080830152610140613dea85828601613b5b565b60a0840152610180613dfe86828701613b5b565b60c08501526101c0613e1287828801613b5b565b60e0860152610200613e2688828901613b5b565b858701526102409450613e3b88868901613b5b565b610120870152610280613e5089828a01613b5b565b858801526102c09450613e6589868a01613b5b565b610160880152613e79896103008a01613b5b565b848801526103408801356101a0880152610360880135838801526103808801356101e08801526103a0880135828801526103c08801356102208801526103e08801358688015261040088013561026088015261042088013581880152505050506104408401356102a084015261046084013581840152505092915050565b600060608284031215613f0957600080fd5b613f11613a2c565b9050613f1d8383613b5b565b8152604082013567ffffffffffffffff811115613f3957600080fd5b613f4584828501613d0d565b60208301525092915050565b600060c08284031215613f6357600080fd5b613f6b613a55565b9050813581526020613f7e818401613b8b565b81830152604083013567ffffffffffffffff8082168214613f9e57600080fd5b816040850152613fb18660608701613b5b565b606085015260a0850135915080821115613fca57600080fd5b818501915085601f830112613fde57600080fd5b813581811115613ff057613ff0613a16565b614002601f8201601f19168501613b2a565b9150808252868482850101111561401857600080fd5b808484018584013760008482840101525080608085015250505092915050565b6000610500828403121561404b57600080fd5b614053613a55565b9050813567ffffffffffffffff8082111561406d57600080fd5b61407985838601613d0d565b8352602084013591508082111561408f57600080fd5b61409b85838601613d0d565b60208401526140ad8560408601613d68565b60408401526104c08401359150808211156140c757600080fd5b6140d385838601613ef7565b60608401526104e08401359150808211156140ed57600080fd5b506140fa84828501613f51565b60808301525092915050565b600082601f83011261411757600080fd5b81356020614127613cb583613c70565b82815260059290921b8401810191818101908684111561414657600080fd5b8286015b84811015613d0257803567ffffffffffffffff81111561416a5760008081fd5b6141788986838b0101614038565b84525091830191830161414a565b60006080828403121561419857600080fd5b6040516060810181811067ffffffffffffffff821117156141bb576141bb613a16565b604052823581529050806141d160208401613b8b565b60208201526141e38460408501613b5b565b60408201525092915050565b600082601f83011261420057600080fd5b81356020614210613cb583613c70565b82815260059290921b8401810191818101908684111561422f57600080fd5b8286015b84811015613d0257803567ffffffffffffffff808211156142545760008081fd5b908801906106e0828b03601f1901121561426e5760008081fd5b614276613a9c565b86830135815260408084013588830152606080850135828401526080915061429f828601613b8b565b9083015260a06142b18d868301613ba2565b828401526101c08501358184015250506142cf8b6101e08501613d68565b60c0820152610660830135828111156142e85760008081fd5b6142f68c8983870101613ef7565b60e08301525061430a8b6106808501614186565b61010082015285525050918301918301614233565b600082601f83011261433057600080fd5b81356020614340613cb583613c70565b82815260059290921b8401810191818101908684111561435f57600080fd5b8286015b84811015613d0257803567ffffffffffffffff808211156143845760008081fd5b90880190610540828b03601f1901121561439e5760008081fd5b6143a6613ac0565b86830135828111156143b85760008081fd5b6143c68c8983870101613d0d565b825250604080840135838111156143dd5760008081fd5b6143eb8d8a83880101613d0d565b8984015250606092506144008c848601613d68565b908201526144128b6104e08501614186565b91810191909152845250918301918301614363565b8015158114611b4157600080fd5b60006101e0828403121561444857600080fd5b614450613ae3565b905061445b82613b8b565b815261446a8360208401613ba2565b602082015261447d836101408401613b5b565b604082015261018082013560608201526101a082013561449c81614427565b60808201526101c0919091013560a0820152919050565b600082601f8301126144c457600080fd5b813560206144d4613cb583613c70565b82815260059290921b840181019181810190868411156144f357600080fd5b8286015b84811015613d0257803567ffffffffffffffff808211156145185760008081fd5b90880190610200828b03601f190112156145325760008081fd5b61453a613a2c565b868301358281111561454c5760008081fd5b61455a8c8983870101614038565b82525061456a8b60408501614435565b81880152855250509183019183016144f7565b600060e0828403121561458f57600080fd5b614597613ae3565b90506145a38383613b5b565b8152604082013567ffffffffffffffff808211156145c057600080fd5b6145cc85838601613c94565b602084015260608401359150808211156145e557600080fd5b6145f185838601614106565b6040840152608084013591508082111561460a57600080fd5b614616858386016141ef565b606084015260a084013591508082111561462f57600080fd5b61463b8583860161431f565b608084015260c084013591508082111561465457600080fd5b50614661848285016144b3565b60a08301525092915050565b60008060006040848603121561468257600080fd5b833567ffffffffffffffff8082111561469a57600080fd5b6146a68783880161457d565b945060208601359150808211156146bc57600080fd5b818601915086601f8301126146d057600080fd5b8135818111156146df57600080fd5b8760208285010111156146f157600080fd5b6020830194508093505050509250925092565b60005b8381101561471f578181015183820152602001614707565b8381111561331f5750506000910152565b60008151808452614748816020860160208601614704565b601f01601f19169290920160200192915050565b60208152600061476f6020830184614730565b9392505050565b600080610200838503121561478a57600080fd5b6147948484614435565b9150613c676101e084016139fa565b6147b882825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a084015250606081015160c0830152608001516001600160801b031660e090910152565b80518252602081015161056060208401826147a3565b6101208101612fc98284614805565b60006020828403121561483c57600080fd5b5035919050565b6000806060838503121561485657600080fd5b6148608484613b5b565b946040939093013593505050565b60006020828403121561488057600080fd5b813567ffffffffffffffff81111561489757600080fd5b61174c8482850161457d565b600061012082840312156148b657600080fd5b61476f8383613ba2565b6000602082840312156148d257600080fd5b5051919050565b6001600160801b03815116825260208101516148f86020840182614805565b5060408101518051610140840152602001516101608301526060810151610180830152608081015115156101a083015260a001516101c090910152565b6101e08101612fc982846148d9565b6060815260006149576060830186614730565b6001600160a01b0394851660208401529290931660409091015292915050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160801b03808416806149bd576149bd614977565b92169190910492915050565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015614a0f578151875295820195908201906001016149f3565b509495945050505050565b60208152600061476f60208301846149df565b60008219821115614a4057614a4061498d565b500190565b634e487b7160e01b600052602160045260246000fd5b600060018201614a6d57614a6d61498d565b5060010190565b600081518084526020808501808196508360051b8101915082860160005b85811015614abc578284038952614aaa8483516149df565b98850198935090840190600101614a92565b5091979650505050505050565b614ade82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100614b418185018380518252602090810151910152565b60a08301519150610140614b618186018480518252602090810151910152565b60c08401519250610180614b818187018580518252602090810151910152565b60e085015193506101c0614ba18188018680518252602090810151910152565b92850151935061020092614bc18785018680518252602090810151910152565b6101208601519450610240614be28189018780518252602090810151910152565b92860151945061028092614c028885018780518252602090810151910152565b61016087015195506102c0614c23818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b600081518084526020808501945080840160005b83811015614a0f57614cd4878351614ac9565b610480969096019590820190600101614cc1565b600081518084526020808501808196508360051b8101915082860160005b85811015614abc578284038952614d1e848351614730565b98850198935090840190600101614d06565b608080825285518282018190526000919060a090818501906020808b01865b83811015614f555781518051865283810151848701526040808201518051828901526020810151606089015250506060810151614d988988018280518252602090810151910152565b508781015160c0614db58189018380518252602090810151910152565b888301519150610100614dd4818a018480518252602090810151910152565b90830151915061014090614df48983018480518252602090810151910152565b60e08401519250610180614e14818b018580518252602090810151910152565b9084015192506101c090614e348a83018580518252602090810151910152565b6101208501519350610200614e55818c018680518252602090810151910152565b92850151935061024092614e758b85018680518252602090810151910152565b61016086015180516102808d01526020908101516102a08d01529186015180516102c08d01528201516102e08c01526101a086015180516103008d01528201516103208c01529185015180516103408c01528101516103608b01526101e085015180516103808c01528101516103a08b01529084015180516103c08b01528101516103e08a015261022084015180516104008b01528101516104208a01529083015180516104408a0152810151610460890152610260909201518051610480890152909101516104a0870152506104c09094019390820190600101614d4f565b50508683039087015250614f698189614a74565b925050508281036040840152614f7f8186614cad565b90508281036060840152614f938185614ce8565b979650505050505050565b600060208284031215614fb057600080fd5b815161476f81614427565b600067ffffffffffffffff808316818516808303821115614fde57614fde61498d565b01949350505050565b72ffffffffffffffffffffffffffffffffffffff19831681526000825161501581600d850160208701614704565b91909101600d019392505050565b600081600019048311821515161561503d5761503d61498d565b500290565b6101e08101818360005b600f81101561506b57815183526020928301929091019060010161504c565b50505092915050565b600067ffffffffffffffff8084168061508f5761508f614977565b92169190910692915050565b6000828210156150ad576150ad61498d565b500390565b6000602082840312156150c457600080fd5b815160ff8116811461476f57600080fd5b6000604082840312156150e757600080fd5b6150ef613a2c565b9050815181526020820151602082015292915050565b60006104c0828403121561511857600080fd5b615120613b06565b825181526020830151602082015261513b84604085016150d5565b604082015261514d84608085016150d5565b606082015261515f8460c085016150d5565b6080820152610100615173858286016150d5565b60a0830152610140615187868287016150d5565b60c084015261018061519b878288016150d5565b60e08501526101c06151af888289016150d5565b8486015261020093506151c4888589016150d5565b6101208601526102406151d989828a016150d5565b848701526151eb896102808a016150d5565b6101608701526151ff896102c08a016150d5565b83870152615211896103008a016150d5565b6101a0870152615225896103408a016150d5565b82870152615237896103808a016150d5565b6101e087015261524b896103c08a016150d5565b8587015261525d896104008a016150d5565b610220870152615271896104408a016150d5565b8187015250505050506152888461048085016150d5565b6102608201529392505050565b600083516152a7818460208801614704565b835190830190614fde818360208801614704565b815181526020808301519082015260408101612fc9565b602080825282518282018190526000919084820190604085019084805b82811015614abc578451600480821061531557634e487b7160e01b845260218152602484fd5b50845293850193928501926001016152ef565b61533d82825180518252602090810151910152565b600060208201516060604085015261174c60608501826149df565b6000610500825181855261536e828601826149df565b9150506020830151848203602086015261538882826149df565b915050604083015161539d6040860182614ac9565b5060608301518482036104c08601526153b68282615328565b91505060808301518482036104e0860152805182526001600160801b03602082015116602083015267ffffffffffffffff6040820151166040830152606081015161540e606084018280518252602090810151910152565b506080015160c060a0830181905261542890830182614730565b95945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561548657603f19888603018452615474858351615358565b94509285019290850190600101615458565b5092979650505050505050565b805182526001600160801b0360208201511660208301526040810151610560604084018280518252602090810151910152565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156155aa57603f1989840301855281516106e08151855288820151898601528782015188860152606080830151615531828801826001600160801b03169052565b505060808083015161554582880182614805565b505060a08201516101a086015260c08201516155656101c0870182614ac9565b5060e08201518161064087015261557e82870182615328565b9150506101008201519150615597610660860183615493565b95880195935050908601906001016154ed565b509098975050505050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156155aa57603f1989840301855281516105408151818652615606828701826149df565b915050888201518582038a87015261561e82826149df565b9150508782015161563189870182614ac9565b50606082015191506156476104c0860183615493565b95880195935050908601906001016155df565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561548657603f19888603018452815161020081518188526156a882890182615358565b9150508782015191506156bd888801836148d9565b9550509285019290850190600101615681565b600060e0820160e08352808a54808352610100850191508b600052602092508260002060005b82811015615712578154845292840192600191820191016156f6565b50505083810382850152615726818b614730565b915050828103604084015261573b8189614730565b9050828103606084015261574f8188614730565b905082810360808401526157638187614730565b905082810360a08401526157778186614730565b905082810360c084015261578b8185614730565b9a9950505050505050505050565b6101008101612fc982846147a3565b7f457353434150452045524332300000000000000000000000000000000000000081526bffffffffffffffffffffffff19848116600d8301527f73706f6e736f726564206279000000000000000000000000000000000000000060218301528316602d8201527f706f6c69637900000000000000000000000000000000000000000000000000006041820152815160009061584a816047850160208701614704565b9190910160470194935050505056fea2646970667358221220859879091ff5678ccc23d56bb576d7cdacc7deb5bdf59d1a7401c7ed937c26cc64736f6c634300080d0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063a33ba96c116100d8578063d21e82ab1161008c578063f148fb4a11610066578063f148fb4a14610395578063f44ff712146103a8578063fe3cc3f8146103d557600080fd5b8063d21e82ab1461033c578063d56c1ea11461036f578063d5f394881461038257600080fd5b8063b12f7e7b116100bd578063b12f7e7b1461030e578063b4e28f1a14610321578063cb390b981461032957600080fd5b8063a33ba96c146102bf578063a7932794146102fb57600080fd5b80636868dd1f1161012f57806379cf6f5c1161011457806379cf6f5c1461026e5780639dd584b9146102765780639fda5b661461027e57600080fd5b80636868dd1f146102465780636de840601461025957600080fd5b806311829f931161016057806311829f93146101a45780631db6b253146101e55780636444c8d11461023057600080fd5b80630a2121451461017c57806310b4e3a114610191575b600080fd5b61018f61018a366004613c3b565b6103e9565b005b61018f61019f36600461466d565b610557565b6101cf6040518060400160405280600c81526020016b22b9a9a1a0a82290313ab93760a11b81525081565b6040516101dc919061475c565b60405180910390f35b61020c7f444f4d45535449435f415353455400000000000000000000000000000000000081565b60405171ffffffffffffffffffffffffffffffffffff1990911681526020016101dc565b610238610565565b6040519081526020016101dc565b61018f610254366004614776565b6105f1565b6102616107fd565b6040516101dc919061481b565b610238600181565b610238600a81565b6102a761028c36600461482a565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6102d66c1193d4915251d397d054d4d155609a1b81565b60405172ffffffffffffffffffffffffffffffffffffff1990911681526020016101dc565b61023861030936600461482a565b61082b565b61018f61031c366004614843565b61084c565b610238600c81565b61018f61033736600461486e565b610b0e565b61035f61034a36600461482a565b60056020526000908152604090205460ff1681565b60405190151581526020016101dc565b6102a761037d3660046148a3565b611431565b6009546102a7906001600160a01b031681565b61035f6103a33660046148a3565b61147a565b6006546103bc9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101dc565b60095461035f90600160a01b900460ff1681565b6001600160a01b0382166104445760405162461bcd60e51b815260206004820152601160248201527f426164206173736574206164647265737300000000000000000000000000000060448201526064015b60405180910390fd5b61044d8161147a565b1561049a5760405162461bcd60e51b815260206004820152601860248201527f417373657420616c726561647920726567697374657265640000000000000000604482015260640161043b565b6104ae816000015183338460200151611497565b6000816040516020016104c1919061481b565b60408051808303601f19018152828252805160209182012060008181526003835283902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891690811790915586519085529184019190915292507f0538524c1d0e6bf3f9f91710406853761e09b531b4fed8629307955608c82611910160405180910390a1505050565b61056083610b0e565b505050565b600754604080517f6444c8d100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691636444c8d19160048083019260209291908290030181865afa1580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec91906148c0565b905090565b6002600454036106435760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161043b565b600260045560208201516106569061147a565b6106a25760405162461bcd60e51b815260206004820152601f60248201527f417373657420646566696e6974696f6e206e6f74207265676973746572656400604482015260640161043b565b806001600160a01b03166106b98360200151611431565b6001600160a01b03161461070f5760405162461bcd60e51b815260206004820152601360248201527f57726f6e67204552433230206164647265737300000000000000000000000000604482015260640161043b565b600854600a116107615760405162461bcd60e51b815260206004820152601e60248201527f50656e64696e67206465706f736974732071756575652069732066756c6c0000604482015260640161043b565b600861076c83611552565b81546001810183556000928352602090922090910155815161079c908290339030906001600160801b0316611754565b7fe77062441218c146925a31d2ebba4cb3fd6ea3069cdf81c28822c31e3a8ca98e826040516020016107ce9190614935565b60408051601f19818403018152908290526107ec9184903390614944565b60405180910390a150506001600455565b6108056134b0565b600180825260208083018051518201839052805182015182018390525160400151015290565b6008818154811061083b57600080fd5b600091825260209091200154905081565b6009546001600160a01b031633146108a65760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c7920696e766f6361626c65206279206465706c6f796572000000000000604482015260640161043b565b600954600160a01b900460ff16156109005760405162461bcd60e51b815260206004820152601560248201527f46617563657420616c7265616479207365742075700000000000000000000000604482015260640161043b565b60006040518060c0016040528060026001600160801b0361092191906149a3565b6001600160801b031681526020016109376107fd565b815260208101859052604080820185905260006060830181905260809092018290528051600180825281830190925292935090919081602001602082028036833701905050905061098782611552565b8160008151811061099a5761099a6149c9565b602090810291909101015260075460405163330ee6a760e01b81526001600160a01b039091169063330ee6a7906109d5908490600401614a1a565b600060405180830381600087803b1580156109ef57600080fd5b505af1158015610a03573d6000803e3d6000fd5b50505050610a86600760009054906101000a90046001600160a01b03166001600160a01b0316636444c8d16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8191906148c0565b611803565b7fc27eb5ac1e750e98e913252f09c9b96d224b2ef9117e3a3cd446d5ecdd94aa8c82604051602001610ab89190614935565b60408051601f1981840301815290829052610ad29161475c565b60405180910390a15050600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790555050565b600260045403610b605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161043b565b6002600455600854600090610b8790610b788461194b565b610b829190614a2d565b611a70565b60208301515190915060008167ffffffffffffffff811115610bab57610bab613a16565b604051908082528060200260200182016040528015610be457816020015b610bd16134cf565b815260200190600190039081610bc95790505b50905060008267ffffffffffffffff811115610c0257610c02613a16565b604051908082528060200260200182016040528015610c3557816020015b6060815260200190600190039081610c205790505b50905060008367ffffffffffffffff811115610c5357610c53613a16565b604051908082528060200260200182016040528015610c8c57816020015b610c79613748565b815260200190600190039081610c715790505b50905060008467ffffffffffffffff811115610caa57610caa613a16565b604051908082528060200260200182016040528015610cdd57816020015b6060815260200190600190039081610cc85790505b509050600080808088158015610cf35750600854155b15610d405760405162461bcd60e51b815260206004820152601760248201527f426c6f636b206d757374206265206e6f6e2d656d707479000000000000000000604482015260640161043b565b60005b898110156111c45760008c602001518281518110610d6357610d636149c9565b6020026020010151905060006003811115610d8057610d80614a45565b816003811115610d9257610d92614a45565b03610ee85760008d604001518781518110610daf57610daf6149c9565b60200260200101519050600187610dc69190614a2d565b9650610dd9816080015160000151611ae3565b610de281611b44565b60065460808201516040015167ffffffffffffffff91821691161015610e4a5760405162461bcd60e51b815260206004820152600c60248201527f45787069726564206e6f74650000000000000000000000000000000000000000604482015260640161043b565b8051610e5590611ba2565b6020810151610e65908e90611be6565b610e6e81611c69565b8e8781518110610e8057610e806149c9565b602002602001018e8881518110610e9957610e996149c9565b602002602001018e8981518110610eb257610eb26149c9565b602002602001018e8a81518110610ecb57610ecb6149c9565b6020026020010184905284905284905284905250505050506111b1565b6001816003811115610efc57610efc614a45565b03610f8e5760008d606001518681518110610f1957610f196149c9565b60200260200101519050600186610f309190614a2d565b9550610f4481610100015160000151611ae3565b610f5a8160800151600001518260a00151612150565b8051610f65906121f7565b6020810151610f75908e90612271565b6040810151610f85908e90612271565b610e6e816122ab565b6002816003811115610fa257610fa2614a45565b0361100d5760008d608001518581518110610fbf57610fbf6149c9565b60200260200101519050600185610fd69190614a2d565b9450610fe9816060015160000151611ae3565b8051610ff490611ba2565b6020810151611004908e90611be6565b610e6e81612873565b600381600381111561102157611021614a45565b036111695760008d60a00151848151811061103e5761103e6149c9565b602002602001015190506001846110559190614a2d565b8151608001515190945061106890611ae3565b61107181612be8565b80515161107d90611ba2565b60005b815160200151518110156110dc57806001146110ca576110ca82600001516020015182815181106110b3576110b36149c9565b60200260200101518f61227190919063ffffffff16565b806110d481614a5b565b915050611080565b506110e681612c9c565b8e87815181106110f8576110f86149c9565b602002602001018e8881518110611111576111116149c9565b602002602001018e898151811061112a5761112a6149c9565b602002602001018e8a81518110611143576111436149c9565b602002602001018490528490528490528490525050505061116381612ccc565b506111b1565b60405162461bcd60e51b815260206004820152601260248201527f436170653a20756e726561636861626c65210000000000000000000000000000604482015260640161043b565b50806111bc81614a5b565b915050610d43565b5088156112b2576006546040517f830affd6000000000000000000000000000000000000000000000000000000008152680100000000000000009091046001600160a01b03169063830affd690611225908b908b908b908b90600401614d30565b602060405180830381865afa158015611242573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112669190614f9e565b6112b25760405162461bcd60e51b815260206004820152601a60248201527f436170653a20626174636820766572696679206661696c65642e000000000000604482015260640161043b565b60005b600854811015611301576112ef600882815481106112d5576112d56149c9565b90600052602060002001548c61227190919063ffffffff16565b806112f981614a5b565b9150506112b5565b5060208a0151156113c4576007548a5160405163330ee6a760e01b81526001600160a01b039092169163330ee6a79161133c91600401614a1a565b600060405180830381600087803b15801561135657600080fd5b505af115801561136a573d6000803e3d6000fd5b505050506113c4600760009054906101000a90046001600160a01b03166001600160a01b0316636444c8d16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a5d573d6000803e3d6000fd5b60068054600191906000906113e490849067ffffffffffffffff16614fbb565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506114138b612d18565b61141f6008600061394d565b50506001600455505050505050505050565b60008082604051602001611445919061481b565b60408051601f198184030181529181528151602092830120600090815260039092529020546001600160a01b03169392505050565b60008061148683611431565b6001600160a01b0316141592915050565b60006114a4848484612e3e565b90506114fd6c1193d4915251d397d054d4d155609a1b826040516020016114cc929190614fe7565b60408051601f1981840301815282825280516020918201209083015201604051602081830303815290604052612e90565b851461154b5760405162461bcd60e51b815260206004820152601860248201527f57726f6e6720666f726569676e20617373657420636f64650000000000000000604482015260640161043b565b5050505050565b600061100082602001516020015160600151106115b15760405162461bcd60e51b815260206004820152601a60248201527f52657665616c206d617020657863656564732031322062697473000000000000604482015260640161043b565b600082608001516115c35760006115c6565b60015b60ff168360200151602001516060015160026115e29190615023565b6115ec9190614a2d565b604080516101e08101825260a080870151825286516001600160801b0390811660208085019190915280890180515185870152898601805151606087015251820151608080870191909152815183015151519486019490945280518201515182015160c086015280518201518201515160e0860152805182015182015182015161010086015280518201518601515161012086015280518201518601518201516101408601526101608501879052510151909101511661018082015260006101a082018190526101c082015290517f8c5480360000000000000000000000000000000000000000000000000000000081529192509073__$2783a64b147d5f689049cabc192a316d9d$__90638c5480369061170b908490600401615042565b602060405180830381865af4158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c91906148c0565b949350505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526001600160a01b038416602482015282604482015260008060648360008a5af19150506117b781612f34565b61154b5760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000604482015260640161043b565b60008181526001602052604090205460ff16156118625760405162461bcd60e51b815260206004820152601360248201527f526f6f7420616c72656164792065786973747300000000000000000000000000604482015260640161043b565b6002546000805490916001918391829167ffffffffffffffff90911690811061188d5761188d6149c9565b60009182526020808320919091015483528201929092526040018120805460ff191692151592909217909155600254815483929167ffffffffffffffff169081106118da576118da6149c9565b600091825260208083209091019290925582815260019182905260408120805460ff19168317905554600254909161191c9167ffffffffffffffff1690614fbb565b6119269190615074565b6002805467ffffffffffffffff191667ffffffffffffffff9290921691909117905550565b60008082606001515160026119609190615023565b905060005b8360400151518110156119b45783604001518181518110611988576119886149c9565b60200260200101516020015151826119a09190614a2d565b9150806119ac81614a5b565b915050611965565b5060005b8360a0015151811015611a165760018460a0015182815181106119dd576119dd6149c9565b60200260200101516000015160200151516119f8919061509b565b611a029083614a2d565b915080611a0e81614a5b565b9150506119b8565b5060005b836080015151811015611a695783608001518181518110611a3d57611a3d6149c9565b6020026020010151602001515182611a559190614a2d565b915080611a6181614a5b565b915050611a1a565b5092915050565b60408051808201909152606081526000602082015260405180604001604052808367ffffffffffffffff811115611aa957611aa9613a16565b604051908082528060200260200182016040528015611ad2578160200160208202803683370190505b508152600060209091015292915050565b60008181526001602052604090205460ff16611b415760405162461bcd60e51b815260206004820152600e60248201527f526f6f74206e6f7420666f756e64000000000000000000000000000000000000604482015260640161043b565b50565b611b55816080015160800151612f7b565b15611b415760405162461bcd60e51b815260206004820152601c60248201527f4275726e2070726566697820696e207472616e73666572206e6f746500000000604482015260640161043b565b60005b8151811015611be257611bd0828281518110611bc357611bc36149c9565b60200260200101516121f7565b80611bda81614a5b565b915050611ba5565b5050565b60005b8151811015611c4e57818181518110611c0457611c046149c9565b60200260200101518360000151846020015183611c219190614a2d565b81518110611c3157611c316149c9565b602090810291909101015280611c4681614a5b565b915050611be9565b50805182602001818151611c629190614a2d565b9052505050565b611c716134cf565b6060611c7b613748565b606073__$83dbcae801b35109718c5df795b4aa345f$__63b95a6ecc816322e6017b60008951516020808c015151600754604080516319efb11d60e01b8152905192936001600160a01b03909216926319efb11d926004808401939192918290030181865afa158015611cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1691906150b2565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260ff9485166004820152928416602484015290831660448301529091166064820152608401602060405180830381865af4158015611d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da891906148c0565b6040518263ffffffff1660e01b8152600401611dc691815260200190565b6104c060405180830381865af4158015611de4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e089190615105565b9350846060015160200151518560200151518660000151516004611e2c9190614a2d565b611e369190614a2d565b611e41906002614a2d565b611e4b9190614a2d565b67ffffffffffffffff811115611e6357611e63613a16565b604051908082528060200260200182016040528015611e8c578160200160208202803683370190505b50925084608001516000015183600081518110611eab57611eab6149c9565b602002602001018181525050600183600181518110611ecc57611ecc6149c9565b60200260200101818152505084608001516040015167ffffffffffffffff1683600281518110611efe57611efe6149c9565b6020026020010181815250508460800151602001516001600160801b031683600381518110611f2f57611f2f6149c9565b6020908102919091010152600460005b865151811015611f9f578651805182908110611f5d57611f5d6149c9565b6020026020010151858284611f729190614a2d565b81518110611f8257611f826149c9565b602090810291909101015280611f9781614a5b565b915050611f3f565b50855151611fad9082614a2d565b905060005b8660200151518110156120175786602001518181518110611fd557611fd56149c9565b6020026020010151858284611fea9190614a2d565b81518110611ffa57611ffa6149c9565b60209081029190910101528061200f81614a5b565b915050611fb2565b506020860151516120289082614a2d565b905085606001516000015160000151848281518110612049576120496149c9565b60209081029190910181019190915260608701515101518461206c836001614a2d565b8151811061207c5761207c6149c9565b6020908102919091010152612092600282614a2d565b905060005b866060015160200151518110156121045786606001516020015181815181106120c2576120c26149c9565b60200260200101518582846120d79190614a2d565b815181106120e7576120e76149c9565b6020908102919091010152806120fc81614a5b565b915050612097565b50508460400151915061211e856080015160600151612fcf565b856080015160800151604051602001612138929190615295565b60405160208183030381529060405290509193509193565b6121a97f444f4d45535449435f415353455400000000000000000000000000000000000061217d83613063565b60405171ffffffffffffffffffffffffffffffffffff199092166020830152602e820152604e016114cc565b8214611be25760405162461bcd60e51b815260206004820152601960248201527f57726f6e6720646f6d657374696320617373657420636f646500000000000000604482015260640161043b565b60008181526005602052604090205460ff16156122565760405162461bcd60e51b815260206004820152601b60248201527f4e756c6c696669657220616c7265616479207075626c69736865640000000000604482015260640161043b565b6000908152600560205260409020805460ff19166001179055565b80826000015183602001518151811061228c5761228c6149c9565b602002602001018181525050600182602001818151611c629190614a2d565b6122b36134cf565b60606122bd613748565b606073__$83dbcae801b35109718c5df795b4aa345f$__63b95a6ecc816322e6017b6001806002600760009054906101000a90046001600160a01b03166001600160a01b03166319efb11d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b91906150b2565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260ff9485166004820152928416602484015290831660448301529091166064820152608401602060405180830381865af41580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed91906148c0565b6040518263ffffffff1660e01b815260040161240b91815260200190565b6104c060405180830381865af4158015612429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244d9190615105565b93508460e00151602001515160136124659190614a2d565b67ffffffffffffffff81111561247d5761247d613a16565b6040519080825280602002602001820160405280156124a6578160200160208202803683370190505b50925084610100015160000151836000815181106124c6576124c66149c9565b6020026020010181815250506001836001815181106124e7576124e76149c9565b60200260200101818152505084600001518360028151811061250b5761250b6149c9565b602002602001018181525050846101000151602001516001600160801b03168360038151811061253d5761253d6149c9565b602002602001018181525050846040015183600481518110612561576125616149c9565b602002602001018181525050846020015183600581518110612585576125856149c9565b60200260200101818152505084606001516001600160801b0316836006815181106125b2576125b26149c9565b602002602001018181525050846080015160000151836007815181106125da576125da6149c9565b6020026020010181815250508460a00151836008815181106125fe576125fe6149c9565b602002602001018181525050846080015160200151606001518360098151811061262a5761262a6149c9565b602002602001018181525050846080015160200151600001516000015183600a8151811061265a5761265a6149c9565b602002602001018181525050846080015160200151600001516020015183600b8151811061268a5761268a6149c9565b602002602001018181525050846080015160200151602001516000015183600c815181106126ba576126ba6149c9565b602002602001018181525050846080015160200151602001516020015183600d815181106126ea576126ea6149c9565b602002602001018181525050846080015160200151604001516000015183600e8151811061271a5761271a6149c9565b602002602001018181525050846080015160200151604001516020015183600f8151811061274a5761274a6149c9565b602002602001018181525050846080015160200151608001516001600160801b03168360108151811061277f5761277f6149c9565b602090810291909101015260e085015151518351849060119081106127a6576127a66149c9565b6020026020010181815250508460e001516000015160200151836012815181106127d2576127d26149c9565b6020908102919091010152601360005b8660e00151602001515181101561284f578660e0015160200151818151811061280d5761280d6149c9565b60200260200101518582846128229190614a2d565b81518110612832576128326149c9565b60209081029190910101528061284781614a5b565b9150506127e2565b50508460c00151915061286a85610100015160400151612fcf565b90509193509193565b61287b6134cf565b6060612885613748565b606073__$83dbcae801b35109718c5df795b4aa345f$__63b95a6ecc816322e6017b60028951516020808c015151600754604080516319efb11d60e01b8152905192936001600160a01b03909216926319efb11d926004808401939192918290030181865afa1580156128fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292091906150b2565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260ff9485166004820152928416602484015290831660448301529091166064820152608401602060405180830381865af415801561298e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b291906148c0565b6040518263ffffffff1660e01b81526004016129d091815260200190565b6104c060405180830381865af41580156129ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a129190615105565b60208601515186515191955090612a2a906003614a2d565b612a349190614a2d565b67ffffffffffffffff811115612a4c57612a4c613a16565b604051908082528060200260200182016040528015612a75578160200160208202803683370190505b50925084606001516000015183600081518110612a9457612a946149c9565b602002602001018181525050600183600181518110612ab557612ab56149c9565b6020026020010181815250508460600151602001516001600160801b031683600281518110612ae657612ae66149c9565b6020908102919091010152600360005b865151811015612b56578651805182908110612b1457612b146149c9565b6020026020010151858284612b299190614a2d565b81518110612b3957612b396149c9565b602090810291909101015280612b4e81614a5b565b915050612af6565b50855151612b649082614a2d565b905060005b866020015151811015612bce5786602001518181518110612b8c57612b8c6149c9565b6020026020010151858284612ba19190614a2d565b81518110612bb157612bb16149c9565b602090810291909101015280612bc681614a5b565b915050612b69565b50508460400151915061286a856060015160400151612fcf565b80516080908101510151612bfb81612f7b565b612c475760405162461bcd60e51b815260206004820152600c60248201527f426164206275726e207461670000000000000000000000000000000000000000604482015260640161043b565b612c50826131af565b611be25760405162461bcd60e51b815260206004820152601560248201527f426164207265636f726420636f6d6d69746d656e740000000000000000000000604482015260640161043b565b612ca46134cf565b6060612cae613748565b6060612cbd8560000151611c69565b93509350935093509193509193565b6000612cdf826020015160200151611431565b90506000612cfa83600001516080015160800151600c613209565b905061056082828560200151600001516001600160801b031661327f565b600654815160405167ffffffffffffffff909216917fc34977751f08a257da613aa9db576f9b4edca0aef20e5b401f9c590a4d0c8fed91600891612d5f91906020016152bb565b6040516020818303038152906040528460200151604051602001612d8391906152d2565b6040516020818303038152906040528560400151604051602001612da79190615431565b6040516020818303038152906040528660600151604051602001612dcb91906154c6565b6040516020818303038152906040528760800151604051602001612def91906155b8565b6040516020818303038152906040528860a00151604051602001612e13919061565a565b60408051601f1981840301815290829052612e33979695949392916156d0565b60405180910390a250565b60608360601b8360601b83604051602001612e599190615799565b60408051601f1981840301815290829052612e789392916020016157a8565b60405160208183030381529060405290509392505050565b6000805b8251811015612f2e577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610100830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838260018651612ef6919061509b565b612f00919061509b565b81518110612f1057612f106149c9565b016020015160f81c8308915080612f2681614a5b565b915050612e94565b50919050565b60003d82612f4657806000803e806000fd5b8060208114612f5e578015612f6f5760009250612f74565b816000803e60005115159250612f74565b600192505b5050919050565b6000600c82511015612f8f57506000919050565b612fc9612f9f836000600c613325565b6040518060400160405280600c81526020016b22b9a9a1a0a82290313ab93760a11b81525061344d565b92915050565b6060600061300683602001517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160019190911b1090565b61302d57507f80000000000000000000000000000000000000000000000000000000000000005b825161303a908217613063565b60405160200161304c91815260200190565b604051602081830303815290604052915050919050565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b600060028260000151602001515110156131cb57506000919050565b60006131da8360200151611552565b90508260000151602001516001815181106131f7576131f76149c9565b60200260200101518114915050919050565b6000613216826014614a2d565b835110156132665760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015260640161043b565b5001602001516c01000000000000000000000000900490565b60006040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201528260248201526000806044836000895af19150506132d381612f34565b61331f5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c45440000000000000000000000000000000000604482015260640161043b565b50505050565b60608161333381601f614a2d565b10156133815760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161043b565b61338b8284614a2d565b845110156133db5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161043b565b6060821580156133fa5760405191506000825260208201604052613444565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561343357805183526020928301920161341b565b5050858452601f01601f1916604052505b50949350505050565b81518151600091600191811480831461346957600092506134a6565b600160208701838101602088015b60028483851001036134a15780518351146134955760009650600093505b60209283019201613477565b505050505b5090949350505050565b6040518060400160405280600081526020016134ca61396b565b905290565b6040518061028001604052806000815260200160008152602001613506604051806040016040528060008152602001600081525090565b8152602001613528604051806040016040528060008152602001600081525090565b815260200161354a604051806040016040528060008152602001600081525090565b815260200161356c604051806040016040528060008152602001600081525090565b815260200161358e604051806040016040528060008152602001600081525090565b81526020016135b0604051806040016040528060008152602001600081525090565b81526020016135d2604051806040016040528060008152602001600081525090565b81526020016135f4604051806040016040528060008152602001600081525090565b8152602001613616604051806040016040528060008152602001600081525090565b8152602001613638604051806040016040528060008152602001600081525090565b815260200161365a604051806040016040528060008152602001600081525090565b815260200161367c604051806040016040528060008152602001600081525090565b815260200161369e604051806040016040528060008152602001600081525090565b81526020016136c0604051806040016040528060008152602001600081525090565b81526020016136e2604051806040016040528060008152602001600081525090565b8152602001613704604051806040016040528060008152602001600081525090565b8152602001613726604051806040016040528060008152602001600081525090565b81526020016134ca604051806040016040528060008152602001600081525090565b60408051610320810190915260006102e082018181526103008301919091528190815260200161378b604051806040016040528060008152602001600081525090565b81526020016137ad604051806040016040528060008152602001600081525090565b81526020016137cf604051806040016040528060008152602001600081525090565b81526020016137f1604051806040016040528060008152602001600081525090565b8152602001613813604051806040016040528060008152602001600081525090565b8152602001613835604051806040016040528060008152602001600081525090565b8152602001613857604051806040016040528060008152602001600081525090565b8152602001613879604051806040016040528060008152602001600081525090565b815260200161389b604051806040016040528060008152602001600081525090565b81526020016138bd604051806040016040528060008152602001600081525090565b81526020016138df604051806040016040528060008152602001600081525090565b8152602001613901604051806040016040528060008152602001600081525090565b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5080546000825590600052602060002090810190611b4191906139e1565b6040805160e08101909152600060a0820181815260c0830191909152819081526020016139ab604051806040016040528060008152602001600081525090565b81526020016139cd604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156139f657600081556001016139e2565b5090565b80356001600160a01b0381168114613a1157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b60405290565b60405160a0810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b6040516102e0810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b604051610120810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b6040516080810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b60405160c0810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b604051610280810167ffffffffffffffff81118282101715613a4f57613a4f613a16565b604051601f8201601f1916810167ffffffffffffffff81118282101715613b5357613b53613a16565b604052919050565b600060408284031215613b6d57600080fd5b613b75613a2c565b9050813581526020820135602082015292915050565b80356001600160801b0381168114613a1157600080fd5b6000818303610120811215613bb657600080fd5b613bbe613a2c565b91508235825261010080601f1983011215613bd857600080fd5b613be0613a55565b9150613bef8560208601613b5b565b8252613bfe8560608601613b5b565b6020830152613c108560a08601613b5b565b604083015260e08401356060830152613c2a818501613b8b565b608083015250602082015292915050565b6000806101408385031215613c4f57600080fd5b613c58836139fa565b9150613c678460208501613ba2565b90509250929050565b600067ffffffffffffffff821115613c8a57613c8a613a16565b5060051b60200190565b600082601f830112613ca557600080fd5b81356020613cba613cb583613c70565b613b2a565b82815260059290921b84018101918181019086841115613cd957600080fd5b8286015b84811015613d0257803560048110613cf55760008081fd5b8352918301918301613cdd565b509695505050505050565b600082601f830112613d1e57600080fd5b81356020613d2e613cb583613c70565b82815260059290921b84018101918181019086841115613d4d57600080fd5b8286015b84811015613d025780358352918301918301613d51565b60006104808284031215613d7b57600080fd5b613d83613a78565b9050613d8f8383613b5b565b8152613d9e8360408401613b5b565b6020820152613db08360808401613b5b565b6040820152613dc28360c08401613b5b565b6060820152610100613dd684828501613b5b565b6080830152610140613dea85828601613b5b565b60a0840152610180613dfe86828701613b5b565b60c08501526101c0613e1287828801613b5b565b60e0860152610200613e2688828901613b5b565b858701526102409450613e3b88868901613b5b565b610120870152610280613e5089828a01613b5b565b858801526102c09450613e6589868a01613b5b565b610160880152613e79896103008a01613b5b565b848801526103408801356101a0880152610360880135838801526103808801356101e08801526103a0880135828801526103c08801356102208801526103e08801358688015261040088013561026088015261042088013581880152505050506104408401356102a084015261046084013581840152505092915050565b600060608284031215613f0957600080fd5b613f11613a2c565b9050613f1d8383613b5b565b8152604082013567ffffffffffffffff811115613f3957600080fd5b613f4584828501613d0d565b60208301525092915050565b600060c08284031215613f6357600080fd5b613f6b613a55565b9050813581526020613f7e818401613b8b565b81830152604083013567ffffffffffffffff8082168214613f9e57600080fd5b816040850152613fb18660608701613b5b565b606085015260a0850135915080821115613fca57600080fd5b818501915085601f830112613fde57600080fd5b813581811115613ff057613ff0613a16565b614002601f8201601f19168501613b2a565b9150808252868482850101111561401857600080fd5b808484018584013760008482840101525080608085015250505092915050565b6000610500828403121561404b57600080fd5b614053613a55565b9050813567ffffffffffffffff8082111561406d57600080fd5b61407985838601613d0d565b8352602084013591508082111561408f57600080fd5b61409b85838601613d0d565b60208401526140ad8560408601613d68565b60408401526104c08401359150808211156140c757600080fd5b6140d385838601613ef7565b60608401526104e08401359150808211156140ed57600080fd5b506140fa84828501613f51565b60808301525092915050565b600082601f83011261411757600080fd5b81356020614127613cb583613c70565b82815260059290921b8401810191818101908684111561414657600080fd5b8286015b84811015613d0257803567ffffffffffffffff81111561416a5760008081fd5b6141788986838b0101614038565b84525091830191830161414a565b60006080828403121561419857600080fd5b6040516060810181811067ffffffffffffffff821117156141bb576141bb613a16565b604052823581529050806141d160208401613b8b565b60208201526141e38460408501613b5b565b60408201525092915050565b600082601f83011261420057600080fd5b81356020614210613cb583613c70565b82815260059290921b8401810191818101908684111561422f57600080fd5b8286015b84811015613d0257803567ffffffffffffffff808211156142545760008081fd5b908801906106e0828b03601f1901121561426e5760008081fd5b614276613a9c565b86830135815260408084013588830152606080850135828401526080915061429f828601613b8b565b9083015260a06142b18d868301613ba2565b828401526101c08501358184015250506142cf8b6101e08501613d68565b60c0820152610660830135828111156142e85760008081fd5b6142f68c8983870101613ef7565b60e08301525061430a8b6106808501614186565b61010082015285525050918301918301614233565b600082601f83011261433057600080fd5b81356020614340613cb583613c70565b82815260059290921b8401810191818101908684111561435f57600080fd5b8286015b84811015613d0257803567ffffffffffffffff808211156143845760008081fd5b90880190610540828b03601f1901121561439e5760008081fd5b6143a6613ac0565b86830135828111156143b85760008081fd5b6143c68c8983870101613d0d565b825250604080840135838111156143dd5760008081fd5b6143eb8d8a83880101613d0d565b8984015250606092506144008c848601613d68565b908201526144128b6104e08501614186565b91810191909152845250918301918301614363565b8015158114611b4157600080fd5b60006101e0828403121561444857600080fd5b614450613ae3565b905061445b82613b8b565b815261446a8360208401613ba2565b602082015261447d836101408401613b5b565b604082015261018082013560608201526101a082013561449c81614427565b60808201526101c0919091013560a0820152919050565b600082601f8301126144c457600080fd5b813560206144d4613cb583613c70565b82815260059290921b840181019181810190868411156144f357600080fd5b8286015b84811015613d0257803567ffffffffffffffff808211156145185760008081fd5b90880190610200828b03601f190112156145325760008081fd5b61453a613a2c565b868301358281111561454c5760008081fd5b61455a8c8983870101614038565b82525061456a8b60408501614435565b81880152855250509183019183016144f7565b600060e0828403121561458f57600080fd5b614597613ae3565b90506145a38383613b5b565b8152604082013567ffffffffffffffff808211156145c057600080fd5b6145cc85838601613c94565b602084015260608401359150808211156145e557600080fd5b6145f185838601614106565b6040840152608084013591508082111561460a57600080fd5b614616858386016141ef565b606084015260a084013591508082111561462f57600080fd5b61463b8583860161431f565b608084015260c084013591508082111561465457600080fd5b50614661848285016144b3565b60a08301525092915050565b60008060006040848603121561468257600080fd5b833567ffffffffffffffff8082111561469a57600080fd5b6146a68783880161457d565b945060208601359150808211156146bc57600080fd5b818601915086601f8301126146d057600080fd5b8135818111156146df57600080fd5b8760208285010111156146f157600080fd5b6020830194508093505050509250925092565b60005b8381101561471f578181015183820152602001614707565b8381111561331f5750506000910152565b60008151808452614748816020860160208601614704565b601f01601f19169290920160200192915050565b60208152600061476f6020830184614730565b9392505050565b600080610200838503121561478a57600080fd5b6147948484614435565b9150613c676101e084016139fa565b6147b882825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a084015250606081015160c0830152608001516001600160801b031660e090910152565b80518252602081015161056060208401826147a3565b6101208101612fc98284614805565b60006020828403121561483c57600080fd5b5035919050565b6000806060838503121561485657600080fd5b6148608484613b5b565b946040939093013593505050565b60006020828403121561488057600080fd5b813567ffffffffffffffff81111561489757600080fd5b61174c8482850161457d565b600061012082840312156148b657600080fd5b61476f8383613ba2565b6000602082840312156148d257600080fd5b5051919050565b6001600160801b03815116825260208101516148f86020840182614805565b5060408101518051610140840152602001516101608301526060810151610180830152608081015115156101a083015260a001516101c090910152565b6101e08101612fc982846148d9565b6060815260006149576060830186614730565b6001600160a01b0394851660208401529290931660409091015292915050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160801b03808416806149bd576149bd614977565b92169190910492915050565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015614a0f578151875295820195908201906001016149f3565b509495945050505050565b60208152600061476f60208301846149df565b60008219821115614a4057614a4061498d565b500190565b634e487b7160e01b600052602160045260246000fd5b600060018201614a6d57614a6d61498d565b5060010190565b600081518084526020808501808196508360051b8101915082860160005b85811015614abc578284038952614aaa8483516149df565b98850198935090840190600101614a92565b5091979650505050505050565b614ade82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100614b418185018380518252602090810151910152565b60a08301519150610140614b618186018480518252602090810151910152565b60c08401519250610180614b818187018580518252602090810151910152565b60e085015193506101c0614ba18188018680518252602090810151910152565b92850151935061020092614bc18785018680518252602090810151910152565b6101208601519450610240614be28189018780518252602090810151910152565b92860151945061028092614c028885018780518252602090810151910152565b61016087015195506102c0614c23818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b600081518084526020808501945080840160005b83811015614a0f57614cd4878351614ac9565b610480969096019590820190600101614cc1565b600081518084526020808501808196508360051b8101915082860160005b85811015614abc578284038952614d1e848351614730565b98850198935090840190600101614d06565b608080825285518282018190526000919060a090818501906020808b01865b83811015614f555781518051865283810151848701526040808201518051828901526020810151606089015250506060810151614d988988018280518252602090810151910152565b508781015160c0614db58189018380518252602090810151910152565b888301519150610100614dd4818a018480518252602090810151910152565b90830151915061014090614df48983018480518252602090810151910152565b60e08401519250610180614e14818b018580518252602090810151910152565b9084015192506101c090614e348a83018580518252602090810151910152565b6101208501519350610200614e55818c018680518252602090810151910152565b92850151935061024092614e758b85018680518252602090810151910152565b61016086015180516102808d01526020908101516102a08d01529186015180516102c08d01528201516102e08c01526101a086015180516103008d01528201516103208c01529185015180516103408c01528101516103608b01526101e085015180516103808c01528101516103a08b01529084015180516103c08b01528101516103e08a015261022084015180516104008b01528101516104208a01529083015180516104408a0152810151610460890152610260909201518051610480890152909101516104a0870152506104c09094019390820190600101614d4f565b50508683039087015250614f698189614a74565b925050508281036040840152614f7f8186614cad565b90508281036060840152614f938185614ce8565b979650505050505050565b600060208284031215614fb057600080fd5b815161476f81614427565b600067ffffffffffffffff808316818516808303821115614fde57614fde61498d565b01949350505050565b72ffffffffffffffffffffffffffffffffffffff19831681526000825161501581600d850160208701614704565b91909101600d019392505050565b600081600019048311821515161561503d5761503d61498d565b500290565b6101e08101818360005b600f81101561506b57815183526020928301929091019060010161504c565b50505092915050565b600067ffffffffffffffff8084168061508f5761508f614977565b92169190910692915050565b6000828210156150ad576150ad61498d565b500390565b6000602082840312156150c457600080fd5b815160ff8116811461476f57600080fd5b6000604082840312156150e757600080fd5b6150ef613a2c565b9050815181526020820151602082015292915050565b60006104c0828403121561511857600080fd5b615120613b06565b825181526020830151602082015261513b84604085016150d5565b604082015261514d84608085016150d5565b606082015261515f8460c085016150d5565b6080820152610100615173858286016150d5565b60a0830152610140615187868287016150d5565b60c084015261018061519b878288016150d5565b60e08501526101c06151af888289016150d5565b8486015261020093506151c4888589016150d5565b6101208601526102406151d989828a016150d5565b848701526151eb896102808a016150d5565b6101608701526151ff896102c08a016150d5565b83870152615211896103008a016150d5565b6101a0870152615225896103408a016150d5565b82870152615237896103808a016150d5565b6101e087015261524b896103c08a016150d5565b8587015261525d896104008a016150d5565b610220870152615271896104408a016150d5565b8187015250505050506152888461048085016150d5565b6102608201529392505050565b600083516152a7818460208801614704565b835190830190614fde818360208801614704565b815181526020808301519082015260408101612fc9565b602080825282518282018190526000919084820190604085019084805b82811015614abc578451600480821061531557634e487b7160e01b845260218152602484fd5b50845293850193928501926001016152ef565b61533d82825180518252602090810151910152565b600060208201516060604085015261174c60608501826149df565b6000610500825181855261536e828601826149df565b9150506020830151848203602086015261538882826149df565b915050604083015161539d6040860182614ac9565b5060608301518482036104c08601526153b68282615328565b91505060808301518482036104e0860152805182526001600160801b03602082015116602083015267ffffffffffffffff6040820151166040830152606081015161540e606084018280518252602090810151910152565b506080015160c060a0830181905261542890830182614730565b95945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561548657603f19888603018452615474858351615358565b94509285019290850190600101615458565b5092979650505050505050565b805182526001600160801b0360208201511660208301526040810151610560604084018280518252602090810151910152565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156155aa57603f1989840301855281516106e08151855288820151898601528782015188860152606080830151615531828801826001600160801b03169052565b505060808083015161554582880182614805565b505060a08201516101a086015260c08201516155656101c0870182614ac9565b5060e08201518161064087015261557e82870182615328565b9150506101008201519150615597610660860183615493565b95880195935050908601906001016154ed565b509098975050505050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156155aa57603f1989840301855281516105408151818652615606828701826149df565b915050888201518582038a87015261561e82826149df565b9150508782015161563189870182614ac9565b50606082015191506156476104c0860183615493565b95880195935050908601906001016155df565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561548657603f19888603018452815161020081518188526156a882890182615358565b9150508782015191506156bd888801836148d9565b9550509285019290850190600101615681565b600060e0820160e08352808a54808352610100850191508b600052602092508260002060005b82811015615712578154845292840192600191820191016156f6565b50505083810382850152615726818b614730565b915050828103604084015261573b8189614730565b9050828103606084015261574f8188614730565b905082810360808401526157638187614730565b905082810360a08401526157778186614730565b905082810360c084015261578b8185614730565b9a9950505050505050505050565b6101008101612fc982846147a3565b7f457353434150452045524332300000000000000000000000000000000000000081526bffffffffffffffffffffffff19848116600d8301527f73706f6e736f726564206279000000000000000000000000000000000000000060218301528316602d8201527f706f6c69637900000000000000000000000000000000000000000000000000006041820152815160009061584a816047850160208701614704565b9190910160470194935050505056fea2646970667358221220859879091ff5678ccc23d56bb576d7cdacc7deb5bdf59d1a7401c7ed937c26cc64736f6c634300080d0033", + "libraries": { + "RescueLib": "0x646396e3fdB1Fbf73eE7F7381D6a25A6f7B919B8", + "VerifyingKeys": "0xC4E59193Fcbc2Ef3654B246C5503A3B14F741fbD" + }, + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "nRoots": "number of the most recent roots of the records merkle tree to be stored", + "verifierAddr": "address of the Plonk Verifier contract" + } + }, + "depositErc20((uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256),address)": { + "params": { + "erc20Address": "address of the ERC-20 token corresponding to the deposit", + "ro": "record opening that will be inserted in the records merkle tree once the deposit is validated" + } + }, + "faucetSetupForTestnet((uint256,uint256),bytes32)": { + "params": { + "faucetManagerAddress": "address of public key of faucet manager for CAP native token (testnet only!)", + "faucetManagerEncKey": "public key of faucet manager for CAP native token (testnet only!)" + } + }, + "isCapeAssetRegistered((uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))": { + "params": { + "assetDefinition": "an asset definition" + }, + "returns": { + "_0": "True if the asset type is registered, false otherwise." + } + }, + "lookup((uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))": { + "params": { + "assetDefinition": "an asset definition" + }, + "returns": { + "_0": "An ERC-20 address" + } + }, + "sponsorCapeAsset(address,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))": { + "params": { + "erc20Address": "An ERC-20 token address", + "newAsset": "An asset type to be registered in the contract" + } + }, + "submitCapeBlock(((uint256,uint256),uint8[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes))[],(uint256,uint256,uint256,uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,(uint256,uint256)))[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint128,(uint256,uint256)))[],((uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes)),(uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256))[]))": { + "details": "Transactions are validated and the blockchain state is updated. Moreover *BURN* transactions trigger the unwrapping of cape asset records into erc20 tokens.", + "params": { + "newBlock": "block to be processed by the CAPE contract." + } + }, + "submitCapeBlockWithMemos(((uint256,uint256),uint8[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes))[],(uint256,uint256,uint256,uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,(uint256,uint256)))[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint128,(uint256,uint256)))[],((uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes)),(uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256))[]),bytes)": { + "params": { + "": "{bytes} extraData data to be stored in calldata; this data is ignored by the contract function", + "newBlock": "block to be processed by the CAPE contract" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "constructor": { + "notice": "CAPE contract constructor method." + }, + "depositErc20((uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256),address)": { + "notice": "Wraps ERC-20 tokens into a CAPE asset defined in the record opening." + }, + "faucetSetupForTestnet((uint256,uint256),bytes32)": { + "notice": "Allocate native token faucet to a manager. For testnet only." + }, + "isCapeAssetRegistered((uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))": { + "notice": "Is the given asset definition registered?" + }, + "lookup((uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))": { + "notice": "Fetch the ERC-20 token address corresponding to the given asset definition." + }, + "nativeDomesticAsset()": { + "notice": "Return the CAP-native asset definition." + }, + "sponsorCapeAsset(address,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)))": { + "notice": "Create and register a new asset type associated with an ERC-20 token. Will revert if the asset type is already registered or the ERC-20 token address is zero." + }, + "submitCapeBlock(((uint256,uint256),uint8[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes))[],(uint256,uint256,uint256,uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,(uint256,uint256)))[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint128,(uint256,uint256)))[],((uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes)),(uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256))[]))": { + "notice": "Submit a new block to the CAPE contract." + }, + "submitCapeBlockWithMemos(((uint256,uint256),uint8[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes))[],(uint256,uint256,uint256,uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,(uint256,uint256)))[],(uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint128,(uint256,uint256)))[],((uint256[],uint256[],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),uint256[]),(uint256,uint128,uint64,(uint256,uint256),bytes)),(uint128,(uint256,((uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint128)),(uint256,uint256),bytes32,bool,uint256))[]),bytes)": { + "notice": "Submit a new block with extra data to the CAPE contract." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 5655, + "contract": "contracts/CAPE.sol:CAPE", + "label": "_roots", + "offset": 0, + "slot": "0", + "type": "t_array(t_uint256)dyn_storage" + }, + { + "astId": 5659, + "contract": "contracts/CAPE.sol:CAPE", + "label": "_rootsMap", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_bool)" + }, + { + "astId": 5661, + "contract": "contracts/CAPE.sol:CAPE", + "label": "_writeHead", + "offset": 0, + "slot": "2", + "type": "t_uint64" + }, + { + "astId": 1332, + "contract": "contracts/CAPE.sol:CAPE", + "label": "assets", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_bytes32,t_address)" + }, + { + "astId": 114, + "contract": "contracts/CAPE.sol:CAPE", + "label": "_status", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 1638, + "contract": "contracts/CAPE.sol:CAPE", + "label": "nullifiers", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_bool)" + }, + { + "astId": 1640, + "contract": "contracts/CAPE.sol:CAPE", + "label": "blockHeight", + "offset": 0, + "slot": "6", + "type": "t_uint64" + }, + { + "astId": 1643, + "contract": "contracts/CAPE.sol:CAPE", + "label": "_verifier", + "offset": 8, + "slot": "6", + "type": "t_contract(IPlonkVerifier)6034" + }, + { + "astId": 1646, + "contract": "contracts/CAPE.sol:CAPE", + "label": "_recordsMerkleTree", + "offset": 0, + "slot": "7", + "type": "t_contract(IRecordsMerkleTree)6062" + }, + { + "astId": 1649, + "contract": "contracts/CAPE.sol:CAPE", + "label": "pendingDeposits", + "offset": 0, + "slot": "8", + "type": "t_array(t_uint256)dyn_storage" + }, + { + "astId": 1651, + "contract": "contracts/CAPE.sol:CAPE", + "label": "deployer", + "offset": 0, + "slot": "9", + "type": "t_address" + }, + { + "astId": 1653, + "contract": "contracts/CAPE.sol:CAPE", + "label": "faucetInitialized", + "offset": 20, + "slot": "9", + "type": "t_bool" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)dyn_storage": { + "base": "t_uint256", + "encoding": "dynamic_array", + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IPlonkVerifier)6034": { + "encoding": "inplace", + "label": "contract IPlonkVerifier", + "numberOfBytes": "20" + }, + "t_contract(IRecordsMerkleTree)6062": { + "encoding": "inplace", + "label": "contract IRecordsMerkleTree", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_address)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_uint256,t_bool)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/arbitrum_goerli/PlonkVerifier.json b/contracts/deployments/arbitrum_goerli/PlonkVerifier.json new file mode 100644 index 00000000..c8217ef5 --- /dev/null +++ b/contracts/deployments/arbitrum_goerli/PlonkVerifier.json @@ -0,0 +1,730 @@ +{ + "address": "0x013bD50e91B788c1eA1a679B1A7962d96315B168", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "domainSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numInputs", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "q1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "q2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "q3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "q4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qM12", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qM34", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qO", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qC", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qH1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qH2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qH3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qH4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qEcc", + "type": "tuple" + } + ], + "internalType": "struct IPlonkVerifier.VerifyingKey[]", + "name": "verifyingKeys", + "type": "tuple[]" + }, + { + "internalType": "uint256[][]", + "name": "publicInputs", + "type": "uint256[][]" + }, + { + "components": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "wire4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "prodPerm", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "split4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zeta", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "zetaOmega", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "wireEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "wireEval4", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval2", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "sigmaEval3", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prodPermZetaOmegaEval", + "type": "uint256" + } + ], + "internalType": "struct IPlonkVerifier.PlonkProof[]", + "name": "proofs", + "type": "tuple[]" + }, + { + "internalType": "bytes[]", + "name": "extraTranscriptInitMsgs", + "type": "bytes[]" + } + ], + "name": "batchVerify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x6f27dea03b2aa6d75baee35a69048a4832fd746523ea038c03903eb95e91e57d", + "receipt": { + "to": null, + "from": "0x21a49524e319C0b28dAA1d79d50B6D7A346490B2", + "contractAddress": "0x013bD50e91B788c1eA1a679B1A7962d96315B168", + "transactionIndex": 1, + "gasUsed": "3366524", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1bc6e2573bdcb8dcd9f4103df161a8fa6ad2a0359439372d65ae032388d6339a", + "transactionHash": "0x6f27dea03b2aa6d75baee35a69048a4832fd746523ea038c03903eb95e91e57d", + "logs": [], + "blockNumber": 1220976, + "cumulativeGasUsed": "3366524", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "72a14774796fae5d4ac4d3b6f26df06c", + "metadata": "{\"compiler\":{\"version\":\"0.8.13+commit.abaa5c0e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"domainSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numInputs\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"q1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"q2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"q3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"q4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qM12\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qM34\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qO\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qC\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qH1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qH2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qH3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qH4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qEcc\",\"type\":\"tuple\"}],\"internalType\":\"struct IPlonkVerifier.VerifyingKey[]\",\"name\":\"verifyingKeys\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"publicInputs\",\"type\":\"uint256[][]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"wire4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"prodPerm\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"split4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zeta\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"zetaOmega\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"wireEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"wireEval4\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sigmaEval3\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prodPermZetaOmegaEval\",\"type\":\"uint256\"}],\"internalType\":\"struct IPlonkVerifier.PlonkProof[]\",\"name\":\"proofs\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"extraTranscriptInitMsgs\",\"type\":\"bytes[]\"}],\"name\":\"batchVerify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batchVerify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256))[],uint256[][],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)[],bytes[])\":{\"details\":\"Batch verify multiple TurboPlonk proofs.\",\"params\":{\"extraTranscriptInitMsgs\":\"An array of bytes from transcript initialization messages\",\"proofs\":\"An array of Plonk proofs\",\"publicInputs\":\"A two-dimensional array of public inputs.\",\"verifyingKeys\":\"An array of verifier keys\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/verifier/PlonkVerifier.sol\":\"PlonkVerifier\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/interfaces/IPlonkVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../libraries/BN254.sol\\\";\\n\\ninterface IPlonkVerifier {\\n // Flatten out TurboPlonk proof\\n struct PlonkProof {\\n // the first 5 are 4 inputs and 1 output wire poly commmitments\\n // i.e., batch_proof.wires_poly_comms_vec.iter()\\n // wire0 is 32 bytes which is a pointer to BN254.G1Point\\n BN254.G1Point wire0; // 0x00\\n BN254.G1Point wire1; // 0x20\\n BN254.G1Point wire2; // 0x40\\n BN254.G1Point wire3; // 0x60\\n BN254.G1Point wire4; // 0x80\\n // the next one is the product permutation poly commitment\\n // i.e., batch_proof.prod_perm_poly_comms_vec.iter()\\n BN254.G1Point prodPerm; // 0xA0\\n // the next 5 are split quotient poly commmitments\\n // i.e., batch_proof.split_quot_poly_comms\\n BN254.G1Point split0; // 0xC0\\n BN254.G1Point split1; // 0xE0\\n BN254.G1Point split2; // 0x100\\n BN254.G1Point split3; // 0x120\\n BN254.G1Point split4; // 0x140\\n // witness poly com for aggregated opening at `zeta`\\n // i.e., batch_proof.opening_proof\\n BN254.G1Point zeta; // 0x160\\n // witness poly com for shifted opening at `zeta * \\\\omega`\\n // i.e., batch_proof.shifted_opening_proof\\n BN254.G1Point zetaOmega; // 0x180\\n // wire poly eval at `zeta`\\n uint256 wireEval0; // 0x1A0\\n uint256 wireEval1; // 0x1C0\\n uint256 wireEval2; // 0x1E0\\n uint256 wireEval3; // 0x200\\n uint256 wireEval4; // 0x220\\n // extended permutation (sigma) poly eval at `zeta`\\n // last (sigmaEval4) is saved by Maller Optimization\\n uint256 sigmaEval0; // 0x240\\n uint256 sigmaEval1; // 0x260\\n uint256 sigmaEval2; // 0x280\\n uint256 sigmaEval3; // 0x2A0\\n // product permutation poly eval at `zeta * \\\\omega`\\n uint256 prodPermZetaOmegaEval; // 0x2C0\\n }\\n\\n // The verifying key for Plonk proofs.\\n struct VerifyingKey {\\n uint256 domainSize; // 0x00\\n uint256 numInputs; // 0x20\\n // commitment to extended perm (sigma) poly\\n BN254.G1Point sigma0; // 0x40\\n BN254.G1Point sigma1; // 0x60\\n BN254.G1Point sigma2; // 0x80\\n BN254.G1Point sigma3; // 0xA0\\n BN254.G1Point sigma4; // 0xC0\\n // commitment to selector poly\\n // first 4 are linear combination selector\\n BN254.G1Point q1; // 0xE0\\n BN254.G1Point q2; // 0x100\\n BN254.G1Point q3; // 0x120\\n BN254.G1Point q4; // 0x140\\n // multiplication selector for 1st, 2nd wire\\n BN254.G1Point qM12; // 0x160\\n // multiplication selector for 3rd, 4th wire\\n BN254.G1Point qM34; // 0x180\\n // output selector\\n BN254.G1Point qO; // 0x1A0\\n // constant term selector\\n BN254.G1Point qC; // 0x1C0\\n // rescue selector qH1 * w_ai^5\\n BN254.G1Point qH1; // 0x1E0\\n // rescue selector qH2 * w_bi^5\\n BN254.G1Point qH2; // 0x200\\n // rescue selector qH3 * w_ci^5\\n BN254.G1Point qH3; // 0x220\\n // rescue selector qH4 * w_di^5\\n BN254.G1Point qH4; // 0x240\\n // elliptic curve selector\\n BN254.G1Point qEcc; // 0x260\\n }\\n\\n /// @dev Batch verify multiple TurboPlonk proofs.\\n /// @param verifyingKeys An array of verifying keys\\n /// @param publicInputs A two-dimensional array of public inputs.\\n /// @param proofs An array of Plonk proofs\\n /// @param extraTranscriptInitMsgs An array of bytes from\\n /// transcript initialization messages\\n /// @return _ A boolean that is true for successful verification, false otherwise\\n function batchVerify(\\n VerifyingKey[] memory verifyingKeys,\\n uint256[][] memory publicInputs,\\n PlonkProof[] memory proofs,\\n bytes[] memory extraTranscriptInitMsgs\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x05bacaa9c265b454292a0e68d4746c5c8ae1624459c8ba76248abd513100b8d1\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/BN254.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n//\\n// Based on:\\n// - Christian Reitwiessner: https://gist.githubusercontent.com/chriseth/f9be9d9391efc5beb9704255a8e2989d/raw/4d0fb90847df1d4e04d507019031888df8372239/snarktest.solidity\\n// - Aztec: https://github.com/AztecProtocol/aztec-2-bug-bounty\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Utils.sol\\\";\\n\\n/// @notice Barreto-Naehrig curve over a 254 bit prime field\\nlibrary BN254 {\\n // use notation from https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/\\n //\\n // Elliptic curve is defined over a prime field GF(p), with embedding degree k.\\n // Short Weierstrass (SW form) is, for a, b \\\\in GF(p^n) for some natural number n > 0:\\n // E: y^2 = x^3 + a * x + b\\n //\\n // Pairing is defined over cyclic subgroups G1, G2, both of which are of order r.\\n // G1 is a subgroup of E(GF(p)), G2 is a subgroup of E(GF(p^k)).\\n //\\n // BN family are parameterized curves with well-chosen t,\\n // p = 36 * t^4 + 36 * t^3 + 24 * t^2 + 6 * t + 1\\n // r = 36 * t^4 + 36 * t^3 + 18 * t^2 + 6 * t + 1\\n // for some integer t.\\n // E has the equation:\\n // E: y^2 = x^3 + b\\n // where b is a primitive element of multiplicative group (GF(p))^* of order (p-1).\\n // A pairing e is defined by taking G1 as a subgroup of E(GF(p)) of order r,\\n // G2 as a subgroup of E'(GF(p^2)),\\n // and G_T as a subgroup of a multiplicative group (GF(p^12))^* of order r.\\n //\\n // BN254 is defined over a 254-bit prime order p, embedding degree k = 12.\\n uint256 public constant P_MOD =\\n 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n uint256 public constant R_MOD =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n struct G1Point {\\n uint256 x;\\n uint256 y;\\n }\\n\\n // G2 group element where x \\\\in Fp2 = x0 * z + x1\\n struct G2Point {\\n uint256 x0;\\n uint256 x1;\\n uint256 y0;\\n uint256 y1;\\n }\\n\\n /// @return the generator of G1\\n // solhint-disable-next-line func-name-mixedcase\\n function P1() internal pure returns (G1Point memory) {\\n return G1Point(1, 2);\\n }\\n\\n /// @return the generator of G2\\n // solhint-disable-next-line func-name-mixedcase\\n function P2() internal pure returns (G2Point memory) {\\n return\\n G2Point({\\n x0: 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2,\\n x1: 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed,\\n y0: 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b,\\n y1: 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa\\n });\\n }\\n\\n /// @dev check if a G1 point is Infinity\\n /// @notice precompile bn256Add at address(6) takes (0, 0) as Point of Infinity,\\n /// some crypto libraries (such as arkwork) uses a boolean flag to mark PoI, and\\n /// just use (0, 1) as affine coordinates (not on curve) to represents PoI.\\n function isInfinity(G1Point memory point) internal pure returns (bool result) {\\n assembly {\\n let x := mload(point)\\n let y := mload(add(point, 0x20))\\n result := and(iszero(x), iszero(y))\\n }\\n }\\n\\n /// @return r the negation of p, i.e. p.add(p.negate()) should be zero.\\n function negate(G1Point memory p) internal pure returns (G1Point memory) {\\n if (isInfinity(p)) {\\n return p;\\n }\\n return G1Point(p.x, P_MOD - (p.y % P_MOD));\\n }\\n\\n /// @return res = -fr the negation of scalar field element.\\n function negate(uint256 fr) internal pure returns (uint256 res) {\\n return R_MOD - (fr % R_MOD);\\n }\\n\\n /// @return r the sum of two points of G1\\n function add(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {\\n uint256[4] memory input;\\n input[0] = p1.x;\\n input[1] = p1.y;\\n input[2] = p2.x;\\n input[3] = p2.y;\\n bool success;\\n assembly {\\n success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60)\\n // Use \\\"invalid\\\" to make gas estimation work\\n switch success\\n case 0 {\\n revert(0, 0)\\n }\\n }\\n require(success, \\\"Bn254: group addition failed!\\\");\\n }\\n\\n /// @return r the product of a point on G1 and a scalar, i.e.\\n /// p == p.mul(1) and p.add(p) == p.mul(2) for all points p.\\n function scalarMul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {\\n uint256[3] memory input;\\n input[0] = p.x;\\n input[1] = p.y;\\n input[2] = s;\\n bool success;\\n assembly {\\n success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60)\\n // Use \\\"invalid\\\" to make gas estimation work\\n switch success\\n case 0 {\\n revert(0, 0)\\n }\\n }\\n require(success, \\\"Bn254: scalar mul failed!\\\");\\n }\\n\\n /// @dev Multi-scalar Mulitiplication (MSM)\\n /// @return r = \\\\Prod{B_i^s_i} where {s_i} are `scalars` and {B_i} are `bases`\\n function multiScalarMul(G1Point[] memory bases, uint256[] memory scalars)\\n internal\\n view\\n returns (G1Point memory r)\\n {\\n require(scalars.length == bases.length, \\\"MSM error: length does not match\\\");\\n\\n r = scalarMul(bases[0], scalars[0]);\\n for (uint256 i = 1; i < scalars.length; i++) {\\n r = add(r, scalarMul(bases[i], scalars[i]));\\n }\\n }\\n\\n /// @dev Compute f^-1 for f \\\\in Fr scalar field\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function invert(uint256 fr) internal view returns (uint256 output) {\\n bool success;\\n uint256 p = R_MOD;\\n assembly {\\n let mPtr := mload(0x40)\\n mstore(mPtr, 0x20)\\n mstore(add(mPtr, 0x20), 0x20)\\n mstore(add(mPtr, 0x40), 0x20)\\n mstore(add(mPtr, 0x60), fr)\\n mstore(add(mPtr, 0x80), sub(p, 2))\\n mstore(add(mPtr, 0xa0), p)\\n success := staticcall(gas(), 0x05, mPtr, 0xc0, 0x00, 0x20)\\n output := mload(0x00)\\n }\\n require(success, \\\"Bn254: pow precompile failed!\\\");\\n }\\n\\n /**\\n * validate the following:\\n * x != 0\\n * y != 0\\n * x < p\\n * y < p\\n * y^2 = x^3 + 3 mod p\\n */\\n /// @dev validate G1 point and check if it is on curve\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function validateG1Point(G1Point memory point) internal pure {\\n bool isWellFormed;\\n uint256 p = P_MOD;\\n assembly {\\n let x := mload(point)\\n let y := mload(add(point, 0x20))\\n\\n isWellFormed := and(\\n and(and(lt(x, p), lt(y, p)), not(or(iszero(x), iszero(y)))),\\n eq(mulmod(y, y, p), addmod(mulmod(x, mulmod(x, x, p), p), 3, p))\\n )\\n }\\n require(isWellFormed, \\\"Bn254: invalid G1 point\\\");\\n }\\n\\n /// @dev Validate scalar field, revert if invalid (namely if fr > r_mod).\\n /// @notice Writing this inline instead of calling it might save gas.\\n function validateScalarField(uint256 fr) internal pure {\\n bool isValid;\\n assembly {\\n isValid := lt(fr, R_MOD)\\n }\\n require(isValid, \\\"Bn254: invalid scalar field\\\");\\n }\\n\\n /// @dev Evaluate the following pairing product:\\n /// @dev e(a1, a2).e(-b1, b2) == 1\\n /// @dev caller needs to ensure that a1, a2, b1 and b2 are within proper group\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function pairingProd2(\\n G1Point memory a1,\\n G2Point memory a2,\\n G1Point memory b1,\\n G2Point memory b2\\n ) internal view returns (bool) {\\n uint256 out;\\n bool success;\\n assembly {\\n let mPtr := mload(0x40)\\n mstore(mPtr, mload(a1))\\n mstore(add(mPtr, 0x20), mload(add(a1, 0x20)))\\n mstore(add(mPtr, 0x40), mload(a2))\\n mstore(add(mPtr, 0x60), mload(add(a2, 0x20)))\\n mstore(add(mPtr, 0x80), mload(add(a2, 0x40)))\\n mstore(add(mPtr, 0xa0), mload(add(a2, 0x60)))\\n\\n mstore(add(mPtr, 0xc0), mload(b1))\\n mstore(add(mPtr, 0xe0), mload(add(b1, 0x20)))\\n mstore(add(mPtr, 0x100), mload(b2))\\n mstore(add(mPtr, 0x120), mload(add(b2, 0x20)))\\n mstore(add(mPtr, 0x140), mload(add(b2, 0x40)))\\n mstore(add(mPtr, 0x160), mload(add(b2, 0x60)))\\n success := staticcall(gas(), 8, mPtr, 0x180, 0x00, 0x20)\\n out := mload(0x00)\\n }\\n require(success, \\\"Bn254: Pairing check failed!\\\");\\n return (out != 0);\\n }\\n\\n function fromLeBytesModOrder(bytes memory leBytes) internal pure returns (uint256 ret) {\\n for (uint256 i = 0; i < leBytes.length; i++) {\\n ret = mulmod(ret, 256, R_MOD);\\n ret = addmod(ret, uint256(uint8(leBytes[leBytes.length - 1 - i])), R_MOD);\\n }\\n }\\n\\n /// @dev Check if y-coordinate of G1 point is negative.\\n function isYNegative(G1Point memory point) internal pure returns (bool) {\\n return (point.y << 1) < P_MOD;\\n }\\n\\n // @dev Perform a modular exponentiation.\\n // @return base^exponent (mod modulus)\\n // This method is ideal for small exponents (~64 bits or less), as it is cheaper than using the pow precompile\\n // @notice credit: credit: Aztec, Spilsbury Holdings Ltd\\n function powSmall(\\n uint256 base,\\n uint256 exponent,\\n uint256 modulus\\n ) internal pure returns (uint256) {\\n uint256 result = 1;\\n uint256 input = base;\\n uint256 count = 1;\\n\\n assembly {\\n let endpoint := add(exponent, 0x01)\\n for {\\n\\n } lt(count, endpoint) {\\n count := add(count, count)\\n } {\\n if and(exponent, count) {\\n result := mulmod(result, input, modulus)\\n }\\n input := mulmod(input, input, modulus)\\n }\\n }\\n\\n return result;\\n }\\n\\n function g1Serialize(G1Point memory point) internal pure returns (bytes memory) {\\n uint256 mask = 0;\\n\\n // Set the 254-th bit to 1 for infinity\\n // https://docs.rs/ark-serialize/0.3.0/src/ark_serialize/flags.rs.html#117\\n if (isInfinity(point)) {\\n mask |= 0x4000000000000000000000000000000000000000000000000000000000000000;\\n }\\n\\n // Set the 255-th bit to 1 for positive Y\\n // https://docs.rs/ark-serialize/0.3.0/src/ark_serialize/flags.rs.html#118\\n if (!isYNegative(point)) {\\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\\n }\\n\\n return abi.encodePacked(Utils.reverseEndianness(point.x | mask));\\n }\\n\\n function g1Deserialize(bytes32 input) internal view returns (G1Point memory point) {\\n uint256 mask = 0x4000000000000000000000000000000000000000000000000000000000000000;\\n uint256 x = Utils.reverseEndianness(uint256(input));\\n uint256 y;\\n bool isQuadraticResidue;\\n bool isYPositive;\\n if (x & mask != 0) {\\n // the 254-th bit == 1 for infinity\\n x = 0;\\n y = 0;\\n } else {\\n // Set the 255-th bit to 1 for positive Y\\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\\n isYPositive = (x & mask != 0);\\n // mask off the first two bits of x\\n mask = 0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n x &= mask;\\n\\n // solve for y where E: y^2 = x^3 + 3\\n y = mulmod(x, x, P_MOD);\\n y = mulmod(y, x, P_MOD);\\n y = addmod(y, 3, P_MOD);\\n (isQuadraticResidue, y) = quadraticResidue(y);\\n\\n require(isQuadraticResidue, \\\"deser fail: not on curve\\\");\\n\\n if (isYPositive) {\\n y = P_MOD - y;\\n }\\n }\\n\\n point = G1Point(x, y);\\n }\\n\\n function quadraticResidue(uint256 x)\\n internal\\n view\\n returns (bool isQuadraticResidue, uint256 a)\\n {\\n bool success;\\n // e = (p+1)/4\\n uint256 e = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52;\\n uint256 p = P_MOD;\\n\\n // we have p == 3 mod 4 therefore\\n // a = x^((p+1)/4)\\n assembly {\\n // credit: Aztec\\n let mPtr := mload(0x40)\\n mstore(mPtr, 0x20)\\n mstore(add(mPtr, 0x20), 0x20)\\n mstore(add(mPtr, 0x40), 0x20)\\n mstore(add(mPtr, 0x60), x)\\n mstore(add(mPtr, 0x80), e)\\n mstore(add(mPtr, 0xa0), p)\\n success := staticcall(gas(), 0x05, mPtr, 0xc0, 0x00, 0x20)\\n a := mload(0x00)\\n }\\n require(success, \\\"pow precompile call failed!\\\");\\n\\n // ensure a < p/2\\n if (a << 1 > p) {\\n a = p - a;\\n }\\n\\n // check if a^2 = x, if not x is not a quadratic residue\\n e = mulmod(a, a, p);\\n\\n isQuadraticResidue = (e == x);\\n }\\n}\\n\",\"keccak256\":\"0x3607d86e6e230526d4cb8f5ae427d9ad04f7f77455f4994ee4f1c6d8d7e829ca\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/PolynomialEval.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport {BN254} from \\\"../libraries/BN254.sol\\\";\\n\\nlibrary PolynomialEval {\\n /// @dev a Radix 2 Evaluation Domain\\n struct EvalDomain {\\n uint256 logSize; // log_2(self.size)\\n uint256 size; // Size of the domain as a field element\\n uint256 sizeInv; // Inverse of the size in the field\\n uint256 groupGen; // A generator of the subgroup\\n uint256 groupGenInv; // Inverse of the generator of the subgroup\\n }\\n\\n /// @dev stores vanishing poly, lagrange at 1, and Public input poly\\n struct EvalData {\\n uint256 vanishEval;\\n uint256 lagrangeOne;\\n uint256 piEval;\\n }\\n\\n /// @dev compute the EvalData for a given domain and a challenge zeta\\n function evalDataGen(\\n EvalDomain memory self,\\n uint256 zeta,\\n uint256[] memory publicInput\\n ) internal view returns (EvalData memory evalData) {\\n evalData.vanishEval = evaluateVanishingPoly(self, zeta);\\n evalData.lagrangeOne = evaluateLagrangeOne(self, zeta, evalData.vanishEval);\\n evalData.piEval = evaluatePiPoly(self, publicInput, zeta, evalData.vanishEval);\\n }\\n\\n /// @dev Create a new Radix2EvalDomain with `domainSize` which should be power of 2.\\n /// @dev Will revert if domainSize is not among {2^14, 2^15, 2^16, 2^17}\\n function newEvalDomain(uint256 domainSize) internal pure returns (EvalDomain memory) {\\n if (domainSize == 16384) {\\n return\\n EvalDomain(\\n 14,\\n domainSize,\\n 0x30638CE1A7661B6337A964756AA75257C6BF4778D89789AB819CE60C19B04001,\\n 0x2D965651CDD9E4811F4E51B80DDCA8A8B4A93EE17420AAE6ADAA01C2617C6E85,\\n 0x281C036F06E7E9E911680D42558E6E8CF40976B0677771C0F8EEE934641C8410\\n );\\n } else if (domainSize == 32768) {\\n return\\n EvalDomain(\\n 15,\\n domainSize,\\n 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001,\\n 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb,\\n 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4\\n );\\n } else if (domainSize == 65536) {\\n return\\n EvalDomain(\\n 16,\\n domainSize,\\n 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001,\\n 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7,\\n 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4\\n );\\n } else if (domainSize == 131072) {\\n return\\n EvalDomain(\\n 17,\\n domainSize,\\n 0x30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801,\\n 0x1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e5,\\n 0x244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22\\n );\\n } else {\\n revert(\\\"Poly: size must in 2^{14~17}\\\");\\n }\\n }\\n\\n // This evaluates the vanishing polynomial for this domain at zeta.\\n // For multiplicative subgroups, this polynomial is\\n // `z(X) = X^self.size - 1`.\\n function evaluateVanishingPoly(EvalDomain memory self, uint256 zeta)\\n internal\\n pure\\n returns (uint256 res)\\n {\\n uint256 p = BN254.R_MOD;\\n uint256 logSize = self.logSize;\\n\\n assembly {\\n switch zeta\\n case 0 {\\n res := sub(p, 1)\\n }\\n default {\\n res := zeta\\n for {\\n let i := 0\\n } lt(i, logSize) {\\n i := add(i, 1)\\n } {\\n res := mulmod(res, res, p)\\n }\\n // since zeta != 0 we know that res is not 0\\n // so we can safely do a subtraction\\n res := sub(res, 1)\\n }\\n }\\n }\\n\\n /// @dev Evaluate the lagrange polynomial at point `zeta` given the vanishing polynomial evaluation `vanish_eval`.\\n function evaluateLagrangeOne(\\n EvalDomain memory self,\\n uint256 zeta,\\n uint256 vanishEval\\n ) internal view returns (uint256 res) {\\n if (vanishEval == 0) {\\n return 0;\\n }\\n\\n uint256 p = BN254.R_MOD;\\n uint256 divisor;\\n uint256 vanishEvalMulSizeInv = self.sizeInv;\\n\\n // =========================\\n // lagrange_1_eval = vanish_eval / self.size / (zeta - 1)\\n // =========================\\n assembly {\\n vanishEvalMulSizeInv := mulmod(vanishEval, vanishEvalMulSizeInv, p)\\n\\n switch zeta\\n case 0 {\\n divisor := sub(p, 1)\\n }\\n default {\\n divisor := sub(zeta, 1)\\n }\\n }\\n divisor = BN254.invert(divisor);\\n assembly {\\n res := mulmod(vanishEvalMulSizeInv, divisor, p)\\n }\\n }\\n\\n /// @dev Evaluate public input polynomial at point `zeta`.\\n function evaluatePiPoly(\\n EvalDomain memory self,\\n uint256[] memory pi,\\n uint256 zeta,\\n uint256 vanishEval\\n ) internal view returns (uint256 res) {\\n if (vanishEval == 0) {\\n return 0;\\n }\\n\\n uint256 p = BN254.R_MOD;\\n uint256 length = pi.length;\\n uint256 ithLagrange;\\n uint256 ithDivisor;\\n uint256 tmp;\\n uint256 vanishEvalDivN = self.sizeInv;\\n uint256 divisorProd;\\n uint256[] memory localDomainElements = domainElements(self, length);\\n uint256[] memory divisors = new uint256[](length);\\n\\n assembly {\\n // vanish_eval_div_n = (zeta^n-1)/n\\n vanishEvalDivN := mulmod(vanishEvalDivN, vanishEval, p)\\n\\n // Now we need to compute\\n // \\\\sum_{i=0..l} L_{i,H}(zeta) * pub_input[i]\\n // where\\n // - L_{i,H}(zeta)\\n // = Z_H(zeta) * v_i / (zeta - g^i)\\n // = vanish_eval_div_n * g^i / (zeta - g^i)\\n // - v_i = g^i / n\\n //\\n // we want to use batch inversion method where we compute\\n //\\n // divisorProd = 1 / \\\\prod (zeta - g^i)\\n //\\n // and then each 1 / (zeta - g^i) can be computed via (length - 1)\\n // multiplications:\\n //\\n // 1 / (zeta - g^i) = divisorProd * \\\\prod_{j!=i} (zeta - g^j)\\n //\\n // In total this takes n(n-1) multiplications and 1 inversion,\\n // instead of doing n inversions.\\n divisorProd := 1\\n\\n for {\\n let i := 0\\n } lt(i, length) {\\n i := add(i, 1)\\n } {\\n // tmp points to g^i\\n // first 32 bytes of reference is the length of an array\\n tmp := mload(add(add(localDomainElements, 0x20), mul(i, 0x20)))\\n // compute (zeta - g^i)\\n ithDivisor := addmod(sub(p, tmp), zeta, p)\\n // accumulate (zeta - g^i) to the divisorProd\\n divisorProd := mulmod(divisorProd, ithDivisor, p)\\n // store ithDivisor in the array\\n mstore(add(add(divisors, 0x20), mul(i, 0x20)), ithDivisor)\\n }\\n }\\n\\n // compute 1 / \\\\prod_{i=0}^length (zeta - g^i)\\n divisorProd = BN254.invert(divisorProd);\\n\\n assembly {\\n for {\\n let i := 0\\n } lt(i, length) {\\n i := add(i, 1)\\n } {\\n // tmp points to g^i\\n // first 32 bytes of reference is the length of an array\\n tmp := mload(add(add(localDomainElements, 0x20), mul(i, 0x20)))\\n // vanish_eval_div_n * g^i\\n ithLagrange := mulmod(vanishEvalDivN, tmp, p)\\n\\n // now we compute vanish_eval_div_n * g^i / (zeta - g^i) via\\n // vanish_eval_div_n * g^i * divisorProd * \\\\prod_{j!=i} (zeta - g^j)\\n ithLagrange := mulmod(ithLagrange, divisorProd, p)\\n for {\\n let j := 0\\n } lt(j, length) {\\n j := add(j, 1)\\n } {\\n if iszero(eq(i, j)) {\\n ithDivisor := mload(add(add(divisors, 0x20), mul(j, 0x20)))\\n ithLagrange := mulmod(ithLagrange, ithDivisor, p)\\n }\\n }\\n\\n // multiply by pub_input[i] and update res\\n // tmp points to public input\\n tmp := mload(add(add(pi, 0x20), mul(i, 0x20)))\\n ithLagrange := mulmod(ithLagrange, tmp, p)\\n res := addmod(res, ithLagrange, p)\\n }\\n }\\n }\\n\\n /// @dev Generate the domain elements for indexes 0..length\\n /// which are essentially g^0, g^1, ..., g^{length-1}\\n function domainElements(EvalDomain memory self, uint256 length)\\n internal\\n pure\\n returns (uint256[] memory elements)\\n {\\n uint256 groupGen = self.groupGen;\\n uint256 tmp = 1;\\n uint256 p = BN254.R_MOD;\\n elements = new uint256[](length);\\n assembly {\\n if not(iszero(length)) {\\n let ptr := add(elements, 0x20)\\n let end := add(ptr, mul(0x20, length))\\n mstore(ptr, 1)\\n ptr := add(ptr, 0x20)\\n // for (; ptr < end; ptr += 32) loop through the memory of `elements`\\n for {\\n\\n } lt(ptr, end) {\\n ptr := add(ptr, 0x20)\\n } {\\n tmp := mulmod(tmp, groupGen, p)\\n mstore(ptr, tmp)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xeb5dc3f8021d6e78aea8a33f55a699871ae93348d1815b4f64dece78b6cef086\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Utils.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nlibrary Utils {\\n function reverseEndianness(uint256 input) internal pure returns (uint256 v) {\\n v = input;\\n\\n // swap bytes\\n v =\\n ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) |\\n ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\\n\\n // swap 2-byte long pairs\\n v =\\n ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) |\\n ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\\n\\n // swap 4-byte long pairs\\n v =\\n ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) |\\n ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32);\\n\\n // swap 8-byte long pairs\\n v =\\n ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) |\\n ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64);\\n\\n // swap 16-byte long pairs\\n v = (v >> 128) | (v << 128);\\n }\\n}\\n\",\"keccak256\":\"0x6171f0308aaf0e5379abfee2ed1aa69b81232ef35f0a5576bf7e16d9ad73ac49\",\"license\":\"GPL-3.0-or-later\"},\"contracts/verifier/PlonkVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport {BN254} from \\\"../libraries/BN254.sol\\\";\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport {PolynomialEval as Poly} from \\\"../libraries/PolynomialEval.sol\\\";\\nimport \\\"./Transcript.sol\\\";\\n\\ncontract PlonkVerifier is IPlonkVerifier {\\n using Transcript for Transcript.TranscriptData;\\n\\n // _COSET_K0 = 1, has no effect during multiplication, thus avoid declaring it here.\\n uint256 private constant _COSET_K1 =\\n 0x2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a;\\n uint256 private constant _COSET_K2 =\\n 0x1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025;\\n uint256 private constant _COSET_K3 =\\n 0x2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a;\\n uint256 private constant _COSET_K4 =\\n 0x2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881;\\n\\n // Parsed from Aztec's Ignition CRS,\\n // `beta_h` \\\\in G2 where \\\\beta is the trapdoor, h is G2 generator `BN254.P2()`\\n // See parsing code: https://github.com/alxiong/crs\\n BN254.G2Point private _betaH =\\n BN254.G2Point({\\n x0: 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1,\\n x1: 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0,\\n y0: 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4,\\n y1: 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55\\n });\\n\\n /// The number of wire types of the circuit, TurboPlonk has 5.\\n uint256 private constant _NUM_WIRE_TYPES = 5;\\n\\n /// @dev polynomial commitment evaluation info.\\n struct PcsInfo {\\n // a random combiner that was used to combine evaluations at point\\n uint256 u; // 0x00\\n // the point to be evaluated at\\n uint256 evalPoint; // 0x20\\n // the shifted point to be evaluated at\\n uint256 nextEvalPoint; // 0x40\\n // the polynomial evaluation value\\n uint256 eval; // 0x60\\n // scalars of poly comm for MSM\\n uint256[] commScalars; // 0x80\\n // bases of poly comm for MSM\\n BN254.G1Point[] commBases; // 0xa0\\n // proof of evaluations at point `eval_point`\\n BN254.G1Point openingProof; // 0xc0\\n // proof of evaluations at point `next_eval_point`\\n BN254.G1Point shiftedOpeningProof; // 0xe0\\n }\\n\\n /// @dev Plonk IOP verifier challenges.\\n struct Challenges {\\n uint256 alpha; // 0x00\\n uint256 alpha2; // 0x20\\n uint256 alpha3; // 0x40\\n uint256 beta; // 0x60\\n uint256 gamma; // 0x80\\n uint256 zeta; // 0xA0\\n uint256 v; // 0xC0\\n uint256 u; // 0xE0\\n }\\n\\n /// @dev Batch verify multiple TurboPlonk proofs.\\n /// @param verifyingKeys An array of verifier keys\\n /// @param publicInputs A two-dimensional array of public inputs.\\n /// @param proofs An array of Plonk proofs\\n /// @param extraTranscriptInitMsgs An array of bytes from\\n /// transcript initialization messages\\n function batchVerify(\\n VerifyingKey[] memory verifyingKeys,\\n uint256[][] memory publicInputs,\\n PlonkProof[] memory proofs,\\n bytes[] memory extraTranscriptInitMsgs\\n ) external view returns (bool) {\\n require(\\n verifyingKeys.length == proofs.length &&\\n publicInputs.length == proofs.length &&\\n extraTranscriptInitMsgs.length == proofs.length,\\n \\\"Plonk: invalid input param\\\"\\n );\\n require(proofs.length > 0, \\\"Plonk: need at least 1 proof\\\");\\n\\n PcsInfo[] memory pcsInfos = new PcsInfo[](proofs.length);\\n for (uint256 i = 0; i < proofs.length; i++) {\\n // validate proofs are proper group/field elements\\n _validateProof(proofs[i]);\\n // validate public input are all proper scalar fields\\n for (uint256 j = 0; j < publicInputs[i].length; j++) {\\n BN254.validateScalarField(publicInputs[i][j]);\\n }\\n // prepare pcs info\\n pcsInfos[i] = _preparePcsInfo(\\n verifyingKeys[i],\\n publicInputs[i],\\n proofs[i],\\n extraTranscriptInitMsgs[i]\\n );\\n }\\n\\n return _batchVerifyOpeningProofs(pcsInfos);\\n }\\n\\n /// @dev Validate all group points and scalar fields. Revert if\\n /// any are invalid.\\n /// @param proof A Plonk proof\\n function _validateProof(PlonkProof memory proof) internal pure {\\n BN254.validateG1Point(proof.wire0);\\n BN254.validateG1Point(proof.wire1);\\n BN254.validateG1Point(proof.wire2);\\n BN254.validateG1Point(proof.wire3);\\n BN254.validateG1Point(proof.wire4);\\n BN254.validateG1Point(proof.prodPerm);\\n BN254.validateG1Point(proof.split0);\\n BN254.validateG1Point(proof.split1);\\n BN254.validateG1Point(proof.split2);\\n BN254.validateG1Point(proof.split3);\\n BN254.validateG1Point(proof.split4);\\n BN254.validateG1Point(proof.zeta);\\n BN254.validateScalarField(proof.wireEval0);\\n BN254.validateScalarField(proof.wireEval1);\\n BN254.validateScalarField(proof.wireEval2);\\n BN254.validateScalarField(proof.wireEval3);\\n BN254.validateScalarField(proof.wireEval4);\\n BN254.validateScalarField(proof.sigmaEval0);\\n BN254.validateScalarField(proof.sigmaEval1);\\n BN254.validateScalarField(proof.sigmaEval2);\\n BN254.validateScalarField(proof.sigmaEval3);\\n BN254.validateScalarField(proof.prodPermZetaOmegaEval);\\n }\\n\\n function _preparePcsInfo(\\n VerifyingKey memory verifyingKey,\\n uint256[] memory publicInput,\\n PlonkProof memory proof,\\n bytes memory extraTranscriptInitMsg\\n ) internal view returns (PcsInfo memory res) {\\n require(publicInput.length == verifyingKey.numInputs, \\\"Plonk: wrong verifying key\\\");\\n\\n Challenges memory chal = _computeChallenges(\\n verifyingKey,\\n publicInput,\\n proof,\\n extraTranscriptInitMsg\\n );\\n\\n Poly.EvalDomain memory domain = Poly.newEvalDomain(verifyingKey.domainSize);\\n // pre-compute evaluation data\\n Poly.EvalData memory evalData = Poly.evalDataGen(domain, chal.zeta, publicInput);\\n\\n // compute opening proof in poly comm.\\n uint256[] memory commScalars = new uint256[](30);\\n BN254.G1Point[] memory commBases = new BN254.G1Point[](30);\\n\\n uint256 eval = _prepareOpeningProof(\\n verifyingKey,\\n evalData,\\n proof,\\n chal,\\n commScalars,\\n commBases\\n );\\n\\n uint256 zeta = chal.zeta;\\n uint256 omega = domain.groupGen;\\n uint256 p = BN254.R_MOD;\\n uint256 zetaOmega;\\n assembly {\\n zetaOmega := mulmod(zeta, omega, p)\\n }\\n\\n res = PcsInfo(\\n chal.u,\\n zeta,\\n zetaOmega,\\n eval,\\n commScalars,\\n commBases,\\n proof.zeta,\\n proof.zetaOmega\\n );\\n }\\n\\n function _computeChallenges(\\n VerifyingKey memory verifyingKey,\\n uint256[] memory publicInput,\\n PlonkProof memory proof,\\n bytes memory extraTranscriptInitMsg\\n ) internal pure returns (Challenges memory res) {\\n Transcript.TranscriptData memory transcript;\\n uint256 p = BN254.R_MOD;\\n\\n transcript.appendMessage(extraTranscriptInitMsg);\\n transcript.appendVkAndPubInput(verifyingKey, publicInput);\\n transcript.appendGroupElement(proof.wire0);\\n transcript.appendGroupElement(proof.wire1);\\n transcript.appendGroupElement(proof.wire2);\\n transcript.appendGroupElement(proof.wire3);\\n transcript.appendGroupElement(proof.wire4);\\n\\n // have to compute tau, but not really used anywhere\\n // slither-disable-next-line unused-return\\n transcript.getAndAppendChallenge();\\n res.beta = transcript.getAndAppendChallenge();\\n res.gamma = transcript.getAndAppendChallenge();\\n\\n transcript.appendGroupElement(proof.prodPerm);\\n\\n res.alpha = transcript.getAndAppendChallenge();\\n\\n transcript.appendGroupElement(proof.split0);\\n transcript.appendGroupElement(proof.split1);\\n transcript.appendGroupElement(proof.split2);\\n transcript.appendGroupElement(proof.split3);\\n transcript.appendGroupElement(proof.split4);\\n\\n res.zeta = transcript.getAndAppendChallenge();\\n\\n transcript.appendProofEvaluations(proof);\\n res.v = transcript.getAndAppendChallenge();\\n\\n transcript.appendGroupElement(proof.zeta);\\n transcript.appendGroupElement(proof.zetaOmega);\\n res.u = transcript.getAndAppendChallenge();\\n\\n assembly {\\n let alpha := mload(res)\\n let alpha2 := mulmod(alpha, alpha, p)\\n let alpha3 := mulmod(alpha2, alpha, p)\\n mstore(add(res, 0x20), alpha2)\\n mstore(add(res, 0x40), alpha3)\\n }\\n }\\n\\n /// @dev Compute the constant term of the linearization polynomial.\\n /// ```\\n /// r_plonk = PI - L1(x) * alpha^2 - alpha * \\\\prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * (w_m + gamma) * z(xw)\\n /// ```\\n /// where m is the number of wire types.\\n function _computeLinPolyConstantTerm(\\n Challenges memory chal,\\n PlonkProof memory proof,\\n Poly.EvalData memory evalData\\n ) internal pure returns (uint256 res) {\\n uint256 p = BN254.R_MOD;\\n uint256 lagrangeOneEval = evalData.lagrangeOne;\\n uint256 piEval = evalData.piEval;\\n uint256 perm = 1;\\n\\n assembly {\\n let beta := mload(add(chal, 0x60))\\n let gamma := mload(add(chal, 0x80))\\n\\n // \\\\prod_i=1..m-1 (w_i + beta * sigma_i + gamma)\\n {\\n let w0 := mload(add(proof, 0x1a0))\\n let sigma0 := mload(add(proof, 0x240))\\n perm := mulmod(perm, addmod(add(w0, gamma), mulmod(beta, sigma0, p), p), p)\\n }\\n {\\n let w1 := mload(add(proof, 0x1c0))\\n let sigma1 := mload(add(proof, 0x260))\\n perm := mulmod(perm, addmod(add(w1, gamma), mulmod(beta, sigma1, p), p), p)\\n }\\n {\\n let w2 := mload(add(proof, 0x1e0))\\n let sigma2 := mload(add(proof, 0x280))\\n perm := mulmod(perm, addmod(add(w2, gamma), mulmod(beta, sigma2, p), p), p)\\n }\\n {\\n let w3 := mload(add(proof, 0x200))\\n let sigma3 := mload(add(proof, 0x2a0))\\n perm := mulmod(perm, addmod(add(w3, gamma), mulmod(beta, sigma3, p), p), p)\\n }\\n\\n // \\\\prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * (w_m + gamma) * z(xw)\\n {\\n let w4 := mload(add(proof, 0x220))\\n let permNextEval := mload(add(proof, 0x2c0))\\n perm := mulmod(perm, mulmod(addmod(w4, gamma, p), permNextEval, p), p)\\n }\\n\\n let alpha := mload(chal)\\n let alpha2 := mload(add(chal, 0x20))\\n // PI - L1(x) * alpha^2 - alpha * \\\\prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * (w_m + gamma) * z(xw)\\n res := addmod(piEval, sub(p, mulmod(alpha2, lagrangeOneEval, p)), p)\\n res := addmod(res, sub(p, mulmod(alpha, perm, p)), p)\\n }\\n }\\n\\n /// @dev Compute components in [E]1 and [F]1 used for PolyComm opening verification\\n /// equivalent of JF's https://github.com/EspressoSystems/jellyfish/blob/main/plonk/src/proof_system/verifier.rs#L154-L170\\n /// caller allocates the memory fr commScalars and commBases\\n /// requires Arrays of size 30.\\n /// @param verifyingKey A verifier key\\n /// @param evalData A polynomial evaluation\\n /// @param proof A Plonk proof\\n /// @param chal A set of challenges\\n /// @param commScalars Common scalars\\n /// @param commBases Common bases\\n // The returned commitment is a generalization of\\n // `[F]1` described in Sec 8.4, step 10 of https://eprint.iacr.org/2019/953.pdf\\n // Returned evaluation is the scalar in `[E]1` described in Sec 8.4, step 11 of https://eprint.iacr.org/2019/953.pdf\\n function _prepareOpeningProof(\\n VerifyingKey memory verifyingKey,\\n Poly.EvalData memory evalData,\\n PlonkProof memory proof,\\n Challenges memory chal,\\n uint256[] memory commScalars,\\n BN254.G1Point[] memory commBases\\n ) internal pure returns (uint256 eval) {\\n // compute the constant term of the linearization polynomial\\n uint256 linPolyConstant = _computeLinPolyConstantTerm(chal, proof, evalData);\\n\\n _preparePolyCommitments(verifyingKey, chal, evalData, proof, commScalars, commBases);\\n\\n eval = _prepareEvaluations(linPolyConstant, proof, commScalars);\\n }\\n\\n /// @dev Similar to `aggregate_poly_commitments()` in Jellyfish, but we are not aggregating multiple,\\n /// but rather preparing for `[F]1` from a single proof.\\n /// The caller allocates the memory fr commScalars and commBases.\\n /// Requires Arrays of size 30.\\n function _preparePolyCommitments(\\n VerifyingKey memory verifyingKey,\\n Challenges memory chal,\\n Poly.EvalData memory evalData,\\n PlonkProof memory proof,\\n uint256[] memory commScalars,\\n BN254.G1Point[] memory commBases\\n ) internal pure {\\n _linearizationScalarsAndBases(verifyingKey, chal, evalData, proof, commBases, commScalars);\\n\\n uint256 p = BN254.R_MOD;\\n uint256 v = chal.v;\\n uint256 vBase = v;\\n\\n // Add wire witness polynomial commitments.\\n commScalars[20] = vBase;\\n commBases[20] = proof.wire0;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n commScalars[21] = vBase;\\n commBases[21] = proof.wire1;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n commScalars[22] = vBase;\\n commBases[22] = proof.wire2;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n commScalars[23] = vBase;\\n commBases[23] = proof.wire3;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n commScalars[24] = vBase;\\n commBases[24] = proof.wire4;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n // Add wire sigma polynomial commitments. The last sigma commitment is excluded.\\n commScalars[25] = vBase;\\n commBases[25] = verifyingKey.sigma0;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n commScalars[26] = vBase;\\n commBases[26] = verifyingKey.sigma1;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n commScalars[27] = vBase;\\n commBases[27] = verifyingKey.sigma2;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n commScalars[28] = vBase;\\n commBases[28] = verifyingKey.sigma3;\\n assembly {\\n vBase := mulmod(vBase, v, p)\\n }\\n\\n // Add poly commitments to be evaluated at point `zeta * g`.\\n commScalars[29] = chal.u;\\n commBases[29] = proof.prodPerm;\\n }\\n\\n /// @dev `aggregate_evaluations()` in Jellyfish, but since we are not aggregating multiple, but rather preparing `[E]1` from a single proof.\\n /// @dev caller allocates the memory fr commScalars\\n /// requires Arrays of size 30.\\n /// @param linPolyConstant A linear polynomial constant\\n /// @param proof A Plonk proof\\n /// @param commScalars An array of common scalars\\n /// The returned value is the scalar in `[E]1` described in Sec 8.4, step 11 of https://eprint.iacr.org/2019/953.pdf\\n function _prepareEvaluations(\\n uint256 linPolyConstant,\\n PlonkProof memory proof,\\n uint256[] memory commScalars\\n ) internal pure returns (uint256 eval) {\\n uint256 p = BN254.R_MOD;\\n assembly {\\n eval := sub(p, linPolyConstant)\\n for {\\n let i := 0\\n } lt(i, 10) {\\n i := add(i, 1)\\n } {\\n // the first u256 stores the length of this array;\\n // the next 20 elements are used to store the linearization of the scalars\\n // the first free space starts from 21\\n let combiner := mload(add(commScalars, mul(add(i, 21), 0x20)))\\n let termEval := mload(add(proof, add(0x1a0, mul(i, 0x20))))\\n eval := addmod(eval, mulmod(combiner, termEval, p), p)\\n }\\n }\\n }\\n\\n /// @dev Batchly verify multiple PCS opening proofs.\\n /// `open_key` has been assembled from BN254.P1(), BN254.P2() and contract variable _betaH\\n /// @param pcsInfos An array of PcsInfo\\n /// @dev Returns true if the entire batch verifiies and false otherwise.\\n function _batchVerifyOpeningProofs(PcsInfo[] memory pcsInfos) internal view returns (bool) {\\n uint256 pcsLen = pcsInfos.length;\\n uint256 p = BN254.R_MOD;\\n // Compute a pseudorandom challenge from the instances\\n uint256 r = 1; // for a single proof, no need to use `r` (`r=1` has no effect)\\n if (pcsLen > 1) {\\n Transcript.TranscriptData memory transcript;\\n for (uint256 i = 0; i < pcsLen; i++) {\\n transcript.appendChallenge(pcsInfos[i].u);\\n }\\n r = transcript.getAndAppendChallenge();\\n }\\n\\n BN254.G1Point memory a1;\\n BN254.G1Point memory b1;\\n\\n // Compute A := A0 + r * A1 + ... + r^{m-1} * Am\\n {\\n uint256[] memory scalars = new uint256[](2 * pcsLen);\\n BN254.G1Point[] memory bases = new BN254.G1Point[](2 * pcsLen);\\n uint256 rBase = 1;\\n for (uint256 i = 0; i < pcsLen; i++) {\\n scalars[2 * i] = rBase;\\n bases[2 * i] = pcsInfos[i].openingProof;\\n\\n {\\n // slither-disable-next-line write-after-write\\n uint256 tmp;\\n uint256 u = pcsInfos[i].u;\\n assembly {\\n tmp := mulmod(rBase, u, p)\\n }\\n scalars[2 * i + 1] = tmp;\\n }\\n bases[2 * i + 1] = pcsInfos[i].shiftedOpeningProof;\\n\\n assembly {\\n rBase := mulmod(rBase, r, p)\\n }\\n }\\n a1 = BN254.multiScalarMul(bases, scalars);\\n }\\n\\n // Compute B := B0 + r * B1 + ... + r^{m-1} * Bm\\n {\\n uint256[] memory scalars;\\n BN254.G1Point[] memory bases;\\n {\\n // variable scoping to avoid \\\"Stack too deep\\\"\\n uint256 scalarsLenPerInfo = pcsInfos[0].commScalars.length;\\n uint256 totalScalarsLen = (2 + scalarsLenPerInfo) * pcsInfos.length + 1;\\n scalars = new uint256[](totalScalarsLen);\\n bases = new BN254.G1Point[](totalScalarsLen);\\n }\\n uint256 sumEvals = 0;\\n uint256 idx = 0;\\n uint256 rBase = 1;\\n for (uint256 i = 0; i < pcsInfos.length; i++) {\\n for (uint256 j = 0; j < pcsInfos[0].commScalars.length; j++) {\\n {\\n // scalars[idx] = (rBase * pcsInfos[i].commScalars[j]) % BN254.R_MOD;\\n uint256 s = pcsInfos[i].commScalars[j];\\n uint256 tmp;\\n assembly {\\n // slither-disable-next-line variable-scope\\n tmp := mulmod(rBase, s, p)\\n }\\n scalars[idx] = tmp;\\n }\\n bases[idx] = pcsInfos[i].commBases[j];\\n idx += 1;\\n }\\n\\n {\\n // scalars[idx] = (rBase * pcsInfos[i].evalPoint) % BN254.R_MOD;\\n uint256 evalPoint = pcsInfos[i].evalPoint;\\n uint256 tmp;\\n assembly {\\n // slither-disable-next-line variable-scope\\n tmp := mulmod(rBase, evalPoint, p)\\n }\\n scalars[idx] = tmp;\\n }\\n bases[idx] = pcsInfos[i].openingProof;\\n idx += 1;\\n\\n {\\n // scalars[idx] = (rBase * pcsInfos[i].u * pcsInfos[i].nextEvalPoint) % BN254.R_MOD;\\n uint256 u = pcsInfos[i].u;\\n uint256 nextEvalPoint = pcsInfos[i].nextEvalPoint;\\n uint256 tmp;\\n assembly {\\n // slither-disable-next-line variable-scope\\n tmp := mulmod(rBase, mulmod(u, nextEvalPoint, p), p)\\n }\\n scalars[idx] = tmp;\\n }\\n bases[idx] = pcsInfos[i].shiftedOpeningProof;\\n idx += 1;\\n\\n {\\n // sumEvals = (sumEvals + rBase * pcsInfos[i].eval) % BN254.R_MOD;\\n // rBase = (rBase * r) % BN254.R_MOD;\\n uint256 eval = pcsInfos[i].eval;\\n assembly {\\n sumEvals := addmod(sumEvals, mulmod(rBase, eval, p), p)\\n rBase := mulmod(rBase, r, p)\\n }\\n }\\n }\\n scalars[idx] = BN254.negate(sumEvals);\\n bases[idx] = BN254.P1();\\n b1 = BN254.negate(BN254.multiScalarMul(bases, scalars));\\n }\\n\\n // Check e(A, [x]2) ?= e(B, [1]2)\\n return BN254.pairingProd2(a1, _betaH, b1, BN254.P2());\\n }\\n\\n /// @dev Compute the linearization of the scalars and bases.\\n /// The caller allocates the memory from commScalars and commBases.\\n /// Requires arrays of size 30.\\n /// @param verifyingKey The verifying key\\n /// @param challenge A set of challenges\\n /// @param evalData Polynomial evaluation data\\n /// @param proof A Plonk proof\\n /// @param bases An array of BN254 G1 points\\n /// @param scalars An array of scalars\\n function _linearizationScalarsAndBases(\\n VerifyingKey memory verifyingKey,\\n Challenges memory challenge,\\n Poly.EvalData memory evalData,\\n PlonkProof memory proof,\\n BN254.G1Point[] memory bases,\\n uint256[] memory scalars\\n ) internal pure {\\n uint256 firstScalar;\\n uint256 secondScalar;\\n uint256 rhs;\\n uint256 tmp;\\n uint256 tmp2;\\n uint256 p = BN254.R_MOD;\\n\\n // ============================================\\n // Compute coefficient for the permutation product polynomial commitment.\\n // firstScalar =\\n // L1(zeta) * alpha^2\\n // + alpha\\n // * (beta * zeta + wireEval0 + gamma)\\n // * (beta * k1 * zeta + wireEval1 + gamma)\\n // * (beta * k2 * zeta + wireEval2 + gamma)\\n // * ...\\n // where wireEval0, wireEval1, wireEval2, ... are in w_evals\\n // ============================================\\n // first base and scala:\\n // - proof.prodPerm\\n // - firstScalar\\n assembly {\\n // firstScalar = alpha^2 * L1(zeta)\\n firstScalar := mulmod(mload(add(challenge, 0x20)), mload(add(evalData, 0x20)), p)\\n\\n // rhs = alpha\\n rhs := mload(challenge)\\n\\n // tmp = beta * zeta\\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(challenge, 0xA0)), p)\\n\\n // =================================\\n // k0 (which is 1) component\\n // (beta * zeta + wireEval0 + gamma)\\n // =================================\\n tmp2 := addmod(tmp, mload(add(proof, 0x1A0)), p)\\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\\n\\n rhs := mulmod(tmp2, rhs, p)\\n\\n // =================================\\n // k1 component\\n // (beta * zeta * k1 + wireEval1 + gamma)\\n // =================================\\n tmp2 := mulmod(tmp, _COSET_K1, p)\\n tmp2 := addmod(tmp2, mload(add(proof, 0x1C0)), p)\\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\\n\\n rhs := mulmod(tmp2, rhs, p)\\n\\n // =================================\\n // k2 component\\n // (beta * zeta * k2 + wireEval2 + gamma)\\n // =================================\\n tmp2 := mulmod(tmp, _COSET_K2, p)\\n tmp2 := addmod(tmp2, mload(add(proof, 0x1E0)), p)\\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\\n rhs := mulmod(tmp2, rhs, p)\\n\\n // =================================\\n // k3 component\\n // (beta * zeta * k3 + wireEval3 + gamma)\\n // =================================\\n tmp2 := mulmod(tmp, _COSET_K3, p)\\n tmp2 := addmod(tmp2, mload(add(proof, 0x200)), p)\\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\\n rhs := mulmod(tmp2, rhs, p)\\n\\n // =================================\\n // k4 component\\n // (beta * zeta * k4 + wireEval4 + gamma)\\n // =================================\\n tmp2 := mulmod(tmp, _COSET_K4, p)\\n tmp2 := addmod(tmp2, mload(add(proof, 0x220)), p)\\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\\n rhs := mulmod(tmp2, rhs, p)\\n\\n firstScalar := addmod(firstScalar, rhs, p)\\n }\\n bases[0] = proof.prodPerm;\\n scalars[0] = firstScalar;\\n\\n // ============================================\\n // Compute coefficient for the last wire sigma polynomial commitment.\\n // secondScalar = alpha * beta * z_w * [s_sigma_3]_1\\n // * (wireEval0 + gamma + beta * sigmaEval0)\\n // * (wireEval1 + gamma + beta * sigmaEval1)\\n // * ...\\n // ============================================\\n // second base and scala:\\n // - verifyingKey.sigma4\\n // - secondScalar\\n assembly {\\n // secondScalar = alpha * beta * z_w\\n secondScalar := mulmod(mload(challenge), mload(add(challenge, 0x60)), p)\\n secondScalar := mulmod(secondScalar, mload(add(proof, 0x2C0)), p)\\n\\n // (wireEval0 + gamma + beta * sigmaEval0)\\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(proof, 0x240)), p)\\n tmp := addmod(tmp, mload(add(proof, 0x1A0)), p)\\n tmp := addmod(tmp, mload(add(challenge, 0x80)), p)\\n\\n secondScalar := mulmod(secondScalar, tmp, p)\\n\\n // (wireEval1 + gamma + beta * sigmaEval1)\\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(proof, 0x260)), p)\\n tmp := addmod(tmp, mload(add(proof, 0x1C0)), p)\\n tmp := addmod(tmp, mload(add(challenge, 0x80)), p)\\n\\n secondScalar := mulmod(secondScalar, tmp, p)\\n\\n // (wireEval2 + gamma + beta * sigmaEval2)\\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(proof, 0x280)), p)\\n tmp := addmod(tmp, mload(add(proof, 0x1E0)), p)\\n tmp := addmod(tmp, mload(add(challenge, 0x80)), p)\\n\\n secondScalar := mulmod(secondScalar, tmp, p)\\n\\n // (wireEval3 + gamma + beta * sigmaEval3)\\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(proof, 0x2A0)), p)\\n tmp := addmod(tmp, mload(add(proof, 0x200)), p)\\n tmp := addmod(tmp, mload(add(challenge, 0x80)), p)\\n\\n secondScalar := mulmod(secondScalar, tmp, p)\\n }\\n bases[1] = verifyingKey.sigma4;\\n scalars[1] = p - secondScalar;\\n\\n // ============================================\\n // next 13 are for selectors:\\n //\\n // the selectors are organized as\\n // - q_lc\\n // - q_mul\\n // - q_hash\\n // - q_o\\n // - q_c\\n // - q_ecc\\n // ============================================\\n\\n // ============\\n // q_lc\\n // ============\\n // q_1...q_4\\n scalars[2] = proof.wireEval0;\\n scalars[3] = proof.wireEval1;\\n scalars[4] = proof.wireEval2;\\n scalars[5] = proof.wireEval3;\\n bases[2] = verifyingKey.q1;\\n bases[3] = verifyingKey.q2;\\n bases[4] = verifyingKey.q3;\\n bases[5] = verifyingKey.q4;\\n\\n // ============\\n // q_M\\n // ============\\n // q_M12 and q_M34\\n // q_M12 = w_evals[0] * w_evals[1];\\n assembly {\\n tmp := mulmod(mload(add(proof, 0x1A0)), mload(add(proof, 0x1C0)), p)\\n }\\n scalars[6] = tmp;\\n bases[6] = verifyingKey.qM12;\\n\\n assembly {\\n tmp := mulmod(mload(add(proof, 0x1E0)), mload(add(proof, 0x200)), p)\\n }\\n scalars[7] = tmp;\\n bases[7] = verifyingKey.qM34;\\n\\n // ============\\n // q_H\\n // ============\\n // w_evals[0].pow([5]);\\n assembly {\\n tmp := mload(add(proof, 0x1A0))\\n tmp2 := mulmod(tmp, tmp, p)\\n tmp2 := mulmod(tmp2, tmp2, p)\\n tmp := mulmod(tmp, tmp2, p)\\n }\\n scalars[8] = tmp;\\n bases[8] = verifyingKey.qH1;\\n\\n // w_evals[1].pow([5]);\\n assembly {\\n tmp := mload(add(proof, 0x1C0))\\n tmp2 := mulmod(tmp, tmp, p)\\n tmp2 := mulmod(tmp2, tmp2, p)\\n tmp := mulmod(tmp, tmp2, p)\\n }\\n scalars[9] = tmp;\\n bases[9] = verifyingKey.qH2;\\n\\n // w_evals[2].pow([5]);\\n assembly {\\n tmp := mload(add(proof, 0x1E0))\\n tmp2 := mulmod(tmp, tmp, p)\\n tmp2 := mulmod(tmp2, tmp2, p)\\n tmp := mulmod(tmp, tmp2, p)\\n }\\n scalars[10] = tmp;\\n bases[10] = verifyingKey.qH3;\\n\\n // w_evals[3].pow([5]);\\n assembly {\\n tmp := mload(add(proof, 0x200))\\n tmp2 := mulmod(tmp, tmp, p)\\n tmp2 := mulmod(tmp2, tmp2, p)\\n tmp := mulmod(tmp, tmp2, p)\\n }\\n scalars[11] = tmp;\\n bases[11] = verifyingKey.qH4;\\n\\n // ============\\n // q_o and q_c\\n // ============\\n // q_o\\n scalars[12] = p - proof.wireEval4;\\n bases[12] = verifyingKey.qO;\\n // q_c\\n scalars[13] = 1;\\n bases[13] = verifyingKey.qC;\\n\\n // ============\\n // q_Ecc\\n // ============\\n // q_Ecc = w_evals[0] * w_evals[1] * w_evals[2] * w_evals[3] * w_evals[4];\\n assembly {\\n tmp := mulmod(mload(add(proof, 0x1A0)), mload(add(proof, 0x1C0)), p)\\n tmp := mulmod(tmp, mload(add(proof, 0x1E0)), p)\\n tmp := mulmod(tmp, mload(add(proof, 0x200)), p)\\n tmp := mulmod(tmp, mload(add(proof, 0x220)), p)\\n }\\n scalars[14] = tmp;\\n bases[14] = verifyingKey.qEcc;\\n\\n // ============================================\\n // the last 5 are for splitting quotient commitments\\n // ============================================\\n\\n // first one is 1-zeta^n\\n scalars[15] = p - evalData.vanishEval;\\n bases[15] = proof.split0;\\n assembly {\\n // tmp = zeta^{n+2}\\n tmp := addmod(mload(evalData), 1, p)\\n // todo: use pre-computed zeta^2\\n tmp2 := mulmod(mload(add(challenge, 0xA0)), mload(add(challenge, 0xA0)), p)\\n tmp := mulmod(tmp, tmp2, p)\\n }\\n\\n // second one is (1-zeta^n) zeta^(n+2)\\n assembly {\\n tmp2 := mulmod(mload(add(scalars, mul(16, 0x20))), tmp, p)\\n }\\n scalars[16] = tmp2;\\n bases[16] = proof.split1;\\n\\n // third one is (1-zeta^n) zeta^2(n+2)\\n assembly {\\n tmp2 := mulmod(mload(add(scalars, mul(17, 0x20))), tmp, p)\\n }\\n scalars[17] = tmp2;\\n bases[17] = proof.split2;\\n\\n // forth one is (1-zeta^n) zeta^3(n+2)\\n assembly {\\n tmp2 := mulmod(mload(add(scalars, mul(18, 0x20))), tmp, p)\\n }\\n scalars[18] = tmp2;\\n bases[18] = proof.split3;\\n\\n // fifth one is (1-zeta^n) zeta^4(n+2)\\n assembly {\\n tmp2 := mulmod(mload(add(scalars, mul(19, 0x20))), tmp, p)\\n }\\n scalars[19] = tmp2;\\n bases[19] = proof.split4;\\n }\\n}\\n\",\"keccak256\":\"0x4ac51cc4f8d9489789812618cb7d7ec391eb114ef942d062a786cf6bf2e2cbc7\",\"license\":\"GPL-3.0-or-later\"},\"contracts/verifier/Transcript.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n//\\n// There is currently a bug in solidity that may affect the security of the contract.\\n// An patch is available for Jellyfish https://github.com/EspressoSystems/jellyfish/pull/70\\n// Corresponding changes are to be made to the solidity code here.\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"solidity-bytes-utils/contracts/BytesLib.sol\\\";\\nimport \\\"../libraries/Utils.sol\\\";\\nimport {BN254} from \\\"../libraries/BN254.sol\\\";\\nimport {IPlonkVerifier} from \\\"../interfaces/IPlonkVerifier.sol\\\";\\n\\nlibrary Transcript {\\n struct TranscriptData {\\n bytes transcript;\\n bytes32[2] state;\\n }\\n\\n // ================================\\n // Primitive functions\\n // ================================\\n function appendMessage(TranscriptData memory self, bytes memory message) internal pure {\\n self.transcript = abi.encodePacked(self.transcript, message);\\n }\\n\\n function appendFieldElement(TranscriptData memory self, uint256 fieldElement) internal pure {\\n appendMessage(self, abi.encodePacked(Utils.reverseEndianness(fieldElement)));\\n }\\n\\n function appendGroupElement(TranscriptData memory self, BN254.G1Point memory comm)\\n internal\\n pure\\n {\\n bytes memory commBytes = BN254.g1Serialize(comm);\\n appendMessage(self, commBytes);\\n }\\n\\n // ================================\\n // Transcript APIs\\n // ================================\\n function appendChallenge(TranscriptData memory self, uint256 challenge) internal pure {\\n appendFieldElement(self, challenge);\\n }\\n\\n function appendCommitments(TranscriptData memory self, BN254.G1Point[] memory comms)\\n internal\\n pure\\n {\\n for (uint256 i = 0; i < comms.length; i++) {\\n appendCommitment(self, comms[i]);\\n }\\n }\\n\\n function appendCommitment(TranscriptData memory self, BN254.G1Point memory comm)\\n internal\\n pure\\n {\\n appendGroupElement(self, comm);\\n }\\n\\n function getAndAppendChallenge(TranscriptData memory self) internal pure returns (uint256) {\\n bytes32 h1 = keccak256(\\n abi.encodePacked(self.state[0], self.state[1], self.transcript, uint8(0))\\n );\\n bytes32 h2 = keccak256(\\n abi.encodePacked(self.state[0], self.state[1], self.transcript, uint8(1))\\n );\\n\\n self.state[0] = h1;\\n self.state[1] = h2;\\n\\n return BN254.fromLeBytesModOrder(BytesLib.slice(abi.encodePacked(h1, h2), 0, 48));\\n }\\n\\n /// @dev Append the verifying key and the public inputs to the transcript.\\n /// @param verifyingKey verifiying key\\n /// @param publicInput a list of field elements\\n function appendVkAndPubInput(\\n TranscriptData memory self,\\n IPlonkVerifier.VerifyingKey memory verifyingKey,\\n uint256[] memory publicInput\\n ) internal pure {\\n uint64 sizeInBits = 254;\\n\\n // Fr field size in bits\\n appendMessage(\\n self,\\n BytesLib.slice(abi.encodePacked(Utils.reverseEndianness(sizeInBits)), 0, 8)\\n );\\n\\n // domain size\\n appendMessage(\\n self,\\n BytesLib.slice(\\n abi.encodePacked(Utils.reverseEndianness(verifyingKey.domainSize)),\\n 0,\\n 8\\n )\\n );\\n\\n // number of inputs\\n appendMessage(\\n self,\\n BytesLib.slice(abi.encodePacked(Utils.reverseEndianness(verifyingKey.numInputs)), 0, 8)\\n );\\n\\n // =====================\\n // k: coset representatives\\n // =====================\\n // Currently, K is hardcoded, and there are 5 of them since\\n // # wire types == 5\\n appendFieldElement(self, 0x1); // k0 = 1\\n appendFieldElement(\\n self,\\n 0x2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a\\n ); // k1\\n appendFieldElement(\\n self,\\n 0x1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025\\n ); // k2\\n appendFieldElement(\\n self,\\n 0x2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a\\n ); // k3\\n appendFieldElement(\\n self,\\n 0x2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881\\n ); // k4\\n\\n // selectors\\n appendGroupElement(self, verifyingKey.q1);\\n appendGroupElement(self, verifyingKey.q2);\\n appendGroupElement(self, verifyingKey.q3);\\n appendGroupElement(self, verifyingKey.q4);\\n appendGroupElement(self, verifyingKey.qM12);\\n appendGroupElement(self, verifyingKey.qM34);\\n appendGroupElement(self, verifyingKey.qH1);\\n appendGroupElement(self, verifyingKey.qH2);\\n appendGroupElement(self, verifyingKey.qH3);\\n appendGroupElement(self, verifyingKey.qH4);\\n appendGroupElement(self, verifyingKey.qO);\\n appendGroupElement(self, verifyingKey.qC);\\n appendGroupElement(self, verifyingKey.qEcc);\\n\\n // sigmas\\n appendGroupElement(self, verifyingKey.sigma0);\\n appendGroupElement(self, verifyingKey.sigma1);\\n appendGroupElement(self, verifyingKey.sigma2);\\n appendGroupElement(self, verifyingKey.sigma3);\\n appendGroupElement(self, verifyingKey.sigma4);\\n\\n // public inputs\\n for (uint256 i = 0; i < publicInput.length; i++) {\\n appendFieldElement(self, publicInput[i]);\\n }\\n }\\n\\n /// @dev Append the proof to the transcript.\\n function appendProofEvaluations(\\n TranscriptData memory self,\\n IPlonkVerifier.PlonkProof memory proof\\n ) internal pure {\\n appendFieldElement(self, proof.wireEval0);\\n appendFieldElement(self, proof.wireEval1);\\n appendFieldElement(self, proof.wireEval2);\\n appendFieldElement(self, proof.wireEval3);\\n appendFieldElement(self, proof.wireEval4);\\n\\n appendFieldElement(self, proof.sigmaEval0);\\n appendFieldElement(self, proof.sigmaEval1);\\n appendFieldElement(self, proof.sigmaEval2);\\n appendFieldElement(self, proof.sigmaEval3);\\n\\n appendFieldElement(self, proof.prodPermZetaOmegaEval);\\n }\\n}\\n\",\"keccak256\":\"0x76f6f4335b9bbc09e1b056864d70663c10dce8a667a0f9525bbe826f6dc06321\",\"license\":\"GPL-3.0-or-later\"},\"solidity-bytes-utils/contracts/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 \\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity >=0.8.0 <0.9.0;\\n\\n\\nlibrary BytesLib {\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(\\n fslot,\\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\\n ),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n )\\n internal\\n pure\\n returns (bytes memory)\\n {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n uint16 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x2), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n uint32 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x4), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n uint64 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x8), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n uint96 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0xc), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n uint128 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x10), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n bytes32 tempBytes32;\\n\\n assembly {\\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempBytes32;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(\\n bytes storage _preBytes,\\n bytes memory _postBytes\\n )\\n internal\\n view\\n returns (bool)\\n {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n for {} eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n}\\n\",\"keccak256\":\"0xf75784dfc94ea43668eb195d5690a1dde1b6eda62017e73a3899721583821d29\",\"license\":\"Unlicense\"}},\"version\":1}", + "bytecode": "0x6101006040527f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c160808190527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b060a08190527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe460c08190527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5560e08190526000939093556001919091556002556003553480156100bb57600080fd5b50613a55806100cb6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063830affd614610030575b600080fd5b61004361003e366004613629565b610057565b604051901515815260200160405180910390f35b60008251855114801561006b575082518451145b8015610078575082518251145b6100c95760405162461bcd60e51b815260206004820152601a60248201527f506c6f6e6b3a20696e76616c696420696e70757420706172616d00000000000060448201526064015b60405180910390fd5b600083511161011a5760405162461bcd60e51b815260206004820152601c60248201527f506c6f6e6b3a206e656564206174206c6561737420312070726f6f660000000060448201526064016100c0565b6000835167ffffffffffffffff8111156101365761013661315d565b60405190808252806020026020018201604052801561016f57816020015b61015c61306f565b8152602001906001900390816101545790505b50905060005b84518110156102b3576101a0858281518110610193576101936138ac565b60200260200101516102c9565b60005b8682815181106101b5576101b56138ac565b602002602001015151811015610212576102008783815181106101da576101da6138ac565b602002602001015182815181106101f3576101f36138ac565b60200260200101516103f6565b8061020a816138d8565b9150506101a3565b50610283878281518110610228576102286138ac565b6020026020010151878381518110610242576102426138ac565b602002602001015187848151811061025c5761025c6138ac565b6020026020010151878581518110610276576102766138ac565b6020026020010151610458565b828281518110610295576102956138ac565b602002602001018190525080806102ab906138d8565b915050610175565b506102bd816105df565b9150505b949350505050565b80516102d490610d0e565b6102e18160200151610d0e565b6102ee8160400151610d0e565b6102fb8160600151610d0e565b6103088160800151610d0e565b6103158160a00151610d0e565b6103228160c00151610d0e565b61032f8160e00151610d0e565b61033d816101000151610d0e565b61034b816101200151610d0e565b610359816101400151610d0e565b610367816101600151610d0e565b610375816101a001516103f6565b610383816101c001516103f6565b610391816101e001516103f6565b61039f8161020001516103f6565b6103ad8161022001516103f6565b6103bb8161024001516103f6565b6103c98161026001516103f6565b6103d78161028001516103f6565b6103e5816102a001516103f6565b6103f3816102c001516103f6565b50565b600080516020613a008339815191528110806104545760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c64000000000060448201526064016100c0565b5050565b61046061306f565b84602001518451146104b45760405162461bcd60e51b815260206004820152601a60248201527f506c6f6e6b3a2077726f6e6720766572696679696e67206b657900000000000060448201526064016100c0565b60006104c286868686610daf565b905060006104d38760000151610f7d565b905060006104e6828460a0015189611248565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b604080518082019091526000808252602082015281526020019060019003908161052957905050905060006105628b858b8987876112a8565b60a0870151606087015191925090600080516020613a00833981519152600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016087015160c08201526101809096015192860192909252509295945050505050565b8051600090600080516020613a00833981519152600180831115610660576106056130e9565b60005b8481101561065257610640878281518110610625576106256138ac565b602002602001015160000151836112dd90919063ffffffff16565b8061064a816138d8565b915050610608565b5061065c816112e7565b9150505b6040805180820190915260008082526020820152604080518082019091526000808252602082015260006106958660026138f1565b67ffffffffffffffff8111156106ad576106ad61315d565b6040519080825280602002602001820160405280156106d6578160200160208202803683370190505b50905060006106e68760026138f1565b67ffffffffffffffff8111156106fe576106fe61315d565b60405190808252806020026020018201604052801561074357816020015b604080518082019091526000808252602082015281526020019060019003908161071c5790505b509050600160005b8881101561088c5781846107608360026138f1565b81518110610770576107706138ac565b6020026020010181815250508a818151811061078e5761078e6138ac565b602002602001015160c00151838260026107a891906138f1565b815181106107b8576107b86138ac565b60200260200101819052506000808c83815181106107d8576107d86138ac565b602002602001015160000151905089818509915081866107f98560026138f1565b610804906001613910565b81518110610814576108146138ac565b60200260200101818152505050508a8181518110610834576108346138ac565b602002602001015160e001518382600261084e91906138f1565b610859906001613910565b81518110610869576108696138ac565b602002602001018190525087878309915080610884816138d8565b91505061074b565b506108978284611414565b94505050506060806000896000815181106108b4576108b46138ac565b60200260200101516080015151905060008a518260026108d49190613910565b6108de91906138f1565b6108e9906001613910565b90508067ffffffffffffffff8111156109045761090461315d565b60405190808252806020026020018201604052801561092d578160200160208202803683370190505b5093508067ffffffffffffffff8111156109495761094961315d565b60405190808252806020026020018201604052801561098e57816020015b60408051808201909152600080825260208201528152602001906001900390816109675790505b509250600091508190506001815b8c51811015610c385760005b8d6000815181106109bb576109bb6138ac565b60200260200101516080015151811015610aa65760008e83815181106109e3576109e36138ac565b6020026020010151608001518281518110610a0057610a006138ac565b6020026020010151905060008c828609905080898781518110610a2557610a256138ac565b60200260200101818152505050508d8281518110610a4557610a456138ac565b602002602001015160a001518181518110610a6257610a626138ac565b6020026020010151868581518110610a7c57610a7c6138ac565b6020908102919091010152610a92600185613910565b935080610a9e816138d8565b9150506109a8565b5060008d8281518110610abb57610abb6138ac565b602002602001015160200151905060008b828509905080888681518110610ae457610ae46138ac565b60200260200101818152505050508c8181518110610b0457610b046138ac565b602002602001015160c00151858481518110610b2257610b226138ac565b6020908102919091010152610b38600184613910565b925060008d8281518110610b4e57610b4e6138ac565b602002602001015160000151905060008e8381518110610b7057610b706138ac565b602002602001015160400151905060008c8d8385098609905080898781518110610b9c57610b9c6138ac565b6020026020010181815250505050508c8181518110610bbd57610bbd6138ac565b602002602001015160e00151858481518110610bdb57610bdb6138ac565b6020908102919091010152610bf1600184613910565b925060008d8281518110610c0757610c076138ac565b60200260200101516060015190508a8b828509860894508a8a84099250508080610c30906138d8565b91505061099c565b50610c4283611518565b858381518110610c5457610c546138ac565b602002602001018181525050610c8c604080518082018252600080825260209182015281518083019092526001825260029082015290565b848381518110610c9e57610c9e6138ac565b6020026020010181905250610cbb610cb68587611414565b611550565b6040805160808101825260005481526001546020820152600254918101919091526003546060820152909650610d0395508794509250859150610cfe90506115ef565b6116c0565b979650505050505050565b805160208201516000917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4791826003818085800985090883828309148115831517198483108585101616169350505081610daa5760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e7400000000000000000060448201526064016100c0565b505050565b610df760405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b610dff6130e9565b600080516020613a00833981519152610e1882856117a2565b610e238288886117cc565b8451610e30908390611a38565b6020850151610e40908390611a38565b6040850151610e50908390611a38565b6060850151610e60908390611a38565b6080850151610e70908390611a38565b610e79826112e7565b50610e83826112e7565b6060840152610e91826112e7565b608084015260a0850151610ea6908390611a38565b610eaf826112e7565b835260c0850151610ec1908390611a38565b60e0850151610ed1908390611a38565b610100850151610ee2908390611a38565b610120850151610ef3908390611a38565b610140850151610f04908390611a38565b610f0d826112e7565b60a0840152610f1c8286611a4f565b610f25826112e7565b60c0840152610160850151610f3b908390611a38565b610180850151610f4c908390611a38565b610f55826112e7565b60e0840152825181818009828282096020860191909152604085015250919695505050505050565b610faf6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816140000361104357506040805160a081018252600e815260208101929092527f30638ce1a7661b6337a964756aa75257c6bf4778d89789ab819ce60c19b04001908201527f2d965651cdd9e4811f4e51b80ddca8a8b4a93ee17420aae6adaa01c2617c6e8560608201527f281c036f06e7e9e911680d42558e6e8cf40976b0677771c0f8eee934641c8410608082015290565b81618000036110d757506040805160a081018252600f815260208101929092527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001908201527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb60608201527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4608082015290565b81620100000361116b57506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b81620200000361120057506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b60405162461bcd60e51b815260206004820152601c60248201527f506f6c793a2073697a65206d75737420696e20325e7b31347e31377d0000000060448201526064016100c0565b61126c60405180606001604052806000815260200160008152602001600081525090565b6112768484611ae5565b8082526112869085908590611b39565b6020820152805161129c90859084908690611b9f565b60408201529392505050565b6000806112b6858789611cf6565b90506112c6888689898888611de2565b6112d18187866120ee565b98975050505050505050565b610454828261213e565b6020818101518051908201518351604051600094859461130f94909390929091869101613963565b60405160208183030381529060405280519060200120905060008360200151600060028110611340576113406138ac565b6020020151846020015160016002811061135c5761135c6138ac565b60200201518560000151600160405160200161137b9493929190613963565b6040516020818303038152906040528051906020012090508184602001516000600281106113ab576113ab6138ac565b6020020181815250508084602001516001600281106113cc576113cc6138ac565b6020020181815250506102c161140f83836040516020016113f7929190918252602082015260400190565b60405160208183030381529060405260006030612171565b612299565b604080518082019091526000808252602082015282518251146114795760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d6174636860448201526064016100c0565b6114b78360008151811061148f5761148f6138ac565b6020026020010151836000815181106114aa576114aa6138ac565b6020026020010151612319565b905060015b8251811015611511576114fd826114f88684815181106114de576114de6138ac565b60200260200101518685815181106114aa576114aa6138ac565b6123bd565b915080611509816138d8565b9150506114bc565b5092915050565b6000611532600080516020613a00833981519152836139b1565b61154a90600080516020613a008339815191526139d3565b92915050565b6040805180820190915260008082526020820152815160208301511590151615611578575090565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001516115bd91906139b1565b6115e7907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd476139d3565b905292915050565b61161a6040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa815250905090565b60008060006040518751815260208801516020820152865160408201526020870151606082015260408701516080820152606087015160a0820152855160c0820152602086015160e08201528451610100820152602085015161012082015260408501516101408201526060850151610160820152602060006101808360085afa9150506000519150806117965760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c6564210000000060448201526064016100c0565b50151595945050505050565b81516040516117b6919083906020016139ea565b60408051601f1981840301815291905290915250565b60fe61180d846118086117de84612464565b6040516020016117f091815260200190565b60405160208183030381529060405260006008612171565b6117a2565b611821846118086117de8660000151612464565b611835846118086117de8660200151612464565b61184084600161213e565b61186a847f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a61213e565b611894847f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02561213e565b6118be847f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a61213e565b6118e8847f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88161213e565b6118f6848460e00151611a38565b61190584846101000151611a38565b61191484846101200151611a38565b61192384846101400151611a38565b61193284846101600151611a38565b61194184846101800151611a38565b61195084846101e00151611a38565b61195f84846102000151611a38565b61196e84846102200151611a38565b61197d84846102400151611a38565b61198c84846101a00151611a38565b61199b84846101c00151611a38565b6119aa84846102600151611a38565b6119b8848460400151611a38565b6119c6848460600151611a38565b6119d4848460800151611a38565b6119e2848460a00151611a38565b6119f0848460c00151611a38565b60005b8251811015611a3157611a1f85848381518110611a1257611a126138ac565b602002602001015161213e565b80611a29816138d8565b9150506119f3565b5050505050565b6000611a43826125b0565b9050610daa83826117a2565b611a5e82826101a0015161213e565b611a6d82826101c0015161213e565b611a7c82826101e0015161213e565b611a8b8282610200015161213e565b611a9a8282610220015161213e565b611aa98282610240015161213e565b611ab88282610260015161213e565b611ac78282610280015161213e565b611ad682826102a0015161213e565b61045482826102c0015161213e565b8151600090600080516020613a0083398151915290838015611b295784935060005b82811015611b1d57838586099450600101611b07565b50600184039350611b30565b6001830393505b50505092915050565b600081600003611b4b57506000611b98565b6040840151600080516020613a0083398151915290600090828186099050858015611b7b57600187039250611b82565b6001840392505b50611b8c82612673565b91508282820993505050505b9392505050565b600081600003611bb1575060006102c1565b83516040860151600080516020613a008339815191529190600090819081908180611bdc8d88612719565b905060008767ffffffffffffffff811115611bf957611bf961315d565b604051908082528060200260200182016040528015611c22578160200160208202803683370190505b509050888b850993506001925060005b88811015611c6757602081026020840101519550898d878c030896508987850960208281028401018890529350600101611c32565b50611c7183612673565b925060005b88811015611ce45760208102602084010151955089868609975089848909975060005b89811015611cc357808214611cbb576020810260208401015197508a888a0998505b600101611c99565b506020810260208f010151955089868909975089888c089a50600101611c76565b50505050505050505050949350505050565b600080600080516020613a008339815191529050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a0151878889838709858501088609945050506101c08901516102608a0151878889838709858501088609945050506101e08901516102808a0151878889838709858501088609945050506102008901516102a08a01518788898387098585010886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b611df08686868685876127b9565b60c08501518251600080516020613a0083398151915291908190819086906014908110611e1f57611e1f6138ac565b602002602001018181525050856000015184601481518110611e4357611e436138ac565b60200260200101819052508282820990508085601581518110611e6857611e686138ac565b602002602001018181525050856020015184601581518110611e8c57611e8c6138ac565b60200260200101819052508282820990508085601681518110611eb157611eb16138ac565b602002602001018181525050856040015184601681518110611ed557611ed56138ac565b60200260200101819052508282820990508085601781518110611efa57611efa6138ac565b602002602001018181525050856060015184601781518110611f1e57611f1e6138ac565b60200260200101819052508282820990508085601881518110611f4357611f436138ac565b602002602001018181525050856080015184601881518110611f6757611f676138ac565b60200260200101819052508282820990508085601981518110611f8c57611f8c6138ac565b602002602001018181525050886040015184601981518110611fb057611fb06138ac565b60200260200101819052508282820990508085601a81518110611fd557611fd56138ac565b602002602001018181525050886060015184601a81518110611ff957611ff96138ac565b60200260200101819052508282820990508085601b8151811061201e5761201e6138ac565b602002602001018181525050886080015184601b81518110612042576120426138ac565b60200260200101819052508282820990508085601c81518110612067576120676138ac565b6020026020010181815250508860a0015184601c8151811061208b5761208b6138ac565b60200260200101819052508282820990508760e0015185601d815181106120b4576120b46138ac565b6020026020010181815250508560a0015184601d815181106120d8576120d86138ac565b6020026020010181905250505050505050505050565b600080516020613a008339815191528381039060005b600a8110156121355760206015820102840151602082026101a0018601518384828409860894505050600101612104565b50509392505050565b6104548261214b83612464565b60405160200161215d91815260200190565b6040516020818303038152906040526117a2565b60608161217f81601f613910565b10156121cd5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016100c0565b6121d78284613910565b845110156122275760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016100c0565b6060821580156122465760405191506000825260208201604052612290565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561227f578051835260209283019201612267565b5050858452601f01601f1916604052505b50949350505050565b6000805b825181101561231357600080516020613a0083398151915261010083099150600080516020613a008339815191528382600186516122db91906139d3565b6122e591906139d3565b815181106122f5576122f56138ac565b016020015160f81c830891508061230b816138d8565b91505061229d565b50919050565b6040805180820190915260008082526020820152612335613103565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061236757600080fd5b50806123b55760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c6564210000000000000060448201526064016100c0565b505092915050565b60408051808201909152600080825260208201526123d9613121565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061241657600080fd5b50806123b55760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c65642100000060448201526064016100c0565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b8051602082015160609160009115901516156125e9577f4000000000000000000000000000000000000000000000000000000000000000175b60208301517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760019190911b1061263d57507f80000000000000000000000000000000000000000000000000000000000000005b825161264a908217612464565b60405160200161265c91815260200190565b604051602081830303815290604052915050919050565b6000806000600080516020613a00833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816127125760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c65642100000060448201526064016100c0565b5050919050565b6060828101516001600080516020613a008339815191528467ffffffffffffffff8111156127495761274961315d565b604051908082528060200260200182016040528015612772578160200160208202803683370190505b50935084151915611b305760208401856020028101600182526020820191505b808210156127ae57828585099350838252602082019150612792565b505050505092915050565b600080600080600080600080516020613a0083398151915290508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c015183089150808483099350807f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a84099150806101c08a0151830891508060808c015183089150808483099350807f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02584099150806101e08a0151830891508060808c015183089150808483099350807f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a84099150806102008a0151830891508060808c015183089150808483099350807f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88184099150806102208a0151830891508060808c0151830891508084830993508084870895508860a0015188600081518110612930576129306138ac565b6020026020010181905250858760008151811061294f5761294f6138ac565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c0015188600181518110612a3157612a316138ac565b6020908102919091010152612a4685826139d3565b87600181518110612a5957612a596138ac565b602002602001018181525050886101a0015187600281518110612a7e57612a7e6138ac565b602002602001018181525050886101c0015187600381518110612aa357612aa36138ac565b602002602001018181525050886101e0015187600481518110612ac857612ac86138ac565b60200260200101818152505088610200015187600581518110612aed57612aed6138ac565b6020026020010181815250508b60e0015188600281518110612b1157612b116138ac565b60200260200101819052508b610100015188600381518110612b3557612b356138ac565b60200260200101819052508b610120015188600481518110612b5957612b596138ac565b60200260200101819052508b610140015188600581518110612b7d57612b7d6138ac565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110612bac57612bac6138ac565b6020026020010181815250508b610160015188600681518110612bd157612bd16138ac565b6020026020010181905250806102008a01516101e08b01510992508287600781518110612c0057612c006138ac565b6020026020010181815250508b610180015188600781518110612c2557612c256138ac565b60200260200101819052506101a089015192508083840991508082830991508082840992508287600881518110612c5e57612c5e6138ac565b6020026020010181815250508b6101e0015188600881518110612c8357612c836138ac565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110612cbc57612cbc6138ac565b6020026020010181815250508b610200015188600981518110612ce157612ce16138ac565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110612d1a57612d1a6138ac565b6020026020010181815250508b610220015188600a81518110612d3f57612d3f6138ac565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110612d7857612d786138ac565b6020026020010181815250508b610240015188600b81518110612d9d57612d9d6138ac565b602002602001018190525088610220015181612db991906139d3565b87600c81518110612dcc57612dcc6138ac565b6020026020010181815250508b6101a0015188600c81518110612df157612df16138ac565b6020026020010181905250600187600d81518110612e1157612e116138ac565b6020026020010181815250508b6101c0015188600d81518110612e3657612e366138ac565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e81518110612e8657612e866138ac565b6020026020010181815250508b610260015188600e81518110612eab57612eab6138ac565b60209081029190910101528951612ec290826139d3565b87600f81518110612ed557612ed56138ac565b6020026020010181815250508860c0015188600f81518110612ef957612ef96138ac565b60200260200101819052508060018b510860a08c0151909350819080099150808284099250808360206010028901510991508187601081518110612f3f57612f3f6138ac565b6020026020010181815250508860e0015188601081518110612f6357612f636138ac565b6020026020010181905250808360206011028901510991508187601181518110612f8f57612f8f6138ac565b60200260200101818152505088610100015188601181518110612fb457612fb46138ac565b6020026020010181905250808360206012028901510991508187601281518110612fe057612fe06138ac565b60200260200101818152505088610120015188601281518110613005576130056138ac565b6020026020010181905250808360206013028901510991508187601381518110613031576130316138ac565b60200260200101818152505088610140015188601381518110613056576130566138ac565b6020026020010181905250505050505050505050505050565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160608152602001606081526020016130c2604051806040016040528060008152602001600081525090565b81526020016130e4604051806040016040528060008152602001600081525090565b905290565b6040518060400160405280606081526020016130e461313f565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040516102e0810167ffffffffffffffff811182821017156131975761319761315d565b60405290565b604051610280810167ffffffffffffffff811182821017156131975761319761315d565b604051601f8201601f1916810167ffffffffffffffff811182821017156131ea576131ea61315d565b604052919050565b600067ffffffffffffffff82111561320c5761320c61315d565b5060051b60200190565b60006040828403121561322857600080fd5b6040516040810181811067ffffffffffffffff8211171561324b5761324b61315d565b604052823581526020928301359281019290925250919050565b600082601f83011261327657600080fd5b8135602061328b613286836131f2565b6131c1565b828152600592831b85018201928282019190878511156132aa57600080fd5b8387015b8581101561333e57803567ffffffffffffffff8111156132ce5760008081fd5b8801603f81018a136132e05760008081fd5b8581013560406132f2613286836131f2565b82815291851b8301810191888101908d84111561330f5760008081fd5b938201935b8385101561332d57843582529389019390890190613314565b8852505050938501935084016132ae565b5090979650505050505050565b600082601f83011261335c57600080fd5b813561336a613286826131f2565b80828252602082019150610480602081850287010193508684111561338e57600080fd5b602086015b84811015613539578181890312156133ab5760008081fd5b6133b3613173565b6133bd8983613216565b815260406133cd8a828501613216565b602083015260806133e08b828601613216565b8284015260c091506133f48b838601613216565b60608401526101006134088c828701613216565b82850152610140915061341d8c838701613216565b60a08501526101806134318d828801613216565b848601526101c093506134468d858801613216565b60e086015261020061345a8e828901613216565b83870152610240925061346f8e848901613216565b6101208701526102806134848f828a01613216565b858801526102c094506134998f868a01613216565b6101608801526134ad8f6103008a01613216565b838801526103408801356101a0880152610360880135868801526103808801356101e08801526103a0880135828801526103c08801356102208801526103e08801358488015261040088013561026088015261042088013581880152505050506104408401356102a0840152610460840135818401525050808552506020840193508181019050613393565b50909695505050505050565b6000601f838184011261355757600080fd5b82356020613567613286836131f2565b82815260059290921b8501810191818101908784111561358657600080fd5b8287015b8481101561361d57803567ffffffffffffffff808211156135ab5760008081fd5b818a0191508a603f8301126135c05760008081fd5b858201356040828211156135d6576135d661315d565b6135e7828b01601f191689016131c1565b92508183528c818386010111156135fe5760008081fd5b818185018985013750600090820187015284525091830191830161358a565b50979650505050505050565b6000806000806080858703121561363f57600080fd5b843567ffffffffffffffff8082111561365757600080fd5b818701915087601f83011261366b57600080fd5b8135602061367b613286836131f2565b8281526104c0928302850182019282820191908c85111561369b57600080fd5b958301955b848710156138385780878e0312156136b757600080fd5b6136bf61319d565b8735815284880135858201526136d88e60408a01613216565b60408201526136ea8e60808a01613216565b60608201526136fc8e60c08a01613216565b608082015261370f8e6101008a01613216565b60a08201526137228e6101408a01613216565b60c08201526137358e6101808a01613216565b60e08201526137488e6101c08a01613216565b61010082015261375c8e6102008a01613216565b6101208201526102406137718f828b01613216565b6101408301526137858f6102808b01613216565b6101608301526137998f6102c08b01613216565b6101808301526137ad8f6103008b01613216565b6101a08301526137c18f6103408b01613216565b6101c08301526137d58f6103808b01613216565b6101e08301526137e98f6103c08b01613216565b6102008301526137fd8f6104008b01613216565b6102208301526138118f6104408b01613216565b908201526138238e6104808a01613216565b610260820152835295860195918301916136a0565b509850508801359250508082111561384f57600080fd5b61385b88838901613265565b9450604087013591508082111561387157600080fd5b61387d8883890161334b565b9350606087013591508082111561389357600080fd5b506138a087828801613545565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016138ea576138ea6138c2565b5060010190565b600081600019048311821515161561390b5761390b6138c2565b500290565b60008219821115613923576139236138c2565b500190565b6000815160005b81811015613949576020818501810151868301520161392f565b81811115613958576000828601525b509290920192915050565b848152836020820152600061397b6040830185613928565b60f89390931b7fff0000000000000000000000000000000000000000000000000000000000000016835250506001019392505050565b6000826139ce57634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156139e5576139e56138c2565b500390565b60006102c16139f98386613928565b8461392856fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212207bbde0d57a098da74f02de527b4760ca35d3285227b9dca7e0f6b0dd8ebb70f964736f6c634300080d0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063830affd614610030575b600080fd5b61004361003e366004613629565b610057565b604051901515815260200160405180910390f35b60008251855114801561006b575082518451145b8015610078575082518251145b6100c95760405162461bcd60e51b815260206004820152601a60248201527f506c6f6e6b3a20696e76616c696420696e70757420706172616d00000000000060448201526064015b60405180910390fd5b600083511161011a5760405162461bcd60e51b815260206004820152601c60248201527f506c6f6e6b3a206e656564206174206c6561737420312070726f6f660000000060448201526064016100c0565b6000835167ffffffffffffffff8111156101365761013661315d565b60405190808252806020026020018201604052801561016f57816020015b61015c61306f565b8152602001906001900390816101545790505b50905060005b84518110156102b3576101a0858281518110610193576101936138ac565b60200260200101516102c9565b60005b8682815181106101b5576101b56138ac565b602002602001015151811015610212576102008783815181106101da576101da6138ac565b602002602001015182815181106101f3576101f36138ac565b60200260200101516103f6565b8061020a816138d8565b9150506101a3565b50610283878281518110610228576102286138ac565b6020026020010151878381518110610242576102426138ac565b602002602001015187848151811061025c5761025c6138ac565b6020026020010151878581518110610276576102766138ac565b6020026020010151610458565b828281518110610295576102956138ac565b602002602001018190525080806102ab906138d8565b915050610175565b506102bd816105df565b9150505b949350505050565b80516102d490610d0e565b6102e18160200151610d0e565b6102ee8160400151610d0e565b6102fb8160600151610d0e565b6103088160800151610d0e565b6103158160a00151610d0e565b6103228160c00151610d0e565b61032f8160e00151610d0e565b61033d816101000151610d0e565b61034b816101200151610d0e565b610359816101400151610d0e565b610367816101600151610d0e565b610375816101a001516103f6565b610383816101c001516103f6565b610391816101e001516103f6565b61039f8161020001516103f6565b6103ad8161022001516103f6565b6103bb8161024001516103f6565b6103c98161026001516103f6565b6103d78161028001516103f6565b6103e5816102a001516103f6565b6103f3816102c001516103f6565b50565b600080516020613a008339815191528110806104545760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c64000000000060448201526064016100c0565b5050565b61046061306f565b84602001518451146104b45760405162461bcd60e51b815260206004820152601a60248201527f506c6f6e6b3a2077726f6e6720766572696679696e67206b657900000000000060448201526064016100c0565b60006104c286868686610daf565b905060006104d38760000151610f7d565b905060006104e6828460a0015189611248565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b604080518082019091526000808252602082015281526020019060019003908161052957905050905060006105628b858b8987876112a8565b60a0870151606087015191925090600080516020613a00833981519152600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016087015160c08201526101809096015192860192909252509295945050505050565b8051600090600080516020613a00833981519152600180831115610660576106056130e9565b60005b8481101561065257610640878281518110610625576106256138ac565b602002602001015160000151836112dd90919063ffffffff16565b8061064a816138d8565b915050610608565b5061065c816112e7565b9150505b6040805180820190915260008082526020820152604080518082019091526000808252602082015260006106958660026138f1565b67ffffffffffffffff8111156106ad576106ad61315d565b6040519080825280602002602001820160405280156106d6578160200160208202803683370190505b50905060006106e68760026138f1565b67ffffffffffffffff8111156106fe576106fe61315d565b60405190808252806020026020018201604052801561074357816020015b604080518082019091526000808252602082015281526020019060019003908161071c5790505b509050600160005b8881101561088c5781846107608360026138f1565b81518110610770576107706138ac565b6020026020010181815250508a818151811061078e5761078e6138ac565b602002602001015160c00151838260026107a891906138f1565b815181106107b8576107b86138ac565b60200260200101819052506000808c83815181106107d8576107d86138ac565b602002602001015160000151905089818509915081866107f98560026138f1565b610804906001613910565b81518110610814576108146138ac565b60200260200101818152505050508a8181518110610834576108346138ac565b602002602001015160e001518382600261084e91906138f1565b610859906001613910565b81518110610869576108696138ac565b602002602001018190525087878309915080610884816138d8565b91505061074b565b506108978284611414565b94505050506060806000896000815181106108b4576108b46138ac565b60200260200101516080015151905060008a518260026108d49190613910565b6108de91906138f1565b6108e9906001613910565b90508067ffffffffffffffff8111156109045761090461315d565b60405190808252806020026020018201604052801561092d578160200160208202803683370190505b5093508067ffffffffffffffff8111156109495761094961315d565b60405190808252806020026020018201604052801561098e57816020015b60408051808201909152600080825260208201528152602001906001900390816109675790505b509250600091508190506001815b8c51811015610c385760005b8d6000815181106109bb576109bb6138ac565b60200260200101516080015151811015610aa65760008e83815181106109e3576109e36138ac565b6020026020010151608001518281518110610a0057610a006138ac565b6020026020010151905060008c828609905080898781518110610a2557610a256138ac565b60200260200101818152505050508d8281518110610a4557610a456138ac565b602002602001015160a001518181518110610a6257610a626138ac565b6020026020010151868581518110610a7c57610a7c6138ac565b6020908102919091010152610a92600185613910565b935080610a9e816138d8565b9150506109a8565b5060008d8281518110610abb57610abb6138ac565b602002602001015160200151905060008b828509905080888681518110610ae457610ae46138ac565b60200260200101818152505050508c8181518110610b0457610b046138ac565b602002602001015160c00151858481518110610b2257610b226138ac565b6020908102919091010152610b38600184613910565b925060008d8281518110610b4e57610b4e6138ac565b602002602001015160000151905060008e8381518110610b7057610b706138ac565b602002602001015160400151905060008c8d8385098609905080898781518110610b9c57610b9c6138ac565b6020026020010181815250505050508c8181518110610bbd57610bbd6138ac565b602002602001015160e00151858481518110610bdb57610bdb6138ac565b6020908102919091010152610bf1600184613910565b925060008d8281518110610c0757610c076138ac565b60200260200101516060015190508a8b828509860894508a8a84099250508080610c30906138d8565b91505061099c565b50610c4283611518565b858381518110610c5457610c546138ac565b602002602001018181525050610c8c604080518082018252600080825260209182015281518083019092526001825260029082015290565b848381518110610c9e57610c9e6138ac565b6020026020010181905250610cbb610cb68587611414565b611550565b6040805160808101825260005481526001546020820152600254918101919091526003546060820152909650610d0395508794509250859150610cfe90506115ef565b6116c0565b979650505050505050565b805160208201516000917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4791826003818085800985090883828309148115831517198483108585101616169350505081610daa5760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e7400000000000000000060448201526064016100c0565b505050565b610df760405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b610dff6130e9565b600080516020613a00833981519152610e1882856117a2565b610e238288886117cc565b8451610e30908390611a38565b6020850151610e40908390611a38565b6040850151610e50908390611a38565b6060850151610e60908390611a38565b6080850151610e70908390611a38565b610e79826112e7565b50610e83826112e7565b6060840152610e91826112e7565b608084015260a0850151610ea6908390611a38565b610eaf826112e7565b835260c0850151610ec1908390611a38565b60e0850151610ed1908390611a38565b610100850151610ee2908390611a38565b610120850151610ef3908390611a38565b610140850151610f04908390611a38565b610f0d826112e7565b60a0840152610f1c8286611a4f565b610f25826112e7565b60c0840152610160850151610f3b908390611a38565b610180850151610f4c908390611a38565b610f55826112e7565b60e0840152825181818009828282096020860191909152604085015250919695505050505050565b610faf6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b816140000361104357506040805160a081018252600e815260208101929092527f30638ce1a7661b6337a964756aa75257c6bf4778d89789ab819ce60c19b04001908201527f2d965651cdd9e4811f4e51b80ddca8a8b4a93ee17420aae6adaa01c2617c6e8560608201527f281c036f06e7e9e911680d42558e6e8cf40976b0677771c0f8eee934641c8410608082015290565b81618000036110d757506040805160a081018252600f815260208101929092527f3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001908201527f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb60608201527f05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4608082015290565b81620100000361116b57506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b81620200000361120057506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b60405162461bcd60e51b815260206004820152601c60248201527f506f6c793a2073697a65206d75737420696e20325e7b31347e31377d0000000060448201526064016100c0565b61126c60405180606001604052806000815260200160008152602001600081525090565b6112768484611ae5565b8082526112869085908590611b39565b6020820152805161129c90859084908690611b9f565b60408201529392505050565b6000806112b6858789611cf6565b90506112c6888689898888611de2565b6112d18187866120ee565b98975050505050505050565b610454828261213e565b6020818101518051908201518351604051600094859461130f94909390929091869101613963565b60405160208183030381529060405280519060200120905060008360200151600060028110611340576113406138ac565b6020020151846020015160016002811061135c5761135c6138ac565b60200201518560000151600160405160200161137b9493929190613963565b6040516020818303038152906040528051906020012090508184602001516000600281106113ab576113ab6138ac565b6020020181815250508084602001516001600281106113cc576113cc6138ac565b6020020181815250506102c161140f83836040516020016113f7929190918252602082015260400190565b60405160208183030381529060405260006030612171565b612299565b604080518082019091526000808252602082015282518251146114795760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d6174636860448201526064016100c0565b6114b78360008151811061148f5761148f6138ac565b6020026020010151836000815181106114aa576114aa6138ac565b6020026020010151612319565b905060015b8251811015611511576114fd826114f88684815181106114de576114de6138ac565b60200260200101518685815181106114aa576114aa6138ac565b6123bd565b915080611509816138d8565b9150506114bc565b5092915050565b6000611532600080516020613a00833981519152836139b1565b61154a90600080516020613a008339815191526139d3565b92915050565b6040805180820190915260008082526020820152815160208301511590151615611578575090565b6040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001516115bd91906139b1565b6115e7907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd476139d3565b905292915050565b61161a6040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa815250905090565b60008060006040518751815260208801516020820152865160408201526020870151606082015260408701516080820152606087015160a0820152855160c0820152602086015160e08201528451610100820152602085015161012082015260408501516101408201526060850151610160820152602060006101808360085afa9150506000519150806117965760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c6564210000000060448201526064016100c0565b50151595945050505050565b81516040516117b6919083906020016139ea565b60408051601f1981840301815291905290915250565b60fe61180d846118086117de84612464565b6040516020016117f091815260200190565b60405160208183030381529060405260006008612171565b6117a2565b611821846118086117de8660000151612464565b611835846118086117de8660200151612464565b61184084600161213e565b61186a847f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a61213e565b611894847f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02561213e565b6118be847f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a61213e565b6118e8847f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88161213e565b6118f6848460e00151611a38565b61190584846101000151611a38565b61191484846101200151611a38565b61192384846101400151611a38565b61193284846101600151611a38565b61194184846101800151611a38565b61195084846101e00151611a38565b61195f84846102000151611a38565b61196e84846102200151611a38565b61197d84846102400151611a38565b61198c84846101a00151611a38565b61199b84846101c00151611a38565b6119aa84846102600151611a38565b6119b8848460400151611a38565b6119c6848460600151611a38565b6119d4848460800151611a38565b6119e2848460a00151611a38565b6119f0848460c00151611a38565b60005b8251811015611a3157611a1f85848381518110611a1257611a126138ac565b602002602001015161213e565b80611a29816138d8565b9150506119f3565b5050505050565b6000611a43826125b0565b9050610daa83826117a2565b611a5e82826101a0015161213e565b611a6d82826101c0015161213e565b611a7c82826101e0015161213e565b611a8b8282610200015161213e565b611a9a8282610220015161213e565b611aa98282610240015161213e565b611ab88282610260015161213e565b611ac78282610280015161213e565b611ad682826102a0015161213e565b61045482826102c0015161213e565b8151600090600080516020613a0083398151915290838015611b295784935060005b82811015611b1d57838586099450600101611b07565b50600184039350611b30565b6001830393505b50505092915050565b600081600003611b4b57506000611b98565b6040840151600080516020613a0083398151915290600090828186099050858015611b7b57600187039250611b82565b6001840392505b50611b8c82612673565b91508282820993505050505b9392505050565b600081600003611bb1575060006102c1565b83516040860151600080516020613a008339815191529190600090819081908180611bdc8d88612719565b905060008767ffffffffffffffff811115611bf957611bf961315d565b604051908082528060200260200182016040528015611c22578160200160208202803683370190505b509050888b850993506001925060005b88811015611c6757602081026020840101519550898d878c030896508987850960208281028401018890529350600101611c32565b50611c7183612673565b925060005b88811015611ce45760208102602084010151955089868609975089848909975060005b89811015611cc357808214611cbb576020810260208401015197508a888a0998505b600101611c99565b506020810260208f010151955089868909975089888c089a50600101611c76565b50505050505050505050949350505050565b600080600080516020613a008339815191529050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a0151878889838709858501088609945050506101c08901516102608a0151878889838709858501088609945050506101e08901516102808a0151878889838709858501088609945050506102008901516102a08a01518788898387098585010886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b611df08686868685876127b9565b60c08501518251600080516020613a0083398151915291908190819086906014908110611e1f57611e1f6138ac565b602002602001018181525050856000015184601481518110611e4357611e436138ac565b60200260200101819052508282820990508085601581518110611e6857611e686138ac565b602002602001018181525050856020015184601581518110611e8c57611e8c6138ac565b60200260200101819052508282820990508085601681518110611eb157611eb16138ac565b602002602001018181525050856040015184601681518110611ed557611ed56138ac565b60200260200101819052508282820990508085601781518110611efa57611efa6138ac565b602002602001018181525050856060015184601781518110611f1e57611f1e6138ac565b60200260200101819052508282820990508085601881518110611f4357611f436138ac565b602002602001018181525050856080015184601881518110611f6757611f676138ac565b60200260200101819052508282820990508085601981518110611f8c57611f8c6138ac565b602002602001018181525050886040015184601981518110611fb057611fb06138ac565b60200260200101819052508282820990508085601a81518110611fd557611fd56138ac565b602002602001018181525050886060015184601a81518110611ff957611ff96138ac565b60200260200101819052508282820990508085601b8151811061201e5761201e6138ac565b602002602001018181525050886080015184601b81518110612042576120426138ac565b60200260200101819052508282820990508085601c81518110612067576120676138ac565b6020026020010181815250508860a0015184601c8151811061208b5761208b6138ac565b60200260200101819052508282820990508760e0015185601d815181106120b4576120b46138ac565b6020026020010181815250508560a0015184601d815181106120d8576120d86138ac565b6020026020010181905250505050505050505050565b600080516020613a008339815191528381039060005b600a8110156121355760206015820102840151602082026101a0018601518384828409860894505050600101612104565b50509392505050565b6104548261214b83612464565b60405160200161215d91815260200190565b6040516020818303038152906040526117a2565b60608161217f81601f613910565b10156121cd5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016100c0565b6121d78284613910565b845110156122275760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016100c0565b6060821580156122465760405191506000825260208201604052612290565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561227f578051835260209283019201612267565b5050858452601f01601f1916604052505b50949350505050565b6000805b825181101561231357600080516020613a0083398151915261010083099150600080516020613a008339815191528382600186516122db91906139d3565b6122e591906139d3565b815181106122f5576122f56138ac565b016020015160f81c830891508061230b816138d8565b91505061229d565b50919050565b6040805180820190915260008082526020820152612335613103565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061236757600080fd5b50806123b55760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c6564210000000000000060448201526064016100c0565b505092915050565b60408051808201909152600080825260208201526123d9613121565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061241657600080fd5b50806123b55760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c65642100000060448201526064016100c0565b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b8051602082015160609160009115901516156125e9577f4000000000000000000000000000000000000000000000000000000000000000175b60208301517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760019190911b1061263d57507f80000000000000000000000000000000000000000000000000000000000000005b825161264a908217612464565b60405160200161265c91815260200190565b604051602081830303815290604052915050919050565b6000806000600080516020613a00833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816127125760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c65642100000060448201526064016100c0565b5050919050565b6060828101516001600080516020613a008339815191528467ffffffffffffffff8111156127495761274961315d565b604051908082528060200260200182016040528015612772578160200160208202803683370190505b50935084151915611b305760208401856020028101600182526020820191505b808210156127ae57828585099350838252602082019150612792565b505050505092915050565b600080600080600080600080516020613a0083398151915290508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c015183089150808483099350807f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a84099150806101c08a0151830891508060808c015183089150808483099350807f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02584099150806101e08a0151830891508060808c015183089150808483099350807f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a84099150806102008a0151830891508060808c015183089150808483099350807f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88184099150806102208a0151830891508060808c0151830891508084830993508084870895508860a0015188600081518110612930576129306138ac565b6020026020010181905250858760008151811061294f5761294f6138ac565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c0015188600181518110612a3157612a316138ac565b6020908102919091010152612a4685826139d3565b87600181518110612a5957612a596138ac565b602002602001018181525050886101a0015187600281518110612a7e57612a7e6138ac565b602002602001018181525050886101c0015187600381518110612aa357612aa36138ac565b602002602001018181525050886101e0015187600481518110612ac857612ac86138ac565b60200260200101818152505088610200015187600581518110612aed57612aed6138ac565b6020026020010181815250508b60e0015188600281518110612b1157612b116138ac565b60200260200101819052508b610100015188600381518110612b3557612b356138ac565b60200260200101819052508b610120015188600481518110612b5957612b596138ac565b60200260200101819052508b610140015188600581518110612b7d57612b7d6138ac565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110612bac57612bac6138ac565b6020026020010181815250508b610160015188600681518110612bd157612bd16138ac565b6020026020010181905250806102008a01516101e08b01510992508287600781518110612c0057612c006138ac565b6020026020010181815250508b610180015188600781518110612c2557612c256138ac565b60200260200101819052506101a089015192508083840991508082830991508082840992508287600881518110612c5e57612c5e6138ac565b6020026020010181815250508b6101e0015188600881518110612c8357612c836138ac565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110612cbc57612cbc6138ac565b6020026020010181815250508b610200015188600981518110612ce157612ce16138ac565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a81518110612d1a57612d1a6138ac565b6020026020010181815250508b610220015188600a81518110612d3f57612d3f6138ac565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b81518110612d7857612d786138ac565b6020026020010181815250508b610240015188600b81518110612d9d57612d9d6138ac565b602002602001018190525088610220015181612db991906139d3565b87600c81518110612dcc57612dcc6138ac565b6020026020010181815250508b6101a0015188600c81518110612df157612df16138ac565b6020026020010181905250600187600d81518110612e1157612e116138ac565b6020026020010181815250508b6101c0015188600d81518110612e3657612e366138ac565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e81518110612e8657612e866138ac565b6020026020010181815250508b610260015188600e81518110612eab57612eab6138ac565b60209081029190910101528951612ec290826139d3565b87600f81518110612ed557612ed56138ac565b6020026020010181815250508860c0015188600f81518110612ef957612ef96138ac565b60200260200101819052508060018b510860a08c0151909350819080099150808284099250808360206010028901510991508187601081518110612f3f57612f3f6138ac565b6020026020010181815250508860e0015188601081518110612f6357612f636138ac565b6020026020010181905250808360206011028901510991508187601181518110612f8f57612f8f6138ac565b60200260200101818152505088610100015188601181518110612fb457612fb46138ac565b6020026020010181905250808360206012028901510991508187601281518110612fe057612fe06138ac565b60200260200101818152505088610120015188601281518110613005576130056138ac565b6020026020010181905250808360206013028901510991508187601381518110613031576130316138ac565b60200260200101818152505088610140015188601381518110613056576130566138ac565b6020026020010181905250505050505050505050505050565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160608152602001606081526020016130c2604051806040016040528060008152602001600081525090565b81526020016130e4604051806040016040528060008152602001600081525090565b905290565b6040518060400160405280606081526020016130e461313f565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040516102e0810167ffffffffffffffff811182821017156131975761319761315d565b60405290565b604051610280810167ffffffffffffffff811182821017156131975761319761315d565b604051601f8201601f1916810167ffffffffffffffff811182821017156131ea576131ea61315d565b604052919050565b600067ffffffffffffffff82111561320c5761320c61315d565b5060051b60200190565b60006040828403121561322857600080fd5b6040516040810181811067ffffffffffffffff8211171561324b5761324b61315d565b604052823581526020928301359281019290925250919050565b600082601f83011261327657600080fd5b8135602061328b613286836131f2565b6131c1565b828152600592831b85018201928282019190878511156132aa57600080fd5b8387015b8581101561333e57803567ffffffffffffffff8111156132ce5760008081fd5b8801603f81018a136132e05760008081fd5b8581013560406132f2613286836131f2565b82815291851b8301810191888101908d84111561330f5760008081fd5b938201935b8385101561332d57843582529389019390890190613314565b8852505050938501935084016132ae565b5090979650505050505050565b600082601f83011261335c57600080fd5b813561336a613286826131f2565b80828252602082019150610480602081850287010193508684111561338e57600080fd5b602086015b84811015613539578181890312156133ab5760008081fd5b6133b3613173565b6133bd8983613216565b815260406133cd8a828501613216565b602083015260806133e08b828601613216565b8284015260c091506133f48b838601613216565b60608401526101006134088c828701613216565b82850152610140915061341d8c838701613216565b60a08501526101806134318d828801613216565b848601526101c093506134468d858801613216565b60e086015261020061345a8e828901613216565b83870152610240925061346f8e848901613216565b6101208701526102806134848f828a01613216565b858801526102c094506134998f868a01613216565b6101608801526134ad8f6103008a01613216565b838801526103408801356101a0880152610360880135868801526103808801356101e08801526103a0880135828801526103c08801356102208801526103e08801358488015261040088013561026088015261042088013581880152505050506104408401356102a0840152610460840135818401525050808552506020840193508181019050613393565b50909695505050505050565b6000601f838184011261355757600080fd5b82356020613567613286836131f2565b82815260059290921b8501810191818101908784111561358657600080fd5b8287015b8481101561361d57803567ffffffffffffffff808211156135ab5760008081fd5b818a0191508a603f8301126135c05760008081fd5b858201356040828211156135d6576135d661315d565b6135e7828b01601f191689016131c1565b92508183528c818386010111156135fe5760008081fd5b818185018985013750600090820187015284525091830191830161358a565b50979650505050505050565b6000806000806080858703121561363f57600080fd5b843567ffffffffffffffff8082111561365757600080fd5b818701915087601f83011261366b57600080fd5b8135602061367b613286836131f2565b8281526104c0928302850182019282820191908c85111561369b57600080fd5b958301955b848710156138385780878e0312156136b757600080fd5b6136bf61319d565b8735815284880135858201526136d88e60408a01613216565b60408201526136ea8e60808a01613216565b60608201526136fc8e60c08a01613216565b608082015261370f8e6101008a01613216565b60a08201526137228e6101408a01613216565b60c08201526137358e6101808a01613216565b60e08201526137488e6101c08a01613216565b61010082015261375c8e6102008a01613216565b6101208201526102406137718f828b01613216565b6101408301526137858f6102808b01613216565b6101608301526137998f6102c08b01613216565b6101808301526137ad8f6103008b01613216565b6101a08301526137c18f6103408b01613216565b6101c08301526137d58f6103808b01613216565b6101e08301526137e98f6103c08b01613216565b6102008301526137fd8f6104008b01613216565b6102208301526138118f6104408b01613216565b908201526138238e6104808a01613216565b610260820152835295860195918301916136a0565b509850508801359250508082111561384f57600080fd5b61385b88838901613265565b9450604087013591508082111561387157600080fd5b61387d8883890161334b565b9350606087013591508082111561389357600080fd5b506138a087828801613545565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016138ea576138ea6138c2565b5060010190565b600081600019048311821515161561390b5761390b6138c2565b500290565b60008219821115613923576139236138c2565b500190565b6000815160005b81811015613949576020818501810151868301520161392f565b81811115613958576000828601525b509290920192915050565b848152836020820152600061397b6040830185613928565b60f89390931b7fff0000000000000000000000000000000000000000000000000000000000000016835250506001019392505050565b6000826139ce57634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156139e5576139e56138c2565b500390565b60006102c16139f98386613928565b8461392856fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212207bbde0d57a098da74f02de527b4760ca35d3285227b9dca7e0f6b0dd8ebb70f964736f6c634300080d0033", + "devdoc": { + "kind": "dev", + "methods": { + "batchVerify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256))[],uint256[][],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)[],bytes[])": { + "details": "Batch verify multiple TurboPlonk proofs.", + "params": { + "extraTranscriptInitMsgs": "An array of bytes from transcript initialization messages", + "proofs": "An array of Plonk proofs", + "publicInputs": "A two-dimensional array of public inputs.", + "verifyingKeys": "An array of verifier keys" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 11927, + "contract": "contracts/verifier/PlonkVerifier.sol:PlonkVerifier", + "label": "_betaH", + "offset": 0, + "slot": "0", + "type": "t_struct(G2Point)6199_storage" + } + ], + "types": { + "t_struct(G2Point)6199_storage": { + "encoding": "inplace", + "label": "struct BN254.G2Point", + "members": [ + { + "astId": 6192, + "contract": "contracts/verifier/PlonkVerifier.sol:PlonkVerifier", + "label": "x0", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 6194, + "contract": "contracts/verifier/PlonkVerifier.sol:PlonkVerifier", + "label": "x1", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 6196, + "contract": "contracts/verifier/PlonkVerifier.sol:PlonkVerifier", + "label": "y0", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 6198, + "contract": "contracts/verifier/PlonkVerifier.sol:PlonkVerifier", + "label": "y1", + "offset": 0, + "slot": "3", + "type": "t_uint256" + } + ], + "numberOfBytes": "128" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/arbitrum_goerli/RecordsMerkleTree.json b/contracts/deployments/arbitrum_goerli/RecordsMerkleTree.json new file mode 100644 index 00000000..d224c30f --- /dev/null +++ b/contracts/deployments/arbitrum_goerli/RecordsMerkleTree.json @@ -0,0 +1,277 @@ +{ + "address": "0x4650e4737C366aE86354F8A3E3CFD23F41E90F77", + "abi": [ + { + "inputs": [ + { + "internalType": "uint8", + "name": "merkleTreeHeight", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getHeight", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNumLeaves", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRootValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "elements", + "type": "uint256[]" + } + ], + "name": "updateRecordsMerkleTree", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x4dfaa2d633474f4bef22eb5e0c689186e0c27b6b50a585193cdf9b26c9bac812", + "receipt": { + "to": null, + "from": "0x21a49524e319C0b28dAA1d79d50B6D7A346490B2", + "contractAddress": "0x4650e4737C366aE86354F8A3E3CFD23F41E90F77", + "transactionIndex": 1, + "gasUsed": "1444327", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801000000000000000000000000000000000000020000000000000000000800000000000020000004000000000000400000001000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x8d578aacf97d29f095f7841bbb284ba45206097bcf01994f9a918beece6553ca", + "transactionHash": "0x4dfaa2d633474f4bef22eb5e0c689186e0c27b6b50a585193cdf9b26c9bac812", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 1220978, + "transactionHash": "0x4dfaa2d633474f4bef22eb5e0c689186e0c27b6b50a585193cdf9b26c9bac812", + "address": "0x4650e4737C366aE86354F8A3E3CFD23F41E90F77", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000021a49524e319c0b28daa1d79d50b6d7a346490b2" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x8d578aacf97d29f095f7841bbb284ba45206097bcf01994f9a918beece6553ca" + } + ], + "blockNumber": 1220978, + "cumulativeGasUsed": "1444327", + "status": 1, + "byzantium": true + }, + "args": [ + 24 + ], + "numDeployments": 1, + "solcInputHash": "72a14774796fae5d4ac4d3b6f26df06c", + "metadata": "{\"compiler\":{\"version\":\"0.8.13+commit.abaa5c0e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"merkleTreeHeight\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getHeight\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumLeaves\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRootValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"elements\",\"type\":\"uint256[]\"}],\"name\":\"updateRecordsMerkleTree\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Create a records Merkle tree of the given height.\",\"params\":{\"merkleTreeHeight\":\"The height\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateRecordsMerkleTree(uint256[])\":{\"details\":\"Update the state of the record merkle tree by inserting new elements.\",\"params\":{\"elements\":\"The list of elements to be appended to the current merkle tree described by the frontier.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getHeight()\":{\"notice\":\"Returns the height of the Merkle tree.\"},\"getNumLeaves()\":{\"notice\":\"Returns the number of leaves of the Merkle tree.\"},\"getRootValue()\":{\"notice\":\"Returns the root value of the Merkle tree.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/RecordsMerkleTree.sol\":\"RecordsMerkleTree\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _setOwner(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _setOwner(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _setOwner(newOwner);\\n }\\n\\n function _setOwner(address newOwner) private {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x90565a39ae45c80f0468dc96c7b20d0afc3055f344c8203a0c9258239f350b9f\",\"license\":\"MIT\"},\"contracts/RecordsMerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./libraries/RescueLib.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract RecordsMerkleTree is Ownable {\\n enum Position {\\n LEFT,\\n MIDDLE,\\n RIGHT\\n }\\n\\n // Representation of a (tree) node\\n // A node contains a value and pointers (which are index in an array of other nodes).\\n // By convention a node that has no (left,middle,right) children will point to index 0.\\n struct Node {\\n uint256 val;\\n uint64 left; // Pointer (index) to the left child\\n uint64 middle; // Pointer (index) to the middle child\\n uint64 right; // Pointer (index) to the right child\\n }\\n\\n uint256 internal _rootValue;\\n uint64 internal _numLeaves;\\n uint8 internal _merkleTreeHeight;\\n\\n mapping(uint256 => uint256) internal _flattenedFrontier;\\n\\n /// @dev Create a records Merkle tree of the given height.\\n /// @param merkleTreeHeight The height\\n constructor(uint8 merkleTreeHeight) {\\n _rootValue = 0;\\n _numLeaves = 0;\\n _merkleTreeHeight = merkleTreeHeight;\\n }\\n\\n /// @dev Is the given node a terminal node?\\n /// @param node A node\\n /// @return _ True if the node is terminal, false otherwise.\\n function _isTerminal(Node memory node) private pure returns (bool) {\\n return (node.left == 0) && (node.middle == 0) && (node.right == 0);\\n }\\n\\n /// @dev Is the given node null?\\n /// @param node A node\\n /// @return _ True if the node is NULL, false otherwise\\n function _isNull(Node memory node) private pure returns (bool) {\\n return (node.val == 0 && _isTerminal(node));\\n }\\n\\n /// @dev Create a new \\\"hole node\\\" at the given position in the\\n /// tree. A cursor position can be obtained from an extant node or\\n /// from a function that returns a position such as _buildTreeFromFrontier.\\n /// @param cursor The index of the node in the array of nodes\\n /// @param posSibling The position of the sibling i.e. (LEFT, MIDDLE or RIGHT)\\n /// @return _ The new created node\\n function _createHoleNode(uint64 cursor, Position posSibling)\\n private\\n pure\\n returns (Node memory)\\n {\\n // Copy pasting these values to save gas\\n // indexHoleNode = cursor - 3;\\n // indexFirstSibling = cursor - 2;\\n // indexSecondSibling = cursor - 1;\\n\\n if (posSibling == Position.LEFT) {\\n return Node(0, cursor - 3, cursor - 2, cursor - 1);\\n } else if (posSibling == Position.MIDDLE) {\\n return Node(0, cursor - 2, cursor - 3, cursor - 1);\\n } else if (posSibling == Position.RIGHT) {\\n return Node(0, cursor - 2, cursor - 1, cursor - 3);\\n } else {\\n revert(\\\"unreachable\\\");\\n }\\n }\\n\\n /// @dev Create a Merkle tree from the given frontier.\\n /// @param nodes The list of nodes to be filled or updated\\n /// @return A cursor to the root node of the create tree\\n function _buildTreeFromFrontier(Node[] memory nodes) internal view returns (uint64) {\\n // Tree is empty\\n if (_numLeaves == 0) {\\n nodes[0] = Node(0, 0, 0, 0); // Empty node\\n nodes[1] = Node(0, 0, 0, 0); // Root node\\n return 1;\\n }\\n\\n // Tree is not empty\\n\\n // Set the first node to the NULL node\\n nodes[0] = Node(0, 0, 0, 0);\\n\\n // Insert the leaf\\n nodes[1] = Node(_flattenedFrontier[0], 0, 0, 0);\\n\\n // Insert the siblings\\n nodes[2] = Node(_flattenedFrontier[1], 0, 0, 0);\\n nodes[3] = Node(_flattenedFrontier[2], 0, 0, 0);\\n\\n // Compute the position of each node\\n uint64 absolutePosition = _numLeaves - 1;\\n uint8 localPosition = uint8(absolutePosition % 3);\\n\\n // We process the nodes of the Merkle path\\n uint64 cursor = 4;\\n uint64 cursorFrontier = 3;\\n\\n // Build the tree expect the root node\\n while (cursor < 3 * _merkleTreeHeight + 1) {\\n nodes[cursor] = _createHoleNode(cursor, Position(localPosition));\\n\\n // Create the siblings of the \\\"hole node\\\". These siblings have no children\\n nodes[cursor + 1] = Node(_flattenedFrontier[cursorFrontier], 0, 0, 0);\\n nodes[cursor + 2] = Node(_flattenedFrontier[cursorFrontier + 1], 0, 0, 0);\\n\\n // Move forward\\n absolutePosition /= 3;\\n localPosition = uint8(absolutePosition % 3);\\n\\n cursor += 3;\\n cursorFrontier += 2;\\n }\\n\\n // Add the root node\\n nodes[cursor] = _createHoleNode(cursor, Position(localPosition));\\n return cursor;\\n }\\n\\n /// @dev Compute the index of the next node when going down in the tree.\\n /// @param nodes The list of nodes of the tree\\n /// @param nodeIndex The index of the starting node\\n /// @param pos The position for going down, i.e. LEFT, MIDDLE or RIGHT.\\n /// @return The index of the next node\\n function _nextNodeIndex(\\n Node[] memory nodes,\\n uint64 nodeIndex,\\n Position pos\\n ) private pure returns (uint64) {\\n if (pos == Position.LEFT) {\\n return nodes[nodeIndex].left;\\n } else if (pos == Position.MIDDLE) {\\n return nodes[nodeIndex].middle;\\n } else if (pos == Position.RIGHT) {\\n return nodes[nodeIndex].right;\\n } else {\\n revert(\\\"unreachable\\\");\\n }\\n }\\n\\n /// @dev Update the child of a node based on the position (which child to select) and an index to the new child.\\n /// @param node node for which we want to update the child\\n /// @param newChildIndex index of the new child\\n /// @param pos position of the child node relative to the node (i.e. LEFT, MIDDLE or RIGHT)\\n function _updateChildNode(\\n Node memory node,\\n uint64 newChildIndex,\\n Position pos\\n ) private pure {\\n // Update the node\\n if (pos == Position.LEFT) {\\n node.left = newChildIndex;\\n } else if (pos == Position.MIDDLE) {\\n node.middle = newChildIndex;\\n } else if (pos == Position.RIGHT) {\\n node.right = newChildIndex;\\n }\\n }\\n\\n function _computeNodePos(uint64 absolutePos, uint64 branchIndex)\\n private\\n view\\n returns (uint64, uint64)\\n {\\n uint64 localPos;\\n uint64 divisor = uint64(3**(_merkleTreeHeight - branchIndex - 1));\\n\\n localPos = absolutePos / divisor;\\n absolutePos = absolutePos % divisor;\\n\\n return (absolutePos, localPos);\\n }\\n\\n /// @notice Insert an element into the tree in the position num_leaves.\\n /// @param nodes The array of nodes\\n /// @param rootIndex The index of the root node\\n /// @param maxIndex The index of the latest element inserted in the nodes array\\n /// @param element The value of the element to insert into the tree\\n /// @return updated the value of maxIndex\\n function _pushElement(\\n Node[] memory nodes,\\n uint64 rootIndex,\\n uint64 maxIndex,\\n uint256 element\\n ) private returns (uint64) {\\n require(_numLeaves < 3**_merkleTreeHeight, \\\"The tree is full.\\\");\\n\\n // Get the position of the leaf from the smart contract state\\n uint64 leafPos = _numLeaves;\\n uint64 branchIndex = 0;\\n uint64 currentNodeIndex = rootIndex;\\n uint64 previousNodeIndex = rootIndex;\\n\\n // Go down inside the tree until finding the first terminal node.\\n uint64 absolutePos = leafPos;\\n uint64 localPos = 0;\\n while (!_isNull(nodes[currentNodeIndex])) {\\n (absolutePos, localPos) = _computeNodePos(absolutePos, branchIndex);\\n\\n previousNodeIndex = currentNodeIndex;\\n currentNodeIndex = _nextNodeIndex(nodes, currentNodeIndex, Position(localPos));\\n\\n branchIndex += 1;\\n }\\n\\n // maxIndex tracks the index of the last element inserted in the tree\\n uint64 newNodeIndex = maxIndex + 1;\\n\\n // Create new nodes until completing the path one level above the leaf level\\n // Always inserting to the left\\n\\n // To compensate the extra increment at the end of the previous loop ,\\n // except if the tree is reduced to a single root node.\\n if (branchIndex > 0) {\\n branchIndex -= 1;\\n }\\n\\n while (branchIndex < _merkleTreeHeight - 1) {\\n nodes[newNodeIndex] = Node(0, 0, 0, 0);\\n _updateChildNode(nodes[previousNodeIndex], newNodeIndex, Position(localPos));\\n\\n // Prepare the next iteration of the loop\\n previousNodeIndex = newNodeIndex;\\n newNodeIndex += 1;\\n branchIndex += 1;\\n (absolutePos, localPos) = _computeNodePos(absolutePos, branchIndex);\\n }\\n\\n // The last node contains the leaf value (compute the hash)\\n // Remember position is computed with the remainder\\n\\n // Leaf node where the value is hash(0,_numLeaves,element)\\n uint256 val = RescueLib.hash(0, _numLeaves, element);\\n nodes[newNodeIndex] = Node(val, 0, 0, 0);\\n _updateChildNode(nodes[previousNodeIndex], newNodeIndex, Position(localPos));\\n\\n // Increment the number of leaves\\n //\\n // This operation is costly and happens in a loop. However, for now the\\n // merkle tree is usually updated with a single new element. In this\\n // case we would not save gas by moving the update of _numLeaves. The\\n // gas cost is also likely negligible compared to the whole operation of\\n // inserting an element.\\n //\\n // slither-disable-next-line costly-loop\\n _numLeaves += 1;\\n\\n // Return the new value of maxIndex\\n return newNodeIndex;\\n }\\n\\n /// @dev Store the frontier.\\n /// @param nodes The list of node of the tree\\n /// @param rootIndex The index of the root node\\n function _storeFrontier(Node[] memory nodes, uint64 rootIndex) private {\\n uint64 frontierSize = 2 * _merkleTreeHeight + 1;\\n\\n /// Collect the values from the root to the leaf but in reverse order\\n uint64 currentNodeIndex = rootIndex;\\n uint64 firstSiblingIndex = 0;\\n uint64 secondSiblingIndex = 0;\\n // Go down until the leaf\\n for (uint256 i = 0; i < _merkleTreeHeight; i++) {\\n // Pick the non-empty node that is most right\\n Node memory currentNode = nodes[currentNodeIndex];\\n if (!_isNull(nodes[currentNode.right])) {\\n // Keep to the right\\n currentNodeIndex = currentNode.right;\\n firstSiblingIndex = currentNode.left;\\n secondSiblingIndex = currentNode.middle;\\n } else if (!_isNull(nodes[currentNode.middle])) {\\n // Keep to the middle\\n currentNodeIndex = currentNode.middle;\\n firstSiblingIndex = currentNode.left;\\n secondSiblingIndex = currentNode.right;\\n } else {\\n // Keep to the left\\n currentNodeIndex = currentNode.left;\\n firstSiblingIndex = currentNode.middle;\\n secondSiblingIndex = currentNode.right;\\n }\\n uint256 secondSiblingPos = frontierSize - 1 - (2 * i);\\n uint256 firstSiblingPos = secondSiblingPos - 1;\\n _flattenedFrontier[secondSiblingPos] = nodes[secondSiblingIndex].val;\\n _flattenedFrontier[firstSiblingPos] = nodes[firstSiblingIndex].val;\\n }\\n // currentNodeIndex points to the leaf\\n _flattenedFrontier[0] = nodes[currentNodeIndex].val;\\n }\\n\\n /// @dev Update the state of the record merkle tree by inserting new elements.\\n /// @param elements The list of elements to be appended to the current merkle tree described by the frontier.\\n function updateRecordsMerkleTree(uint256[] memory elements) external onlyOwner {\\n // The total number of nodes is bounded by 3*height+1 + 3*N*height = 3*(N+1)*height + 1\\n // where N is the number of new records\\n uint256 numElements = elements.length;\\n Node[] memory nodes = new Node[](3 * (numElements + 1) * _merkleTreeHeight + 2);\\n\\n /// Insert the new elements ///\\n\\n // maxIndex tracks the index of the last element inserted in the tree\\n uint64 rootIndex = _buildTreeFromFrontier(nodes);\\n uint64 maxIndex = rootIndex;\\n for (uint32 i = 0; i < elements.length; i++) {\\n maxIndex = _pushElement(nodes, rootIndex, maxIndex, elements[i]);\\n }\\n //// Compute the root hash value ////\\n _rootValue = _computeRootValueAndUpdateTree(nodes, rootIndex);\\n\\n //// Store the frontier\\n _storeFrontier(nodes, rootIndex);\\n }\\n\\n /// @notice Returns the root value of the Merkle tree.\\n function getRootValue() external view returns (uint256) {\\n return _rootValue;\\n }\\n\\n /// @notice Returns the height of the Merkle tree.\\n function getHeight() external view returns (uint8) {\\n return _merkleTreeHeight;\\n }\\n\\n /// @notice Returns the number of leaves of the Merkle tree.\\n function getNumLeaves() external view returns (uint64) {\\n return _numLeaves;\\n }\\n\\n /// @dev Update the tree by hashing the children of each node.\\n /// @param nodes The tree. Note that the nodes are updated by this function.\\n /// @param rootNodePos The index of the root node in the list of nodes.\\n /// @return The value obtained at the root.\\n function _computeRootValueAndUpdateTree(Node[] memory nodes, uint256 rootNodePos)\\n private\\n returns (uint256)\\n {\\n // If the root node has no children return its value\\n Node memory rootNode = nodes[rootNodePos];\\n if (_isTerminal(rootNode)) {\\n return rootNode.val;\\n } else {\\n uint256 valLeft = _computeRootValueAndUpdateTree(nodes, rootNode.left);\\n uint256 valMiddle = _computeRootValueAndUpdateTree(nodes, rootNode.middle);\\n uint256 valRight = _computeRootValueAndUpdateTree(nodes, rootNode.right);\\n\\n nodes[rootNode.left].val = valLeft;\\n nodes[rootNode.middle].val = valMiddle;\\n nodes[rootNode.right].val = valRight;\\n\\n return RescueLib.hash(valLeft, valMiddle, valRight);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xdf07a42805dc343f2a6552c8c531ef697244e648beb1fa6b33324421a168e268\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/RescueLib.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nlibrary RescueLib {\\n /// The constants are obtained from the Sage script\\n /// https://github.com/EspressoSystems/Marvellous/blob/fcd4c41672f485ac2f62526bc87a16789d4d0459/rescue254.sage\\n\\n // These constants are no longer used, left here for readability.\\n // uint256 private constant _N_ROUNDS = 12;\\n // uint256 private constant _STATE_SIZE = 4;\\n // uint256 private constant _SCHEDULED_KEY_SIZE = (2 * _N_ROUNDS + 1) * _STATE_SIZE;\\n // uint256 private constant _ALPHA = 5;\\n\\n // Obtained by running KeyScheduling([0,0,0,0]). See Algorithm 2 of AT specification document.\\n\\n uint256 private constant _PRIME =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n uint256 private constant _ALPHA_INV =\\n 17510594297471420177797124596205820070838691520332827474958563349260646796493;\\n\\n // MDS is hardcoded\\n function _linearOp(\\n uint256 s0,\\n uint256 s1,\\n uint256 s2,\\n uint256 s3\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n uint256,\\n uint256\\n )\\n {\\n // Matrix multiplication\\n unchecked {\\n return (\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575808479992,\\n s0,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575806058117,\\n s1,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575491214367,\\n s2,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186535831058117,\\n s3,\\n _PRIME\\n ),\\n mulmod(19500, s0, _PRIME) +\\n mulmod(3026375, s1, _PRIME) +\\n mulmod(393529500, s2, _PRIME) +\\n mulmod(49574560750, s3, _PRIME),\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575808491587,\\n s0,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575807886437,\\n s1,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575729688812,\\n s2,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186565891044437,\\n s3,\\n _PRIME\\n ),\\n mulmod(156, s0, _PRIME) +\\n mulmod(20306, s1, _PRIME) +\\n mulmod(2558556, s2, _PRIME) +\\n mulmod(320327931, s3, _PRIME)\\n );\\n }\\n }\\n\\n function _expAlphaInv4Setup(uint256[6] memory scratch) private pure {\\n assembly {\\n let p := scratch\\n mstore(p, 0x20) // Length of Base\\n mstore(add(p, 0x20), 0x20) // Length of Exponent\\n mstore(add(p, 0x40), 0x20) // Length of Modulus\\n mstore(add(p, 0x80), _ALPHA_INV) // Exponent\\n mstore(add(p, 0xa0), _PRIME) // Modulus\\n }\\n }\\n\\n function _expAlphaInv4(\\n uint256[6] memory scratch,\\n uint256 s0,\\n uint256 s1,\\n uint256 s2,\\n uint256 s3\\n )\\n private\\n view\\n returns (\\n uint256 o0,\\n uint256 o1,\\n uint256 o2,\\n uint256 o3\\n )\\n {\\n assembly {\\n // define pointer\\n let p := scratch\\n let basep := add(p, 0x60)\\n mstore(basep, s0) // Base\\n // store data assembly-favouring ways\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o0 := mload(basep)\\n mstore(basep, s1) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o1 := mload(basep)\\n mstore(basep, s2) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o2 := mload(basep)\\n mstore(basep, s3) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o3 := mload(basep)\\n }\\n }\\n\\n // Computes the Rescue permutation on some input\\n // Recall that the scheduled key is precomputed in our case\\n // @param input input for the permutation\\n // @return permutation output\\n function perm(\\n // slither-disable-next-line write-after-write\\n uint256 s0,\\n // slither-disable-next-line write-after-write\\n uint256 s1,\\n // slither-disable-next-line write-after-write\\n uint256 s2,\\n // slither-disable-next-line write-after-write\\n uint256 s3\\n )\\n internal\\n view\\n returns (\\n uint256,\\n uint256,\\n uint256,\\n uint256\\n )\\n {\\n // slither-disable-next-line uninitialized-local\\n uint256[6] memory alphaInvScratch;\\n\\n _expAlphaInv4Setup(alphaInvScratch);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 14613516837064033601098425266946467918409544647446217386229959902054563533267,\\n s1 + 376600575581954944138907282479272751264978206975465380433764825531344567663,\\n s2 + 7549886658634274343394883631367643327196152481472281919735617268044202589860,\\n s3 + 3682071510138521345600424597536598375718773365536872232193107639375194756918\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 18657517374128716281071590782771170166993445602755371021955596036781411817786;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 7833794394096838639430144230563403530989402760602204539559270044687522640191;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 21303828694647266539931030987057572024333442749881970102454081226349775826204;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 10601447988834057856019990466870413629636256450824419416829818546423193802418;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 3394657260998945409283098835682964352503279447198495330506177586645995289229,\\n s1 + 18437084083724939316390841967750487133622937044030373241106776324730657101302,\\n s2 + 9281739916935170266925270432337475828741505406943764438550188362765269530037,\\n s3 + 7363758719535652813463843693256839865026387361836644774317493432208443086206\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 307094088106440279963968943984309088038734274328527845883669678290790702381;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 20802277384865839022876847241719852837518994021170013346790603773477912819001;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 19754579269464973651593381036132218829220609572271224048608091445854164824042;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 3618840933841571232310395486452077846249117988789467996234635426899783130819;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 2604166168648013711791424714498680546427073388134923208733633668316805639713,\\n s1 + 21355705619901626246699129842094174300693414345856149669339147704587730744579,\\n s2 + 492957643799044929042114590851019953669919577182050726596188173945730031352,\\n s3 + 8495959434717951575638107349559891417392372124707619959558593515759091841138\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 15608173629791582453867933160400609222904457931922627396107815347244961625587;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 16346164988481725869223011419855264063160651334419415042919928342589111681923;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 21085652277104054699752179865196164165969290053517659864117475352262716334100;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 20640310021063232205677193759981403045043444605175178332133134865746039279935;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 6015589261538006311719125697023069952804098656652050863009463360598997670240,\\n s1 + 12498423882721726012743791752811798719201859023192663855805526312393108407357,\\n s2 + 10785527781711732350693172404486938622378708235957779975342240483505724965040,\\n s3 + 5563181134859229953817163002660048854420912281911747312557025480927280392569\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 4585980485870975597083581718044393941512074846925247225127276913719050121968;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 8135760428078872176830812746579993820254685977237403304445687861806698035222;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 4525715538433244696411192727226186804883202134636681498489663161593606654720;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 2537497100749435007113677475828631400227339157221711397900070636998427379023;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 6957758175844522415482704083077249782181516476067074624906502033584870962925,\\n s1 + 17134288156316028142861248367413235848595762718317063354217292516610545487813,\\n s2 + 20912428573104312239411321877435657586184425249645076131891636094671938892815,\\n s3 + 16000236205755938926858829908701623009580043315308207671921283074116709575629\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 10226182617544046880850643054874064693998595520540061157646952229134207239372;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 18584346134948015676264599354709457865255277240606855245909703396343731224626;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 9263628039314899758000383385773954136696958567872461042004915206775147151562;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 21095966719856094705113273596585696209808876361583941931684481364905087347856;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 2671157351815122058649197205531097090514563992249109660044882868649840700911,\\n s1 + 19371695134219415702961622134896564229962454573253508904477489696588594622079,\\n s2 + 5458968308231210904289987830881528056037123818964633914555287871152343390175,\\n s3 + 7336332584551233792026746889434554547883125466404119632794862500961953384162\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 10351436748086126474964482623536554036637945319698748519226181145454116702488;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 10588209357420186457766745724579739104572139534486480334142455690083813419064;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 14330277147584936710957102218096795520430543834717433464500965846826655802131;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 20752197679372238381408962682213349118865256502118746003818603260257076802028;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 19390446529582160674621825412345750405397926216690583196542690617266028463414,\\n s1 + 4169994013656329171830126793466321040216273832271989491631696813297571003664,\\n s2 + 3014817248268674641565961681956715664833306954478820029563459099892548946802,\\n s3 + 14285412497877984113655094566695921704826935980354186365694472961163628072901\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 16224484149774307577146165975762490690838415946665379067259822320752729067513;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 5404416528124718330316441408560295270695591369912905197499507811036327404407;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 20127204244332635127213425090893250761286848618448128307344971109698523903374;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 14939477686176063572999014162186372798386193194442661892600584389296609365740;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 183740587182448242823071506013879595265109215202349952517434740768878294134,\\n s1 + 15366166801397358994305040367078329374182896694582870542425225835844885654667,\\n s2 + 10066796014802701613007252979619633540090232697942390802486559078446300507813,\\n s3 + 4824035239925904398047276123907644574421550988870123756876333092498925242854\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 5526416022516734657935645023952329824887761902324086126076396040056459740202;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 18157816292703983306114736850721419851645159304249709756659476015594698876611;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 767446206481623130855439732549764381286210118638028499466788453347759203223;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 16303412231051555792435190427637047658258796056382698277687500021321460387129;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 15475465085113677237835653765189267963435264152924949727326000496982746660612,\\n s1 + 14574823710073720047190393602502575509282844662732045439760066078137662816054,\\n s2 + 13746490178929963947720756220409862158443939172096620003896874772477437733602,\\n s3 + 13804898145881881347835367366352189037341704254740510664318597456840481739975\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 3523599105403569319090449327691358425990456728660349400211678603795116364226;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 8632053982708637954870974502506145434219829622278773822242070316888003350278;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 20293222318844554840191640739970825558851264905959070636369796127300969629060;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 7583204376683983181255811699503668584283525661852773339144064901897953897564;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 7562572155566079175343789986900217168516831778275127159068657756836798778249,\\n s1 + 12689811910161401007144285031988539999455902164332232460061366402869461973371,\\n s2 + 21878400680687418538050108788381481970431106443696421074205107984690362920637,\\n s3 + 3428721187625124675258692786364137915132424621324969246210899039774126165479\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 2552744099402346352193097862110515290335034445517764751557635302899937367219;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 13706727374402840004346872704605212996406886221231239230397976011930486183550;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 19786308443934570499119114884492461847023732197118902978413499381102456961966;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 11767081169862697956461405434786280425108140215784390008330611807075539962898;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 1273319740931699377003430019539548781935202579355152343831464213279794249000,\\n s1 + 20225620070386241931202098463018472034137960205721651875253423327929063224115,\\n s2 + 13107884970924459680133954992354588464904218518440707039430314610799573960437,\\n s3 + 10574066469653966216567896842413898230152427846140046825523989742590727910280\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 21386271527766270535632132320974945129946865648321206442664310421414128279311;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 15743262855527118149527268525857865250723531109306484598629175225221686341453;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 16251140915157602891864152518526119259367827194524273940185283798897653655734;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 5420158299017134702074915284768041702367316125403978919545323705661634647751;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 14555572526833606349832007897859411042036463045080050783981107823326880950231,\\n s1 + 15234942318869557310939446038663331226792664588406507247341043508129993934298,\\n s2 + 19560004467494472556570844694553210033340577742756929194362924850760034377042,\\n s3 + 21851693551359717578445799046408060941161959589978077352548456186528047792150\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 19076469206110044175016166349949136119962165667268661130584159239385341119621;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 19132104531774396501521959463346904008488403861940301898725725957519076019017;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 6606159937109409334959297158878571243749055026127553188405933692223704734040;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 13442678592538344046772867528443594004918096722084104155946229264098946917042;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n return (\\n s0 + 11975757366382164299373991853632416786161357061467425182041988114491638264212,\\n s1 + 10571372363668414752587603575617060708758897046929321941050113299303675014148,\\n s2 + 5405426474713644587066466463343175633538103521677501186003868914920014287031,\\n s3 + 18665277628144856329335676361545218245401014824195451740181902217370165017984\\n );\\n }\\n }\\n\\n // Computes the hash of three field elements and returns a single element\\n // In our case the rate is 3 and the capacity is 1\\n // This hash function the one used in the Records Merkle tree.\\n // @param a first element\\n // @param b second element\\n // @param c third element\\n // @return the first element of the Rescue state\\n function hash(\\n uint256 a,\\n uint256 b,\\n uint256 c\\n ) public view returns (uint256 o) {\\n (o, a, b, c) = perm(a % _PRIME, b % _PRIME, c % _PRIME, 0);\\n o %= _PRIME;\\n }\\n\\n function checkBounded(uint256[15] memory inputs) internal pure {\\n for (uint256 i = 0; i < inputs.length; ++i) {\\n require(inputs[i] < _PRIME, \\\"inputs must be below _PRIME\\\");\\n }\\n }\\n\\n // This function is external to ensure that the solidity compiler generates\\n // a separate library contract. This is required to reduce the size of the\\n // CAPE contract.\\n function commit(uint256[15] memory inputs) external view returns (uint256) {\\n checkBounded(inputs);\\n\\n uint256 a;\\n uint256 b;\\n uint256 c;\\n uint256 d;\\n\\n for (uint256 i = 0; i < 5; i++) {\\n unchecked {\\n (a, b, c, d) = perm(\\n (a + inputs[3 * i + 0]) % _PRIME,\\n (b + inputs[3 * i + 1]) % _PRIME,\\n (c + inputs[3 * i + 2]) % _PRIME,\\n d\\n );\\n\\n (a, b, c, d) = (a % _PRIME, b % _PRIME, c % _PRIME, d % _PRIME);\\n }\\n }\\n\\n return a;\\n }\\n}\\n\",\"keccak256\":\"0x5d852913c47167b7e785dadec2913f3a468e3279af846ef0d52de3ce106dd274\",\"license\":\"GPL-3.0-or-later\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161193038038061193083398101604081905261002f916100b8565b61003833610068565b60006001556002805460ff90921668010000000000000000026001600160481b03199092169190911790556100e2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100ca57600080fd5b815160ff811681146100db57600080fd5b9392505050565b61183f806100f16000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063715018a61161005b578063715018a6146100cc5780638da5cb5b146100d4578063927d52ab146100ef578063f2fde38b1461010a57600080fd5b806319efb11d14610082578063330ee6a7146100a65780636444c8d1146100bb575b600080fd5b600254600160401b900460ff1660405160ff90911681526020015b60405180910390f35b6100b96100b4366004611418565b61011d565b005b60015460405190815260200161009d565b6100b96102ac565b6000546040516001600160a01b03909116815260200161009d565b6002546040516001600160401b03909116815260200161009d565b6100b96101183660046114d5565b610312565b6000546001600160a01b0316331461017c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8051600254600090600160401b900460ff16610199836001611514565b6101a490600361152c565b6101ae919061152c565b6101b9906002611514565b6001600160401b038111156101d0576101d0611402565b60405190808252806020026020018201604052801561022257816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816101ee5790505b5090506000610230826103f4565b90508060005b85518163ffffffff16101561028457610270848484898563ffffffff16815181106102635761026361154b565b6020026020010151610856565b91508061027c81611561565b915050610236565b5061029883836001600160401b0316610c1c565b6001556102a58383610dbd565b5050505050565b6000546001600160a01b031633146103065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610173565b6103106000610fe2565b565b6000546001600160a01b0316331461036c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610173565b6001600160a01b0381166103e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610173565b6103f181610fe2565b50565b6002546000906001600160401b031681036104b057604080516080810182526000808252602082018190529181018290526060810182905283519091849161043e5761043e61154b565b602002602001018190525060405180608001604052806000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b03168152508260018151811061049c5761049c61154b565b602002602001018190525060019050919050565b60408051608081018252600080825260208201819052918101829052606081018290528351909184916104e5576104e561154b565b602090810291909101810191909152604080516080810182526000808052600384527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff54825292810183905290810182905260608101919091528251839060019081106105545761055461154b565b6020908102919091018101919091526040805160808101825260016000908152600384527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c54825292810183905290810182905260608101919091528251839060029081106105c5576105c561154b565b60200260200101819052506040518060800160405280600360006002815260200190815260200160002054815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815250826003815181106106365761063661154b565b602090810291909101015260025460009061065c906001906001600160401b0316611584565b9050600061066b6003836115c2565b9050600460035b60025461068a90600160401b900460ff1660036115e8565b610695906001611611565b60ff16826001600160401b0316101561080e576106c6828460ff1660028111156106c1576106c1611636565b61104a565b86836001600160401b0316815181106106e1576106e161154b565b602090810291909101810191909152604080516080810182526001600160401b03841660009081526003845282812054825292810183905290810182905260608101919091528661073384600161164c565b6001600160401b03168151811061074c5761074c61154b565b6020026020010181905250604051806080016040528060036000846001610773919061164c565b6001600160401b03168152602080820192909252604090810160009081205484529183018290528201819052606090910152866107b184600261164c565b6001600160401b0316815181106107ca576107ca61154b565b60209081029190910101526107e0600385611677565b93506107ed6003856115c2565b92506107fa60038361164c565b915061080760028261164c565b9050610672565b610827828460ff1660028111156106c1576106c1611636565b86836001600160401b0316815181106108425761084261154b565b602090810291909101015250949350505050565b60025460009061087190600160401b900460ff166003611779565b6002546001600160401b0316106108ca5760405162461bcd60e51b815260206004820152601160248201527f54686520747265652069732066756c6c2e0000000000000000000000000000006044820152606401610173565b6002546001600160401b03166000858083835b6109088b856001600160401b0316815181106108fb576108fb61154b565b60200260200101516111eb565b610957576109168286611201565b85945090925090506109438b846001600160401b038416600281111561093e5761093e611636565b611260565b935061095060018661164c565b94506108dd565b60006109648a600161164c565b90506001600160401b0386161561098357610980600187611584565b95505b60025461099c90600190600160401b900460ff16611788565b60ff16866001600160401b03161015610a8d5760405180608001604052806000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b03168152508c826001600160401b031681518110610a0a57610a0a61154b565b6020026020010181905250610a5c8c856001600160401b031681518110610a3357610a3361154b565b602002602001015182846001600160401b03166002811115610a5757610a57611636565b611339565b925082610a6a60018261164c565b9050610a7760018761164c565b9550610a838387611201565b9093509150610983565b600254604051631c0b758d60e31b81526000600482018190526001600160401b039092166024820152604481018b905273646396e3fdB1Fbf73eE7F7381D6a25A6f7B919B89063e05bac6890606401602060405180830381865af4158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d91906117ab565b9050604051806080016040528082815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b03168152508d836001600160401b031681518110610b7957610b7961154b565b6020026020010181905250610bc68d866001600160401b031681518110610ba257610ba261154b565b602002602001015183856001600160401b03166002811115610a5757610a57611636565b6002805460019190600090610be59084906001600160401b031661164c565b92506101000a8154816001600160401b0302191690836001600160401b031602179055508198505050505050505050949350505050565b600080838381518110610c3157610c3161154b565b60200260200101519050610c44816113bf565b15610c5157519050610db7565b6000610c6a8583602001516001600160401b0316610c1c565b90506000610c858684604001516001600160401b0316610c1c565b90506000610ca08785606001516001600160401b0316610c1c565b9050828785602001516001600160401b031681518110610cc257610cc261154b565b60200260200101516000018181525050818785604001516001600160401b031681518110610cf257610cf261154b565b60200260200101516000018181525050808785606001516001600160401b031681518110610d2257610d2261154b565b602090810291909101015152604051631c0b758d60e31b815260048101849052602481018390526044810182905273646396e3fdB1Fbf73eE7F7381D6a25A6f7B919B89063e05bac6890606401602060405180830381865af4158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db091906117ab565b9450505050505b92915050565b60028054600091610dd891600160401b900460ff16906115e8565b610de3906001611611565b60ff16905081600080805b600254600160401b900460ff16811015610f8657600087856001600160401b031681518110610e1f57610e1f61154b565b60200260200101519050610e4b8882606001516001600160401b0316815181106108fb576108fb61154b565b610e6957806060015194508060200151935080604001519250610ebf565b610e8b8882604001516001600160401b0316815181106108fb576108fb61154b565b610ea957806040015194508060200151935080606001519250610ebf565b8060200151945080604001519350806060015192505b6000610ecc83600261152c565b610ed7600189611584565b6001600160401b0316610eea91906117c4565b90506000610ef96001836117c4565b905089856001600160401b031681518110610f1657610f1661154b565b602002602001015160000151600360008481526020019081526020016000208190555089866001600160401b031681518110610f5457610f5461154b565b602090810291909101810151516000928352600390915260409091205550819050610f7e816117db565b915050610dee565b5085836001600160401b031681518110610fa257610fa261154b565b602090810291909101810151516000805260039091527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff55505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051608081018252600080825260208201819052918101829052606081018290529082600281111561108057611080611636565b036110e8576040518060800160405280600081526020016003856110a49190611584565b6001600160401b031681526020016110bd600286611584565b6001600160401b031681526020016110d6600186611584565b6001600160401b031690529050610db7565b60018260028111156110fc576110fc611636565b03611139576040518060800160405280600081526020016002856111209190611584565b6001600160401b031681526020016110bd600386611584565b600282600281111561114d5761114d611636565b036111a3576040518060800160405280600081526020016002856111719190611584565b6001600160401b0316815260200161118a600186611584565b6001600160401b031681526020016110d6600386611584565b60405162461bcd60e51b815260206004820152600b60248201527f756e726561636861626c650000000000000000000000000000000000000000006044820152606401610173565b8051600090158015610db75750610db7826113bf565b600080600080600185600260089054906101000a900460ff1660ff166112279190611584565b6112319190611584565b61123c9060036117f4565b90506112488187611677565b915061125481876115c2565b96919550909350505050565b60008082600281111561127557611275611636565b036112a85783836001600160401b0316815181106112955761129561154b565b6020026020010151602001519050611332565b60018260028111156112bc576112bc611636565b036112ef5783836001600160401b0316815181106112dc576112dc61154b565b6020026020010151604001519050611332565b600282600281111561130357611303611636565b036111a35783836001600160401b0316815181106113235761132361154b565b60200260200101516060015190505b9392505050565b600081600281111561134d5761134d611636565b0361136557506001600160401b031660209190910152565b600181600281111561137957611379611636565b0361139157506001600160401b031660409190910152565b60028160028111156113a5576113a5611636565b036113ba576001600160401b03821660608401525b505050565b600081602001516001600160401b031660001480156113e9575060408201516001600160401b0316155b8015610db7575050606001516001600160401b03161590565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561142b57600080fd5b82356001600160401b038082111561144257600080fd5b818501915085601f83011261145657600080fd5b81358181111561146857611468611402565b8060051b604051601f19603f8301168101818110858211171561148d5761148d611402565b6040529182528482019250838101850191888311156114ab57600080fd5b938501935b828510156114c9578435845293850193928501926114b0565b98975050505050505050565b6000602082840312156114e757600080fd5b81356001600160a01b038116811461133257600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115611527576115276114fe565b500190565b6000816000190483118215151615611546576115466114fe565b500290565b634e487b7160e01b600052603260045260246000fd5b600063ffffffff80831681810361157a5761157a6114fe565b6001019392505050565b60006001600160401b03838116908316818110156115a4576115a46114fe565b039392505050565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b03808416806115dc576115dc6115ac565b92169190910692915050565b600060ff821660ff84168160ff0481118215151615611609576116096114fe565b029392505050565b600060ff821660ff84168060ff0382111561162e5761162e6114fe565b019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001600160401b0380831681851680830382111561166e5761166e6114fe565b01949350505050565b60006001600160401b0380841680611691576116916115ac565b92169190910492915050565b600181815b808511156116d85781600019048211156116be576116be6114fe565b808516156116cb57918102915b93841c93908002906116a2565b509250929050565b6000826116ef57506001610db7565b816116fc57506000610db7565b8160018114611712576002811461171c57611738565b6001915050610db7565b60ff84111561172d5761172d6114fe565b50506001821b610db7565b5060208310610133831016604e8410600b841016171561175b575081810a610db7565b611765838361169d565b8060001904821115611609576116096114fe565b600061133260ff8416836116e0565b600060ff821660ff8416808210156117a2576117a26114fe565b90039392505050565b6000602082840312156117bd57600080fd5b5051919050565b6000828210156117d6576117d66114fe565b500390565b6000600182016117ed576117ed6114fe565b5060010190565b60006113326001600160401b038416836116e056fea2646970667358221220dadafd98d7aaeed8045089408beb8396497221d819acc51c010796abc5d5d35e64736f6c634300080d0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063715018a61161005b578063715018a6146100cc5780638da5cb5b146100d4578063927d52ab146100ef578063f2fde38b1461010a57600080fd5b806319efb11d14610082578063330ee6a7146100a65780636444c8d1146100bb575b600080fd5b600254600160401b900460ff1660405160ff90911681526020015b60405180910390f35b6100b96100b4366004611418565b61011d565b005b60015460405190815260200161009d565b6100b96102ac565b6000546040516001600160a01b03909116815260200161009d565b6002546040516001600160401b03909116815260200161009d565b6100b96101183660046114d5565b610312565b6000546001600160a01b0316331461017c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b8051600254600090600160401b900460ff16610199836001611514565b6101a490600361152c565b6101ae919061152c565b6101b9906002611514565b6001600160401b038111156101d0576101d0611402565b60405190808252806020026020018201604052801561022257816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816101ee5790505b5090506000610230826103f4565b90508060005b85518163ffffffff16101561028457610270848484898563ffffffff16815181106102635761026361154b565b6020026020010151610856565b91508061027c81611561565b915050610236565b5061029883836001600160401b0316610c1c565b6001556102a58383610dbd565b5050505050565b6000546001600160a01b031633146103065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610173565b6103106000610fe2565b565b6000546001600160a01b0316331461036c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610173565b6001600160a01b0381166103e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610173565b6103f181610fe2565b50565b6002546000906001600160401b031681036104b057604080516080810182526000808252602082018190529181018290526060810182905283519091849161043e5761043e61154b565b602002602001018190525060405180608001604052806000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b03168152508260018151811061049c5761049c61154b565b602002602001018190525060019050919050565b60408051608081018252600080825260208201819052918101829052606081018290528351909184916104e5576104e561154b565b602090810291909101810191909152604080516080810182526000808052600384527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff54825292810183905290810182905260608101919091528251839060019081106105545761055461154b565b6020908102919091018101919091526040805160808101825260016000908152600384527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c54825292810183905290810182905260608101919091528251839060029081106105c5576105c561154b565b60200260200101819052506040518060800160405280600360006002815260200190815260200160002054815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815250826003815181106106365761063661154b565b602090810291909101015260025460009061065c906001906001600160401b0316611584565b9050600061066b6003836115c2565b9050600460035b60025461068a90600160401b900460ff1660036115e8565b610695906001611611565b60ff16826001600160401b0316101561080e576106c6828460ff1660028111156106c1576106c1611636565b61104a565b86836001600160401b0316815181106106e1576106e161154b565b602090810291909101810191909152604080516080810182526001600160401b03841660009081526003845282812054825292810183905290810182905260608101919091528661073384600161164c565b6001600160401b03168151811061074c5761074c61154b565b6020026020010181905250604051806080016040528060036000846001610773919061164c565b6001600160401b03168152602080820192909252604090810160009081205484529183018290528201819052606090910152866107b184600261164c565b6001600160401b0316815181106107ca576107ca61154b565b60209081029190910101526107e0600385611677565b93506107ed6003856115c2565b92506107fa60038361164c565b915061080760028261164c565b9050610672565b610827828460ff1660028111156106c1576106c1611636565b86836001600160401b0316815181106108425761084261154b565b602090810291909101015250949350505050565b60025460009061087190600160401b900460ff166003611779565b6002546001600160401b0316106108ca5760405162461bcd60e51b815260206004820152601160248201527f54686520747265652069732066756c6c2e0000000000000000000000000000006044820152606401610173565b6002546001600160401b03166000858083835b6109088b856001600160401b0316815181106108fb576108fb61154b565b60200260200101516111eb565b610957576109168286611201565b85945090925090506109438b846001600160401b038416600281111561093e5761093e611636565b611260565b935061095060018661164c565b94506108dd565b60006109648a600161164c565b90506001600160401b0386161561098357610980600187611584565b95505b60025461099c90600190600160401b900460ff16611788565b60ff16866001600160401b03161015610a8d5760405180608001604052806000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b03168152508c826001600160401b031681518110610a0a57610a0a61154b565b6020026020010181905250610a5c8c856001600160401b031681518110610a3357610a3361154b565b602002602001015182846001600160401b03166002811115610a5757610a57611636565b611339565b925082610a6a60018261164c565b9050610a7760018761164c565b9550610a838387611201565b9093509150610983565b600254604051631c0b758d60e31b81526000600482018190526001600160401b039092166024820152604481018b905273__$2783a64b147d5f689049cabc192a316d9d$__9063e05bac6890606401602060405180830381865af4158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d91906117ab565b9050604051806080016040528082815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b03168152508d836001600160401b031681518110610b7957610b7961154b565b6020026020010181905250610bc68d866001600160401b031681518110610ba257610ba261154b565b602002602001015183856001600160401b03166002811115610a5757610a57611636565b6002805460019190600090610be59084906001600160401b031661164c565b92506101000a8154816001600160401b0302191690836001600160401b031602179055508198505050505050505050949350505050565b600080838381518110610c3157610c3161154b565b60200260200101519050610c44816113bf565b15610c5157519050610db7565b6000610c6a8583602001516001600160401b0316610c1c565b90506000610c858684604001516001600160401b0316610c1c565b90506000610ca08785606001516001600160401b0316610c1c565b9050828785602001516001600160401b031681518110610cc257610cc261154b565b60200260200101516000018181525050818785604001516001600160401b031681518110610cf257610cf261154b565b60200260200101516000018181525050808785606001516001600160401b031681518110610d2257610d2261154b565b602090810291909101015152604051631c0b758d60e31b815260048101849052602481018390526044810182905273__$2783a64b147d5f689049cabc192a316d9d$__9063e05bac6890606401602060405180830381865af4158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db091906117ab565b9450505050505b92915050565b60028054600091610dd891600160401b900460ff16906115e8565b610de3906001611611565b60ff16905081600080805b600254600160401b900460ff16811015610f8657600087856001600160401b031681518110610e1f57610e1f61154b565b60200260200101519050610e4b8882606001516001600160401b0316815181106108fb576108fb61154b565b610e6957806060015194508060200151935080604001519250610ebf565b610e8b8882604001516001600160401b0316815181106108fb576108fb61154b565b610ea957806040015194508060200151935080606001519250610ebf565b8060200151945080604001519350806060015192505b6000610ecc83600261152c565b610ed7600189611584565b6001600160401b0316610eea91906117c4565b90506000610ef96001836117c4565b905089856001600160401b031681518110610f1657610f1661154b565b602002602001015160000151600360008481526020019081526020016000208190555089866001600160401b031681518110610f5457610f5461154b565b602090810291909101810151516000928352600390915260409091205550819050610f7e816117db565b915050610dee565b5085836001600160401b031681518110610fa257610fa261154b565b602090810291909101810151516000805260039091527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff55505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051608081018252600080825260208201819052918101829052606081018290529082600281111561108057611080611636565b036110e8576040518060800160405280600081526020016003856110a49190611584565b6001600160401b031681526020016110bd600286611584565b6001600160401b031681526020016110d6600186611584565b6001600160401b031690529050610db7565b60018260028111156110fc576110fc611636565b03611139576040518060800160405280600081526020016002856111209190611584565b6001600160401b031681526020016110bd600386611584565b600282600281111561114d5761114d611636565b036111a3576040518060800160405280600081526020016002856111719190611584565b6001600160401b0316815260200161118a600186611584565b6001600160401b031681526020016110d6600386611584565b60405162461bcd60e51b815260206004820152600b60248201527f756e726561636861626c650000000000000000000000000000000000000000006044820152606401610173565b8051600090158015610db75750610db7826113bf565b600080600080600185600260089054906101000a900460ff1660ff166112279190611584565b6112319190611584565b61123c9060036117f4565b90506112488187611677565b915061125481876115c2565b96919550909350505050565b60008082600281111561127557611275611636565b036112a85783836001600160401b0316815181106112955761129561154b565b6020026020010151602001519050611332565b60018260028111156112bc576112bc611636565b036112ef5783836001600160401b0316815181106112dc576112dc61154b565b6020026020010151604001519050611332565b600282600281111561130357611303611636565b036111a35783836001600160401b0316815181106113235761132361154b565b60200260200101516060015190505b9392505050565b600081600281111561134d5761134d611636565b0361136557506001600160401b031660209190910152565b600181600281111561137957611379611636565b0361139157506001600160401b031660409190910152565b60028160028111156113a5576113a5611636565b036113ba576001600160401b03821660608401525b505050565b600081602001516001600160401b031660001480156113e9575060408201516001600160401b0316155b8015610db7575050606001516001600160401b03161590565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561142b57600080fd5b82356001600160401b038082111561144257600080fd5b818501915085601f83011261145657600080fd5b81358181111561146857611468611402565b8060051b604051601f19603f8301168101818110858211171561148d5761148d611402565b6040529182528482019250838101850191888311156114ab57600080fd5b938501935b828510156114c9578435845293850193928501926114b0565b98975050505050505050565b6000602082840312156114e757600080fd5b81356001600160a01b038116811461133257600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115611527576115276114fe565b500190565b6000816000190483118215151615611546576115466114fe565b500290565b634e487b7160e01b600052603260045260246000fd5b600063ffffffff80831681810361157a5761157a6114fe565b6001019392505050565b60006001600160401b03838116908316818110156115a4576115a46114fe565b039392505050565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b03808416806115dc576115dc6115ac565b92169190910692915050565b600060ff821660ff84168160ff0481118215151615611609576116096114fe565b029392505050565b600060ff821660ff84168060ff0382111561162e5761162e6114fe565b019392505050565b634e487b7160e01b600052602160045260246000fd5b60006001600160401b0380831681851680830382111561166e5761166e6114fe565b01949350505050565b60006001600160401b0380841680611691576116916115ac565b92169190910492915050565b600181815b808511156116d85781600019048211156116be576116be6114fe565b808516156116cb57918102915b93841c93908002906116a2565b509250929050565b6000826116ef57506001610db7565b816116fc57506000610db7565b8160018114611712576002811461171c57611738565b6001915050610db7565b60ff84111561172d5761172d6114fe565b50506001821b610db7565b5060208310610133831016604e8410600b841016171561175b575081810a610db7565b611765838361169d565b8060001904821115611609576116096114fe565b600061133260ff8416836116e0565b600060ff821660ff8416808210156117a2576117a26114fe565b90039392505050565b6000602082840312156117bd57600080fd5b5051919050565b6000828210156117d6576117d66114fe565b500390565b6000600182016117ed576117ed6114fe565b5060010190565b60006113326001600160401b038416836116e056fea2646970667358221220dadafd98d7aaeed8045089408beb8396497221d819acc51c010796abc5d5d35e64736f6c634300080d0033", + "libraries": { + "RescueLib": "0x646396e3fdB1Fbf73eE7F7381D6a25A6f7B919B8" + }, + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "details": "Create a records Merkle tree of the given height.", + "params": { + "merkleTreeHeight": "The height" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "updateRecordsMerkleTree(uint256[])": { + "details": "Update the state of the record merkle tree by inserting new elements.", + "params": { + "elements": "The list of elements to be appended to the current merkle tree described by the frontier." + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getHeight()": { + "notice": "Returns the height of the Merkle tree." + }, + "getNumLeaves()": { + "notice": "Returns the number of leaves of the Merkle tree." + }, + "getRootValue()": { + "notice": "Returns the root value of the Merkle tree." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/RecordsMerkleTree.sol:RecordsMerkleTree", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 3840, + "contract": "contracts/RecordsMerkleTree.sol:RecordsMerkleTree", + "label": "_rootValue", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 3842, + "contract": "contracts/RecordsMerkleTree.sol:RecordsMerkleTree", + "label": "_numLeaves", + "offset": 0, + "slot": "2", + "type": "t_uint64" + }, + { + "astId": 3844, + "contract": "contracts/RecordsMerkleTree.sol:RecordsMerkleTree", + "label": "_merkleTreeHeight", + "offset": 8, + "slot": "2", + "type": "t_uint8" + }, + { + "astId": 3848, + "contract": "contracts/RecordsMerkleTree.sol:RecordsMerkleTree", + "label": "_flattenedFrontier", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_uint256,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/contracts/deployments/arbitrum_goerli/RescueLib.json b/contracts/deployments/arbitrum_goerli/RescueLib.json new file mode 100644 index 00000000..4ba498c9 --- /dev/null +++ b/contracts/deployments/arbitrum_goerli/RescueLib.json @@ -0,0 +1,89 @@ +{ + "address": "0x646396e3fdB1Fbf73eE7F7381D6a25A6f7B919B8", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256[15]", + "name": "inputs", + "type": "uint256[15]" + } + ], + "name": "commit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "c", + "type": "uint256" + } + ], + "name": "hash", + "outputs": [ + { + "internalType": "uint256", + "name": "o", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x12c17d7db641edfe06229f636cdfa2ff9f3dea4c28433b8ad40da488e10ff00b", + "receipt": { + "to": null, + "from": "0x21a49524e319C0b28dAA1d79d50B6D7A346490B2", + "contractAddress": "0x646396e3fdB1Fbf73eE7F7381D6a25A6f7B919B8", + "transactionIndex": 1, + "gasUsed": "2021776", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb69e476afa022e2b5dabe9fbb69a80161af4dd28bfe2919119018e78e878c893", + "transactionHash": "0x12c17d7db641edfe06229f636cdfa2ff9f3dea4c28433b8ad40da488e10ff00b", + "logs": [], + "blockNumber": 1220970, + "cumulativeGasUsed": "2021776", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "72a14774796fae5d4ac4d3b6f26df06c", + "metadata": "{\"compiler\":{\"version\":\"0.8.13+commit.abaa5c0e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256[15]\",\"name\":\"inputs\",\"type\":\"uint256[15]\"}],\"name\":\"commit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"}],\"name\":\"hash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"o\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/RescueLib.sol\":\"RescueLib\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/libraries/RescueLib.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nlibrary RescueLib {\\n /// The constants are obtained from the Sage script\\n /// https://github.com/EspressoSystems/Marvellous/blob/fcd4c41672f485ac2f62526bc87a16789d4d0459/rescue254.sage\\n\\n // These constants are no longer used, left here for readability.\\n // uint256 private constant _N_ROUNDS = 12;\\n // uint256 private constant _STATE_SIZE = 4;\\n // uint256 private constant _SCHEDULED_KEY_SIZE = (2 * _N_ROUNDS + 1) * _STATE_SIZE;\\n // uint256 private constant _ALPHA = 5;\\n\\n // Obtained by running KeyScheduling([0,0,0,0]). See Algorithm 2 of AT specification document.\\n\\n uint256 private constant _PRIME =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n uint256 private constant _ALPHA_INV =\\n 17510594297471420177797124596205820070838691520332827474958563349260646796493;\\n\\n // MDS is hardcoded\\n function _linearOp(\\n uint256 s0,\\n uint256 s1,\\n uint256 s2,\\n uint256 s3\\n )\\n private\\n pure\\n returns (\\n uint256,\\n uint256,\\n uint256,\\n uint256\\n )\\n {\\n // Matrix multiplication\\n unchecked {\\n return (\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575808479992,\\n s0,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575806058117,\\n s1,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575491214367,\\n s2,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186535831058117,\\n s3,\\n _PRIME\\n ),\\n mulmod(19500, s0, _PRIME) +\\n mulmod(3026375, s1, _PRIME) +\\n mulmod(393529500, s2, _PRIME) +\\n mulmod(49574560750, s3, _PRIME),\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575808491587,\\n s0,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575807886437,\\n s1,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186575729688812,\\n s2,\\n _PRIME\\n ) +\\n mulmod(\\n 21888242871839275222246405745257275088548364400416034343698204186565891044437,\\n s3,\\n _PRIME\\n ),\\n mulmod(156, s0, _PRIME) +\\n mulmod(20306, s1, _PRIME) +\\n mulmod(2558556, s2, _PRIME) +\\n mulmod(320327931, s3, _PRIME)\\n );\\n }\\n }\\n\\n function _expAlphaInv4Setup(uint256[6] memory scratch) private pure {\\n assembly {\\n let p := scratch\\n mstore(p, 0x20) // Length of Base\\n mstore(add(p, 0x20), 0x20) // Length of Exponent\\n mstore(add(p, 0x40), 0x20) // Length of Modulus\\n mstore(add(p, 0x80), _ALPHA_INV) // Exponent\\n mstore(add(p, 0xa0), _PRIME) // Modulus\\n }\\n }\\n\\n function _expAlphaInv4(\\n uint256[6] memory scratch,\\n uint256 s0,\\n uint256 s1,\\n uint256 s2,\\n uint256 s3\\n )\\n private\\n view\\n returns (\\n uint256 o0,\\n uint256 o1,\\n uint256 o2,\\n uint256 o3\\n )\\n {\\n assembly {\\n // define pointer\\n let p := scratch\\n let basep := add(p, 0x60)\\n mstore(basep, s0) // Base\\n // store data assembly-favouring ways\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o0 := mload(basep)\\n mstore(basep, s1) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o1 := mload(basep)\\n mstore(basep, s2) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o2 := mload(basep)\\n mstore(basep, s3) // Base\\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\\n // data\\n o3 := mload(basep)\\n }\\n }\\n\\n // Computes the Rescue permutation on some input\\n // Recall that the scheduled key is precomputed in our case\\n // @param input input for the permutation\\n // @return permutation output\\n function perm(\\n // slither-disable-next-line write-after-write\\n uint256 s0,\\n // slither-disable-next-line write-after-write\\n uint256 s1,\\n // slither-disable-next-line write-after-write\\n uint256 s2,\\n // slither-disable-next-line write-after-write\\n uint256 s3\\n )\\n internal\\n view\\n returns (\\n uint256,\\n uint256,\\n uint256,\\n uint256\\n )\\n {\\n // slither-disable-next-line uninitialized-local\\n uint256[6] memory alphaInvScratch;\\n\\n _expAlphaInv4Setup(alphaInvScratch);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 14613516837064033601098425266946467918409544647446217386229959902054563533267,\\n s1 + 376600575581954944138907282479272751264978206975465380433764825531344567663,\\n s2 + 7549886658634274343394883631367643327196152481472281919735617268044202589860,\\n s3 + 3682071510138521345600424597536598375718773365536872232193107639375194756918\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 18657517374128716281071590782771170166993445602755371021955596036781411817786;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 7833794394096838639430144230563403530989402760602204539559270044687522640191;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 21303828694647266539931030987057572024333442749881970102454081226349775826204;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 10601447988834057856019990466870413629636256450824419416829818546423193802418;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 3394657260998945409283098835682964352503279447198495330506177586645995289229,\\n s1 + 18437084083724939316390841967750487133622937044030373241106776324730657101302,\\n s2 + 9281739916935170266925270432337475828741505406943764438550188362765269530037,\\n s3 + 7363758719535652813463843693256839865026387361836644774317493432208443086206\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 307094088106440279963968943984309088038734274328527845883669678290790702381;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 20802277384865839022876847241719852837518994021170013346790603773477912819001;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 19754579269464973651593381036132218829220609572271224048608091445854164824042;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 3618840933841571232310395486452077846249117988789467996234635426899783130819;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 2604166168648013711791424714498680546427073388134923208733633668316805639713,\\n s1 + 21355705619901626246699129842094174300693414345856149669339147704587730744579,\\n s2 + 492957643799044929042114590851019953669919577182050726596188173945730031352,\\n s3 + 8495959434717951575638107349559891417392372124707619959558593515759091841138\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 15608173629791582453867933160400609222904457931922627396107815347244961625587;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 16346164988481725869223011419855264063160651334419415042919928342589111681923;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 21085652277104054699752179865196164165969290053517659864117475352262716334100;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 20640310021063232205677193759981403045043444605175178332133134865746039279935;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 6015589261538006311719125697023069952804098656652050863009463360598997670240,\\n s1 + 12498423882721726012743791752811798719201859023192663855805526312393108407357,\\n s2 + 10785527781711732350693172404486938622378708235957779975342240483505724965040,\\n s3 + 5563181134859229953817163002660048854420912281911747312557025480927280392569\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 4585980485870975597083581718044393941512074846925247225127276913719050121968;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 8135760428078872176830812746579993820254685977237403304445687861806698035222;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 4525715538433244696411192727226186804883202134636681498489663161593606654720;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 2537497100749435007113677475828631400227339157221711397900070636998427379023;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 6957758175844522415482704083077249782181516476067074624906502033584870962925,\\n s1 + 17134288156316028142861248367413235848595762718317063354217292516610545487813,\\n s2 + 20912428573104312239411321877435657586184425249645076131891636094671938892815,\\n s3 + 16000236205755938926858829908701623009580043315308207671921283074116709575629\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 10226182617544046880850643054874064693998595520540061157646952229134207239372;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 18584346134948015676264599354709457865255277240606855245909703396343731224626;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 9263628039314899758000383385773954136696958567872461042004915206775147151562;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 21095966719856094705113273596585696209808876361583941931684481364905087347856;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 2671157351815122058649197205531097090514563992249109660044882868649840700911,\\n s1 + 19371695134219415702961622134896564229962454573253508904477489696588594622079,\\n s2 + 5458968308231210904289987830881528056037123818964633914555287871152343390175,\\n s3 + 7336332584551233792026746889434554547883125466404119632794862500961953384162\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 10351436748086126474964482623536554036637945319698748519226181145454116702488;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 10588209357420186457766745724579739104572139534486480334142455690083813419064;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 14330277147584936710957102218096795520430543834717433464500965846826655802131;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 20752197679372238381408962682213349118865256502118746003818603260257076802028;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 19390446529582160674621825412345750405397926216690583196542690617266028463414,\\n s1 + 4169994013656329171830126793466321040216273832271989491631696813297571003664,\\n s2 + 3014817248268674641565961681956715664833306954478820029563459099892548946802,\\n s3 + 14285412497877984113655094566695921704826935980354186365694472961163628072901\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 16224484149774307577146165975762490690838415946665379067259822320752729067513;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 5404416528124718330316441408560295270695591369912905197499507811036327404407;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 20127204244332635127213425090893250761286848618448128307344971109698523903374;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 14939477686176063572999014162186372798386193194442661892600584389296609365740;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 183740587182448242823071506013879595265109215202349952517434740768878294134,\\n s1 + 15366166801397358994305040367078329374182896694582870542425225835844885654667,\\n s2 + 10066796014802701613007252979619633540090232697942390802486559078446300507813,\\n s3 + 4824035239925904398047276123907644574421550988870123756876333092498925242854\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 5526416022516734657935645023952329824887761902324086126076396040056459740202;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 18157816292703983306114736850721419851645159304249709756659476015594698876611;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 767446206481623130855439732549764381286210118638028499466788453347759203223;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 16303412231051555792435190427637047658258796056382698277687500021321460387129;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 15475465085113677237835653765189267963435264152924949727326000496982746660612,\\n s1 + 14574823710073720047190393602502575509282844662732045439760066078137662816054,\\n s2 + 13746490178929963947720756220409862158443939172096620003896874772477437733602,\\n s3 + 13804898145881881347835367366352189037341704254740510664318597456840481739975\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 3523599105403569319090449327691358425990456728660349400211678603795116364226;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 8632053982708637954870974502506145434219829622278773822242070316888003350278;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 20293222318844554840191640739970825558851264905959070636369796127300969629060;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 7583204376683983181255811699503668584283525661852773339144064901897953897564;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 7562572155566079175343789986900217168516831778275127159068657756836798778249,\\n s1 + 12689811910161401007144285031988539999455902164332232460061366402869461973371,\\n s2 + 21878400680687418538050108788381481970431106443696421074205107984690362920637,\\n s3 + 3428721187625124675258692786364137915132424621324969246210899039774126165479\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 2552744099402346352193097862110515290335034445517764751557635302899937367219;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 13706727374402840004346872704605212996406886221231239230397976011930486183550;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 19786308443934570499119114884492461847023732197118902978413499381102456961966;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 11767081169862697956461405434786280425108140215784390008330611807075539962898;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 1273319740931699377003430019539548781935202579355152343831464213279794249000,\\n s1 + 20225620070386241931202098463018472034137960205721651875253423327929063224115,\\n s2 + 13107884970924459680133954992354588464904218518440707039430314610799573960437,\\n s3 + 10574066469653966216567896842413898230152427846140046825523989742590727910280\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 21386271527766270535632132320974945129946865648321206442664310421414128279311;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 15743262855527118149527268525857865250723531109306484598629175225221686341453;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 16251140915157602891864152518526119259367827194524273940185283798897653655734;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 5420158299017134702074915284768041702367316125403978919545323705661634647751;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n (s0, s1, s2, s3) = _expAlphaInv4(\\n alphaInvScratch,\\n s0 + 14555572526833606349832007897859411042036463045080050783981107823326880950231,\\n s1 + 15234942318869557310939446038663331226792664588406507247341043508129993934298,\\n s2 + 19560004467494472556570844694553210033340577742756929194362924850760034377042,\\n s3 + 21851693551359717578445799046408060941161959589978077352548456186528047792150\\n );\\n }\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n uint256 tmp = s0 +\\n 19076469206110044175016166349949136119962165667268661130584159239385341119621;\\n s0 = mulmod(tmp, tmp, _PRIME);\\n s0 = mulmod(s0, s0, _PRIME);\\n s0 = mulmod(s0, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s1 +\\n 19132104531774396501521959463346904008488403861940301898725725957519076019017;\\n s1 = mulmod(tmp, tmp, _PRIME);\\n s1 = mulmod(s1, s1, _PRIME);\\n s1 = mulmod(s1, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s2 +\\n 6606159937109409334959297158878571243749055026127553188405933692223704734040;\\n s2 = mulmod(tmp, tmp, _PRIME);\\n s2 = mulmod(s2, s2, _PRIME);\\n s2 = mulmod(s2, tmp, _PRIME);\\n }\\n unchecked {\\n uint256 tmp = s3 +\\n 13442678592538344046772867528443594004918096722084104155946229264098946917042;\\n s3 = mulmod(tmp, tmp, _PRIME);\\n s3 = mulmod(s3, s3, _PRIME);\\n s3 = mulmod(s3, tmp, _PRIME);\\n }\\n\\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\\n\\n unchecked {\\n return (\\n s0 + 11975757366382164299373991853632416786161357061467425182041988114491638264212,\\n s1 + 10571372363668414752587603575617060708758897046929321941050113299303675014148,\\n s2 + 5405426474713644587066466463343175633538103521677501186003868914920014287031,\\n s3 + 18665277628144856329335676361545218245401014824195451740181902217370165017984\\n );\\n }\\n }\\n\\n // Computes the hash of three field elements and returns a single element\\n // In our case the rate is 3 and the capacity is 1\\n // This hash function the one used in the Records Merkle tree.\\n // @param a first element\\n // @param b second element\\n // @param c third element\\n // @return the first element of the Rescue state\\n function hash(\\n uint256 a,\\n uint256 b,\\n uint256 c\\n ) public view returns (uint256 o) {\\n (o, a, b, c) = perm(a % _PRIME, b % _PRIME, c % _PRIME, 0);\\n o %= _PRIME;\\n }\\n\\n function checkBounded(uint256[15] memory inputs) internal pure {\\n for (uint256 i = 0; i < inputs.length; ++i) {\\n require(inputs[i] < _PRIME, \\\"inputs must be below _PRIME\\\");\\n }\\n }\\n\\n // This function is external to ensure that the solidity compiler generates\\n // a separate library contract. This is required to reduce the size of the\\n // CAPE contract.\\n function commit(uint256[15] memory inputs) external view returns (uint256) {\\n checkBounded(inputs);\\n\\n uint256 a;\\n uint256 b;\\n uint256 c;\\n uint256 d;\\n\\n for (uint256 i = 0; i < 5; i++) {\\n unchecked {\\n (a, b, c, d) = perm(\\n (a + inputs[3 * i + 0]) % _PRIME,\\n (b + inputs[3 * i + 1]) % _PRIME,\\n (c + inputs[3 * i + 2]) % _PRIME,\\n d\\n );\\n\\n (a, b, c, d) = (a % _PRIME, b % _PRIME, c % _PRIME, d % _PRIME);\\n }\\n }\\n\\n return a;\\n }\\n}\\n\",\"keccak256\":\"0x5d852913c47167b7e785dadec2913f3a468e3279af846ef0d52de3ce106dd274\",\"license\":\"GPL-3.0-or-later\"}},\"version\":1}", + "bytecode": "0x61239e61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c80638c54803614610045578063e05bac681461006a575b600080fd5b61005861005336600461221a565b61007d565b60405190815260200160405180910390f35b6100586100783660046122a7565b610194565b600061008882610211565b60008060008060005b6005811015610189576101546000805160206123498339815191528860038402600f81106100c1576100c16122d3565b60200201518701816100d5576100d56122e9565b066000805160206123498339815191528984600302600101600f81106100fd576100fd6122d3565b6020020151870181610111576101116122e9565b066000805160206123498339815191528a85600302600201600f8110610139576101396122d3565b602002015187018161014d5761014d6122e9565b06856102c2565b600080516020612349833981519152938490069850918390069650829006945006915080610181816122ff565b915050610091565b509295945050505050565b60006101e86101b160008051602061234983398151915286612326565b6101c960008051602061234983398151915286612326565b6101e160008051602061234983398151915286612326565b60006102c2565b91965094509250905061020960008051602061234983398151915282612326565b949350505050565b60005b600f8110156102be576000805160206123498339815191528282600f811061023e5761023e6122d3565b6020020151106102ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e70757473206d7573742062652062656c6f77205f5052494d450000000000604482015260640160405180910390fd5b6102b7816122ff565b9050610214565b5050565b6000806000806102d06121fc565b602080825280820181905260408201527f26b6a528b427b35493736af8679aad17535cb9d394945a0dcfe7f7a98ccccccd608082015260008051602061234983398151915260a08201526103ae818a7f204ef5195a249af9f0ecafa3e5d186d6318a5af08a0ceb9731351045082151d3018a7ed525fbb687d48648b6a0ffbf1c9e97be39cff22d46aa165c3278a5dd953d6f018a7f10b1159c4fdead8c4e6ba55d1bc8338364a6c05eef88185f72da1f178b613ea4018a7f0823fa86ed409e6816795278dac56b0e475e16c412fb04ee260bb3b55db8173601611f2f565b929b50909950975095506103c489898989611fa0565b929b50909950975095507f293fc7d601bacd3c0284df170b21dddab70c60c3de919e3799cba305354a593a890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f1151c53f7f7ff7413e04d66c516cc3faaa38b3b59efe62cdd16bb9a48380b13f88016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2f198a2c4615ac524e724bc229fc8f4ffb57ac86812ccc8f4608f9d08de22d1c8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f177034f8dd1f6da5c3fcd25f4cce79e082153dba89a1587c2190c9ef287616b286016000805160206123498339815191528182099650600080516020612349833981519152878809965060008051602061234983398151915281880996505061055a89898989611fa0565b929b50909950975095506105f9817f07814ed3eb736d73804ada7bc25507db0d7e374369c010c691dd65386c4efa8d8b017f28c30510d747a6a641cd7c81c2b8273c3deefa3366af02e482bfeb806232d5f68b017f14854753e3c7e4e50b1e0e518e99f0e54afe1c82088c1935bcacc286fb64f5b58b017f1047bd5f58c7bc8e500fcd4038744a6f8fcf114448526c6ae4abbcf0f390957e8b01611f2f565b929b509099509750955061060f89898989611fa0565b929b50909950975095507eadcf20cdefe156d31f685c92c4c754fb216b09eab182e5750f53a1df6add2d890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f2dfdabf83e149f597560ff354951c0a0da6ab955b50e6cdf8d45210b6ba3b53988016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2bacb2154e2fd046d124f23427e218f60cfdd290877fd80e89e81223d92d2fea8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f080030fe806bd9e4c2fc56dd2064b48020f3743a02d5d5ef735c19d7f5351ec38601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506107a489898989611fa0565b929b5090995097509550610843817f05c1e7e3b39cea62ed567bbdd4af6aa3172b0ace17480b7631dec55d26f2ae218b017f2f36e6aa6047766aa0ab108a0d9c608c7abcb7e1c36edadd813267aa61eef5038b017f0117010f3e7be4bad697cb596ded269bdce41cb5e4f5df321fc36b8297c8def88b017f12c88ae9e997682f6e64358d6bc2b98f14b22570ffad3896c6ee610c0d9bf8728b01611f2f565b929b509099509750955061085989898989611fa0565b929b50909950975095507f2281e9c8494480ec1144c41f401bc42c6993cb1c244c3ec2d55079c8d1d3f5f3890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f242399fd277ec35ab303f398fb09b832828c0b7dadfc004ceb0fba84331a438388016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2e9e0e672cc6a26e6bfd72800937d17f84aafc14fe34f2e117210fe16216a0148701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f2da20060d27da3c2b99f4baf512e53ce5d3223fd13cb3286d141b29eed7e113f8601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506109ef89898989611fa0565b929b5090995097509550610a8e817f0d4cb3eee3996ba8f6793bb402e88d4405aa1081b0a37b78c7779c3d340f19608b017f1ba1db73659b3b23bd6a6af953113676161828012c3ac346002de9e0dcf0c43d8b017f17d86473dd04a5f188819b5c7f2fd37fec9547a3501c5bc5fd24a02ee30bc0b08b017f0c4ca620d3fd1b4131f3a8b69ac3d5372523f2bf156a0de7ee6265f1ddac69798b01611f2f565b929b5090995097509550610aa489898989611fa0565b929b50909950975095507f0a2392ae4051fe491d971e19a1b2065625c2a352be8e1122f28f647445a632f0890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f11fcad5e34183c64e5b30f231a984c9a2d4d2f1ad82952c694c3c705049f781688016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f0a0176d71d3b0c7ac238ca77529fa7b933a086fa3bfdcb414ffa5e2da9df4b008701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f059c2c2688d5d8ada8ff683cffd98a228b6a1b195b53640501b1c21237f3854f860160008051602061234983398151915281820996506000805160206123498339815191528788099650600080516020612349833981519152818809965050610c3a89898989611fa0565b929b5090995097509550610cd9817f0f61f39a3558851cb791332e7dbebec12b7a43aea2f998b6db4600a80374b6ed8b017f25e1a9d62bab29bb8fb5909517f1d47859f5673f8a2b2cc9dd7c870eda7b0fc58b017f2e3c03dee44661150db8756977960cf0424c8722adbdd647fd468136fd5bb40f8b017f235fd01177ea0b664dda5a1c09278f4160369efc76234c42fab4e27796b8ebcd8b01611f2f565b929b5090995097509550610cef89898989611fa0565b929b50909950975095507f169bd072a166986e826d5173764c5830cf0df28a54fac9efb8b14d14e4ab44cc890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f29165dfde70c541233d7779bffe5e4a5d51ce188051c8b4219176836c89c803288016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f147b071502d5ab6d5c36c904aad61596425648bd04b59041c9467d1c997d40ca8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f2ea3e4df1eb00b56b191c888aae9df7a27b1aaf7f42c07d7fdf4c429f3222c90860160008051602061234983398151915281820996506000805160206123498339815191528788099650600080516020612349833981519152818809965050610e8589898989611fa0565b929b5090995097509550610f24817f05e7d24cc9bead53442604076a931ff1141eeac9df9612665aaf279fefc56def8b017f2ad3fdab692f986698dcbf75bad7997c69656bfaa12c3d018dbd9756f93b2e7f8b017f0c11aaa440c3e58f338902cec6f8d69bdd72af59c2af99023a5997c5a68e97df8b017f10383793760804678052e5585308fdebe58eb196ca0b8cda4d232c4f5dd206e28b01611f2f565b929b5090995097509550610f3a89898989611fa0565b929b50909950975095507f16e2b4a08b6639f2a3ab1db440ac11c96ac7d6a6b622145f9966759785f58918890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f1768b6d0bbabd43b4d8933e7983893b17544bfb5bc859064bd7cfd84a395e83888016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f1faea6415e680069d5206a3c67464d7f69eb518f1b1dfd2cb33012d65c91e3138701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f2de153e0b9e0dd03eff09c7968c5731799e5160093602b927b352d54059471ec8601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506110d089898989611fa0565b929b509099509750955061116f817f2ade9a93522e2e0d9bf61dd2b88f64cc1df63a68121c07506bdeea0e6098c5368b017f0938220a701623e1fd7a5f533a663d90ac5a51825c8bed809125d24ebdd8fd108b017f06aa537ace0534e58d88ce2046010a57eeb22544b8a4697483d60c4638d8cb728b017f1f9541c705b95ef90255b1a5fb64051ab1909f23a3dce6b659e9969523d34fc58b01611f2f565b929b509099509750955061118589898989611fa0565b929b50909950975095507f23debb8c003021369a7969a8282a71c305565849020582efcd3e892446e50ff9890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f0bf2ca96451cbb14a262b0e915fff1aec62d2accd7c3c6c5944c281af35d637788016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2c7f9809cace0068afc0de88a31764989d1911b8565be322cce2613812b4358e8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f210771d9375a0643b6570ac88f3652e77f0e7203b9a7e574821b5f63dfd10eec86016000805160206123498339815191528182099650600080516020612349833981519152878809965060008051602061234983398151915281880996505061131b89898989611fa0565b929b50909950975095506113b9817e67fe55293c933f98e59faf05eaf3eaa1af21626cfc1f96a21b85234752f4768b017f21f8f1341f5053b5439cdce11d696fbec69d44a348535ea782cc5c2171b9ac8b8b017f16419ac8f54dc6d18476d752bbffcafcf180418089ddf8212092d96ef069aea58b017f0aaa4ea3d4a62822c9d5cf275c43975bf683708c78b9c093bb43c5f6f17949e68b01611f2f565b929b50909950975095506113cf89898989611fa0565b929b50909950975095507f0c37d733050f604f2b0e395a3ebb3784f55ee9710e9a0c5e06b4667fbc8bc42a890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f2824f5b6c26e8477a10dd00bd2f0cde0b1b6a4a491cfc97563001805317ea6c388016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f01b25bf1e4df63b5bf06b83d2c3e2ba06ed0597bee28c9db9122cc31650fa3978701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f240b67813effbb5f06110957159335241f5dcfea620e4fce7b2b9a3760408d3986016000805160206123498339815191528182099650600080516020612349833981519152878809965060008051602061234983398151915281880996505061156589898989611fa0565b929b5090995097509550611604817f2236cd86c8d65cb72aa00bcf7296c58a28b849a690e31165d2302f8466caff048b017f20390ed18182dcb8daea043b93aa2b98ca95ab429ff2ca7027db4a27350fbf368b017f1e643cdb387382849957ecf0d99f3115a5c208e59446b7de803478245ed6eae28b017f1e854ba31f89059506f766b129793d5a134296516d3f88b841155468f4c294c78b01611f2f565b929b509099509750955061161a89898989611fa0565b929b50909950975095507f07ca4952be421a53c307f49858f7f2e1c6cba4b3f6f87acb7f6f291dd59091c2890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f131591c541dd94f41e2b7754a4109b4d2eaa0c934e9030c8bb1285e7f26e8f0688016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2cdd8e8a6c5a6cfcab40087c5546dca55d52e0fa92fd5f8968682bd8a4ed05848701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f10c3f10b28beb6599e5b8ee9b2226ea9a25c796bd0630c9540bc864727ea6c5c8601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506117b089898989611fa0565b929b509099509750955061184f817f10b8439f8b5fd9c23e18ec554dc0909d73d488407e6ce9461b2366e600e9cb898b017f1c0e2dd3e1e31ba125d58c9393862f6c234bdb81fa1f7069176c8666a14af97b8b017f305ebc67b8583cc608ddb46561c6573315855a1f8dbd93f9b8c54c61a0972ebd8b017f079496612e6a96e6e973da23508e0ff256bb0b67ee984b3a2c637d85ce84cde78b01611f2f565b929b509099509750955061186589898989611fa0565b929b50909950975095507f05a4cd4d2576ac3bac78003e9b0d75d77781162f562525954a8f1f9cab7ed4b3890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f1e4dbb96d44d70abc545b8b41d65772d4989fd6d0b1d9cc7b68830127e00167e88016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2bbea759cbe13e9047b344becb11fee7d54f9445a4bfb6cf460ee55c85117bae8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f1a03ee9282492493002d081bd9fdfbfab2fce79e734c285aaf3b600d72894c128601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506119fb89898989611fa0565b929b5090995097509550611a9a817f02d0ac662607bf9e018a13d43da00f1c17a80223e53011ca97fe54fe7023bd288b017f2cb74b97aa5a0461e4a0a6e288d99c0905aee732c9cecabe4615ebd5a104b3338b017f1cfacccb910a37fbfd67b2996ec2424a9cb2e2a1d7870a61a806c7b6ee7386f58b017f1760b5a3dec431d5011334c195de57558119f457fb5dbfd6fb88a3a52c5573888b01611f2f565b929b5090995097509550611ab089898989611fa0565b929b50909950975095507f2f483362e91e5828ff12621aca5ae5874ae430a3ebd86da588f90d30a96a5f0f890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f22ce5efa27f62c09d2bcd85ebd23d78840a5d6b68d2633417053edc66cc1af4d88016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f23edd1de61c495e392254d4992eec9b59a5d4598684e6db46d0e0e4f7e0f28b68701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f0bfbb36d010f34c54891c925a46b5a9b1d0acc7bfe443050bfd0dcbaa3c816c7860160008051602061234983398151915281820996506000805160206123498339815191528788099650600080516020612349833981519152818809965050611c4689898989611fa0565b929b5090995097509550611ce5817f202e297f6ede5f8859f39a8cd0c7f0e97f5443821f0261de729ebd5828d167d78b017f21aeabf98b919a79acb5a61da8b0ce8eafddaa6264da67a7f93d0f5278b545da8b017f2b3e91f8c87544d3bffae1237b88f932946be37354eb3fe75ff3f94d07c15d528b017f304f9ec93c84cb215401077e145ffc7ed63be01dae7c8244ba1824025eab80168b01611f2f565b929b5090995097509550611cfb89898989611fa0565b929b50909950975095507f2a2ce6212084c0fd8257c35b7dcf4866c93b17928d4febead535e36bd3e24c85890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f2a4c632e0c6bfd734e93b4ef7aff2765e15abebd4a7a1981aec2b485d700cb4988016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f0e9af43ab6258d55f5b9ba7a5c1b17068735e8b1d0f5bc2a6c5c99711b2b19588701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f1db849552bec3e70b8447baee23d2897e81f8a3afccf5f91f66bf9781be322b2860160008051602061234983398151915281820996506000805160206123498339815191528788099650600080516020612349833981519152818809965050611e9189898989611fa0565b7f1a7a09d8d34387e13b9b5d786cc715e568b6ca39baae0e2d246f33c5ed47b1949093019c7f175f2f49ecddc770f15e33c5f1eabf0f798fccdb47d0cff6bf25490619812c049092019b507f0bf35ceb455df243c98978a7d1c37e180bdcda8c6ad39435574cce62aee910b70199507f29442c39d376d983c64b08829f211c64a89cca2cb7eb49509c3201093e137d80909101975095505050505050565b600080600080886060810189815260208160c08460056107d05a03fa508051955088815260208160c08460056107d05a03fa508051945087815260208160c08460056107d05a03fa508051935086815260208160c08460056107d05a03fa5080519250505095509550955095915050565b6000808080600080516020612349833981519152857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f58aa128b6c509600080516020612349833981519152877f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593dd16ac1f09600080516020612349833981519152897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efdace85096000805160206123498339815191528b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffc2f80901010160008051602061234983398151915286640b8adfc3ee0960008051602061234983398151915288631774c89c096000805160206123498339815191528a622e2dc7096000805160206123498339815191528c614c2c09010101600080516020612349833981519152877f30644e72e131a029b85045b68181585d2833e84879b9709143e1f591a0dfb45509600080516020612349833981519152897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593eb4d80ec096000805160206123498339815191528b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593eff6b465096000805160206123498339815191528d7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effff0430901010160008051602061234983398151915288631317d0fb096000805160206123498339815191528a62270a5c096000805160206123498339815191528c614f52096000805160206123498339815191528e609c090101019350935093509350945094509450949050565b6040518060c001604052806006906020820280368337509192915050565b60006101e080838503121561222e57600080fd5b83601f84011261223d57600080fd5b60405181810181811067ffffffffffffffff8211171561226d57634e487b7160e01b600052604160045260246000fd5b60405290830190808583111561228257600080fd5b845b8381101561229c578035825260209182019101612284565b509095945050505050565b6000806000606084860312156122bc57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60006001820161231f57634e487b7160e01b600052601160045260246000fd5b5060010190565b60008261234357634e487b7160e01b600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212204906c1b7064b2ddfbd437627a7caf9807460b39934c3a73582d3b6e33cf1c22a64736f6c634300080d0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c80638c54803614610045578063e05bac681461006a575b600080fd5b61005861005336600461221a565b61007d565b60405190815260200160405180910390f35b6100586100783660046122a7565b610194565b600061008882610211565b60008060008060005b6005811015610189576101546000805160206123498339815191528860038402600f81106100c1576100c16122d3565b60200201518701816100d5576100d56122e9565b066000805160206123498339815191528984600302600101600f81106100fd576100fd6122d3565b6020020151870181610111576101116122e9565b066000805160206123498339815191528a85600302600201600f8110610139576101396122d3565b602002015187018161014d5761014d6122e9565b06856102c2565b600080516020612349833981519152938490069850918390069650829006945006915080610181816122ff565b915050610091565b509295945050505050565b60006101e86101b160008051602061234983398151915286612326565b6101c960008051602061234983398151915286612326565b6101e160008051602061234983398151915286612326565b60006102c2565b91965094509250905061020960008051602061234983398151915282612326565b949350505050565b60005b600f8110156102be576000805160206123498339815191528282600f811061023e5761023e6122d3565b6020020151106102ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e70757473206d7573742062652062656c6f77205f5052494d450000000000604482015260640160405180910390fd5b6102b7816122ff565b9050610214565b5050565b6000806000806102d06121fc565b602080825280820181905260408201527f26b6a528b427b35493736af8679aad17535cb9d394945a0dcfe7f7a98ccccccd608082015260008051602061234983398151915260a08201526103ae818a7f204ef5195a249af9f0ecafa3e5d186d6318a5af08a0ceb9731351045082151d3018a7ed525fbb687d48648b6a0ffbf1c9e97be39cff22d46aa165c3278a5dd953d6f018a7f10b1159c4fdead8c4e6ba55d1bc8338364a6c05eef88185f72da1f178b613ea4018a7f0823fa86ed409e6816795278dac56b0e475e16c412fb04ee260bb3b55db8173601611f2f565b929b50909950975095506103c489898989611fa0565b929b50909950975095507f293fc7d601bacd3c0284df170b21dddab70c60c3de919e3799cba305354a593a890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f1151c53f7f7ff7413e04d66c516cc3faaa38b3b59efe62cdd16bb9a48380b13f88016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2f198a2c4615ac524e724bc229fc8f4ffb57ac86812ccc8f4608f9d08de22d1c8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f177034f8dd1f6da5c3fcd25f4cce79e082153dba89a1587c2190c9ef287616b286016000805160206123498339815191528182099650600080516020612349833981519152878809965060008051602061234983398151915281880996505061055a89898989611fa0565b929b50909950975095506105f9817f07814ed3eb736d73804ada7bc25507db0d7e374369c010c691dd65386c4efa8d8b017f28c30510d747a6a641cd7c81c2b8273c3deefa3366af02e482bfeb806232d5f68b017f14854753e3c7e4e50b1e0e518e99f0e54afe1c82088c1935bcacc286fb64f5b58b017f1047bd5f58c7bc8e500fcd4038744a6f8fcf114448526c6ae4abbcf0f390957e8b01611f2f565b929b509099509750955061060f89898989611fa0565b929b50909950975095507eadcf20cdefe156d31f685c92c4c754fb216b09eab182e5750f53a1df6add2d890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f2dfdabf83e149f597560ff354951c0a0da6ab955b50e6cdf8d45210b6ba3b53988016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2bacb2154e2fd046d124f23427e218f60cfdd290877fd80e89e81223d92d2fea8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f080030fe806bd9e4c2fc56dd2064b48020f3743a02d5d5ef735c19d7f5351ec38601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506107a489898989611fa0565b929b5090995097509550610843817f05c1e7e3b39cea62ed567bbdd4af6aa3172b0ace17480b7631dec55d26f2ae218b017f2f36e6aa6047766aa0ab108a0d9c608c7abcb7e1c36edadd813267aa61eef5038b017f0117010f3e7be4bad697cb596ded269bdce41cb5e4f5df321fc36b8297c8def88b017f12c88ae9e997682f6e64358d6bc2b98f14b22570ffad3896c6ee610c0d9bf8728b01611f2f565b929b509099509750955061085989898989611fa0565b929b50909950975095507f2281e9c8494480ec1144c41f401bc42c6993cb1c244c3ec2d55079c8d1d3f5f3890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f242399fd277ec35ab303f398fb09b832828c0b7dadfc004ceb0fba84331a438388016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2e9e0e672cc6a26e6bfd72800937d17f84aafc14fe34f2e117210fe16216a0148701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f2da20060d27da3c2b99f4baf512e53ce5d3223fd13cb3286d141b29eed7e113f8601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506109ef89898989611fa0565b929b5090995097509550610a8e817f0d4cb3eee3996ba8f6793bb402e88d4405aa1081b0a37b78c7779c3d340f19608b017f1ba1db73659b3b23bd6a6af953113676161828012c3ac346002de9e0dcf0c43d8b017f17d86473dd04a5f188819b5c7f2fd37fec9547a3501c5bc5fd24a02ee30bc0b08b017f0c4ca620d3fd1b4131f3a8b69ac3d5372523f2bf156a0de7ee6265f1ddac69798b01611f2f565b929b5090995097509550610aa489898989611fa0565b929b50909950975095507f0a2392ae4051fe491d971e19a1b2065625c2a352be8e1122f28f647445a632f0890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f11fcad5e34183c64e5b30f231a984c9a2d4d2f1ad82952c694c3c705049f781688016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f0a0176d71d3b0c7ac238ca77529fa7b933a086fa3bfdcb414ffa5e2da9df4b008701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f059c2c2688d5d8ada8ff683cffd98a228b6a1b195b53640501b1c21237f3854f860160008051602061234983398151915281820996506000805160206123498339815191528788099650600080516020612349833981519152818809965050610c3a89898989611fa0565b929b5090995097509550610cd9817f0f61f39a3558851cb791332e7dbebec12b7a43aea2f998b6db4600a80374b6ed8b017f25e1a9d62bab29bb8fb5909517f1d47859f5673f8a2b2cc9dd7c870eda7b0fc58b017f2e3c03dee44661150db8756977960cf0424c8722adbdd647fd468136fd5bb40f8b017f235fd01177ea0b664dda5a1c09278f4160369efc76234c42fab4e27796b8ebcd8b01611f2f565b929b5090995097509550610cef89898989611fa0565b929b50909950975095507f169bd072a166986e826d5173764c5830cf0df28a54fac9efb8b14d14e4ab44cc890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f29165dfde70c541233d7779bffe5e4a5d51ce188051c8b4219176836c89c803288016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f147b071502d5ab6d5c36c904aad61596425648bd04b59041c9467d1c997d40ca8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f2ea3e4df1eb00b56b191c888aae9df7a27b1aaf7f42c07d7fdf4c429f3222c90860160008051602061234983398151915281820996506000805160206123498339815191528788099650600080516020612349833981519152818809965050610e8589898989611fa0565b929b5090995097509550610f24817f05e7d24cc9bead53442604076a931ff1141eeac9df9612665aaf279fefc56def8b017f2ad3fdab692f986698dcbf75bad7997c69656bfaa12c3d018dbd9756f93b2e7f8b017f0c11aaa440c3e58f338902cec6f8d69bdd72af59c2af99023a5997c5a68e97df8b017f10383793760804678052e5585308fdebe58eb196ca0b8cda4d232c4f5dd206e28b01611f2f565b929b5090995097509550610f3a89898989611fa0565b929b50909950975095507f16e2b4a08b6639f2a3ab1db440ac11c96ac7d6a6b622145f9966759785f58918890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f1768b6d0bbabd43b4d8933e7983893b17544bfb5bc859064bd7cfd84a395e83888016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f1faea6415e680069d5206a3c67464d7f69eb518f1b1dfd2cb33012d65c91e3138701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f2de153e0b9e0dd03eff09c7968c5731799e5160093602b927b352d54059471ec8601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506110d089898989611fa0565b929b509099509750955061116f817f2ade9a93522e2e0d9bf61dd2b88f64cc1df63a68121c07506bdeea0e6098c5368b017f0938220a701623e1fd7a5f533a663d90ac5a51825c8bed809125d24ebdd8fd108b017f06aa537ace0534e58d88ce2046010a57eeb22544b8a4697483d60c4638d8cb728b017f1f9541c705b95ef90255b1a5fb64051ab1909f23a3dce6b659e9969523d34fc58b01611f2f565b929b509099509750955061118589898989611fa0565b929b50909950975095507f23debb8c003021369a7969a8282a71c305565849020582efcd3e892446e50ff9890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f0bf2ca96451cbb14a262b0e915fff1aec62d2accd7c3c6c5944c281af35d637788016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2c7f9809cace0068afc0de88a31764989d1911b8565be322cce2613812b4358e8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f210771d9375a0643b6570ac88f3652e77f0e7203b9a7e574821b5f63dfd10eec86016000805160206123498339815191528182099650600080516020612349833981519152878809965060008051602061234983398151915281880996505061131b89898989611fa0565b929b50909950975095506113b9817e67fe55293c933f98e59faf05eaf3eaa1af21626cfc1f96a21b85234752f4768b017f21f8f1341f5053b5439cdce11d696fbec69d44a348535ea782cc5c2171b9ac8b8b017f16419ac8f54dc6d18476d752bbffcafcf180418089ddf8212092d96ef069aea58b017f0aaa4ea3d4a62822c9d5cf275c43975bf683708c78b9c093bb43c5f6f17949e68b01611f2f565b929b50909950975095506113cf89898989611fa0565b929b50909950975095507f0c37d733050f604f2b0e395a3ebb3784f55ee9710e9a0c5e06b4667fbc8bc42a890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f2824f5b6c26e8477a10dd00bd2f0cde0b1b6a4a491cfc97563001805317ea6c388016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f01b25bf1e4df63b5bf06b83d2c3e2ba06ed0597bee28c9db9122cc31650fa3978701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f240b67813effbb5f06110957159335241f5dcfea620e4fce7b2b9a3760408d3986016000805160206123498339815191528182099650600080516020612349833981519152878809965060008051602061234983398151915281880996505061156589898989611fa0565b929b5090995097509550611604817f2236cd86c8d65cb72aa00bcf7296c58a28b849a690e31165d2302f8466caff048b017f20390ed18182dcb8daea043b93aa2b98ca95ab429ff2ca7027db4a27350fbf368b017f1e643cdb387382849957ecf0d99f3115a5c208e59446b7de803478245ed6eae28b017f1e854ba31f89059506f766b129793d5a134296516d3f88b841155468f4c294c78b01611f2f565b929b509099509750955061161a89898989611fa0565b929b50909950975095507f07ca4952be421a53c307f49858f7f2e1c6cba4b3f6f87acb7f6f291dd59091c2890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f131591c541dd94f41e2b7754a4109b4d2eaa0c934e9030c8bb1285e7f26e8f0688016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2cdd8e8a6c5a6cfcab40087c5546dca55d52e0fa92fd5f8968682bd8a4ed05848701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f10c3f10b28beb6599e5b8ee9b2226ea9a25c796bd0630c9540bc864727ea6c5c8601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506117b089898989611fa0565b929b509099509750955061184f817f10b8439f8b5fd9c23e18ec554dc0909d73d488407e6ce9461b2366e600e9cb898b017f1c0e2dd3e1e31ba125d58c9393862f6c234bdb81fa1f7069176c8666a14af97b8b017f305ebc67b8583cc608ddb46561c6573315855a1f8dbd93f9b8c54c61a0972ebd8b017f079496612e6a96e6e973da23508e0ff256bb0b67ee984b3a2c637d85ce84cde78b01611f2f565b929b509099509750955061186589898989611fa0565b929b50909950975095507f05a4cd4d2576ac3bac78003e9b0d75d77781162f562525954a8f1f9cab7ed4b3890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f1e4dbb96d44d70abc545b8b41d65772d4989fd6d0b1d9cc7b68830127e00167e88016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f2bbea759cbe13e9047b344becb11fee7d54f9445a4bfb6cf460ee55c85117bae8701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f1a03ee9282492493002d081bd9fdfbfab2fce79e734c285aaf3b600d72894c128601600080516020612349833981519152818209965060008051602061234983398151915287880996506000805160206123498339815191528188099650506119fb89898989611fa0565b929b5090995097509550611a9a817f02d0ac662607bf9e018a13d43da00f1c17a80223e53011ca97fe54fe7023bd288b017f2cb74b97aa5a0461e4a0a6e288d99c0905aee732c9cecabe4615ebd5a104b3338b017f1cfacccb910a37fbfd67b2996ec2424a9cb2e2a1d7870a61a806c7b6ee7386f58b017f1760b5a3dec431d5011334c195de57558119f457fb5dbfd6fb88a3a52c5573888b01611f2f565b929b5090995097509550611ab089898989611fa0565b929b50909950975095507f2f483362e91e5828ff12621aca5ae5874ae430a3ebd86da588f90d30a96a5f0f890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f22ce5efa27f62c09d2bcd85ebd23d78840a5d6b68d2633417053edc66cc1af4d88016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f23edd1de61c495e392254d4992eec9b59a5d4598684e6db46d0e0e4f7e0f28b68701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f0bfbb36d010f34c54891c925a46b5a9b1d0acc7bfe443050bfd0dcbaa3c816c7860160008051602061234983398151915281820996506000805160206123498339815191528788099650600080516020612349833981519152818809965050611c4689898989611fa0565b929b5090995097509550611ce5817f202e297f6ede5f8859f39a8cd0c7f0e97f5443821f0261de729ebd5828d167d78b017f21aeabf98b919a79acb5a61da8b0ce8eafddaa6264da67a7f93d0f5278b545da8b017f2b3e91f8c87544d3bffae1237b88f932946be37354eb3fe75ff3f94d07c15d528b017f304f9ec93c84cb215401077e145ffc7ed63be01dae7c8244ba1824025eab80168b01611f2f565b929b5090995097509550611cfb89898989611fa0565b929b50909950975095507f2a2ce6212084c0fd8257c35b7dcf4866c93b17928d4febead535e36bd3e24c85890160008051602061234983398151915281820999506000805160206123498339815191528a8b099950600080516020612349833981519152818b099950507f2a4c632e0c6bfd734e93b4ef7aff2765e15abebd4a7a1981aec2b485d700cb4988016000805160206123498339815191528182099850600080516020612349833981519152898a099850600080516020612349833981519152818a099850507f0e9af43ab6258d55f5b9ba7a5c1b17068735e8b1d0f5bc2a6c5c99711b2b19588701600080516020612349833981519152818209975060008051602061234983398151915288890997506000805160206123498339815191528189099750507f1db849552bec3e70b8447baee23d2897e81f8a3afccf5f91f66bf9781be322b2860160008051602061234983398151915281820996506000805160206123498339815191528788099650600080516020612349833981519152818809965050611e9189898989611fa0565b7f1a7a09d8d34387e13b9b5d786cc715e568b6ca39baae0e2d246f33c5ed47b1949093019c7f175f2f49ecddc770f15e33c5f1eabf0f798fccdb47d0cff6bf25490619812c049092019b507f0bf35ceb455df243c98978a7d1c37e180bdcda8c6ad39435574cce62aee910b70199507f29442c39d376d983c64b08829f211c64a89cca2cb7eb49509c3201093e137d80909101975095505050505050565b600080600080886060810189815260208160c08460056107d05a03fa508051955088815260208160c08460056107d05a03fa508051945087815260208160c08460056107d05a03fa508051935086815260208160c08460056107d05a03fa5080519250505095509550955095915050565b6000808080600080516020612349833981519152857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f58aa128b6c509600080516020612349833981519152877f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593dd16ac1f09600080516020612349833981519152897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efdace85096000805160206123498339815191528b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffc2f80901010160008051602061234983398151915286640b8adfc3ee0960008051602061234983398151915288631774c89c096000805160206123498339815191528a622e2dc7096000805160206123498339815191528c614c2c09010101600080516020612349833981519152877f30644e72e131a029b85045b68181585d2833e84879b9709143e1f591a0dfb45509600080516020612349833981519152897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593eb4d80ec096000805160206123498339815191528b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593eff6b465096000805160206123498339815191528d7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effff0430901010160008051602061234983398151915288631317d0fb096000805160206123498339815191528a62270a5c096000805160206123498339815191528c614f52096000805160206123498339815191528e609c090101019350935093509350945094509450949050565b6040518060c001604052806006906020820280368337509192915050565b60006101e080838503121561222e57600080fd5b83601f84011261223d57600080fd5b60405181810181811067ffffffffffffffff8211171561226d57634e487b7160e01b600052604160045260246000fd5b60405290830190808583111561228257600080fd5b845b8381101561229c578035825260209182019101612284565b509095945050505050565b6000806000606084860312156122bc57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60006001820161231f57634e487b7160e01b600052601160045260246000fd5b5060010190565b60008261234357634e487b7160e01b600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212204906c1b7064b2ddfbd437627a7caf9807460b39934c3a73582d3b6e33cf1c22a64736f6c634300080d0033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/deployments/arbitrum_goerli/VerifyingKeys.json b/contracts/deployments/arbitrum_goerli/VerifyingKeys.json new file mode 100644 index 00000000..a154170d --- /dev/null +++ b/contracts/deployments/arbitrum_goerli/VerifyingKeys.json @@ -0,0 +1,412 @@ +{ + "address": "0xC4E59193Fcbc2Ef3654B246C5503A3B14F741fbD", + "abi": [ + { + "inputs": [ + { + "internalType": "uint8", + "name": "noteType", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "numInput", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "numOutput", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "treeDepth", + "type": "uint8" + } + ], + "name": "getEncodedId", + "outputs": [ + { + "internalType": "uint256", + "name": "encodedId", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "encodedId", + "type": "uint256" + } + ], + "name": "getVkById", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "domainSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "numInputs", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma0", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "sigma4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "q1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "q2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "q3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "q4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qM12", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qM34", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qO", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qC", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qH1", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qH2", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qH3", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qH4", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct BN254.G1Point", + "name": "qEcc", + "type": "tuple" + } + ], + "internalType": "struct IPlonkVerifier.VerifyingKey", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0xeaa12d8fe5479f1ace11adecb39d6b13faa36aeca2cd140902bc5148e326f981", + "receipt": { + "to": null, + "from": "0x21a49524e319C0b28dAA1d79d50B6D7A346490B2", + "contractAddress": "0xC4E59193Fcbc2Ef3654B246C5503A3B14F741fbD", + "transactionIndex": 1, + "gasUsed": "2702488", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1d19fde97774056d0565bf9eb278cfcfcc6042ee2a70f33394cf0d06f41e63d3", + "transactionHash": "0xeaa12d8fe5479f1ace11adecb39d6b13faa36aeca2cd140902bc5148e326f981", + "logs": [], + "blockNumber": 1220973, + "cumulativeGasUsed": "2702488", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "72a14774796fae5d4ac4d3b6f26df06c", + "metadata": "{\"compiler\":{\"version\":\"0.8.13+commit.abaa5c0e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"noteType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"numInput\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"numOutput\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"treeDepth\",\"type\":\"uint8\"}],\"name\":\"getEncodedId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"encodedId\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"encodedId\",\"type\":\"uint256\"}],\"name\":\"getVkById\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"domainSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numInputs\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma0\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"sigma4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"q1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"q2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"q3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"q4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qM12\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qM34\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qO\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qC\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qH1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qH2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qH3\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qH4\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"qEcc\",\"type\":\"tuple\"}],\"internalType\":\"struct IPlonkVerifier.VerifyingKey\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/VerifyingKeys.sol\":\"VerifyingKeys\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/interfaces/IPlonkVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../libraries/BN254.sol\\\";\\n\\ninterface IPlonkVerifier {\\n // Flatten out TurboPlonk proof\\n struct PlonkProof {\\n // the first 5 are 4 inputs and 1 output wire poly commmitments\\n // i.e., batch_proof.wires_poly_comms_vec.iter()\\n // wire0 is 32 bytes which is a pointer to BN254.G1Point\\n BN254.G1Point wire0; // 0x00\\n BN254.G1Point wire1; // 0x20\\n BN254.G1Point wire2; // 0x40\\n BN254.G1Point wire3; // 0x60\\n BN254.G1Point wire4; // 0x80\\n // the next one is the product permutation poly commitment\\n // i.e., batch_proof.prod_perm_poly_comms_vec.iter()\\n BN254.G1Point prodPerm; // 0xA0\\n // the next 5 are split quotient poly commmitments\\n // i.e., batch_proof.split_quot_poly_comms\\n BN254.G1Point split0; // 0xC0\\n BN254.G1Point split1; // 0xE0\\n BN254.G1Point split2; // 0x100\\n BN254.G1Point split3; // 0x120\\n BN254.G1Point split4; // 0x140\\n // witness poly com for aggregated opening at `zeta`\\n // i.e., batch_proof.opening_proof\\n BN254.G1Point zeta; // 0x160\\n // witness poly com for shifted opening at `zeta * \\\\omega`\\n // i.e., batch_proof.shifted_opening_proof\\n BN254.G1Point zetaOmega; // 0x180\\n // wire poly eval at `zeta`\\n uint256 wireEval0; // 0x1A0\\n uint256 wireEval1; // 0x1C0\\n uint256 wireEval2; // 0x1E0\\n uint256 wireEval3; // 0x200\\n uint256 wireEval4; // 0x220\\n // extended permutation (sigma) poly eval at `zeta`\\n // last (sigmaEval4) is saved by Maller Optimization\\n uint256 sigmaEval0; // 0x240\\n uint256 sigmaEval1; // 0x260\\n uint256 sigmaEval2; // 0x280\\n uint256 sigmaEval3; // 0x2A0\\n // product permutation poly eval at `zeta * \\\\omega`\\n uint256 prodPermZetaOmegaEval; // 0x2C0\\n }\\n\\n // The verifying key for Plonk proofs.\\n struct VerifyingKey {\\n uint256 domainSize; // 0x00\\n uint256 numInputs; // 0x20\\n // commitment to extended perm (sigma) poly\\n BN254.G1Point sigma0; // 0x40\\n BN254.G1Point sigma1; // 0x60\\n BN254.G1Point sigma2; // 0x80\\n BN254.G1Point sigma3; // 0xA0\\n BN254.G1Point sigma4; // 0xC0\\n // commitment to selector poly\\n // first 4 are linear combination selector\\n BN254.G1Point q1; // 0xE0\\n BN254.G1Point q2; // 0x100\\n BN254.G1Point q3; // 0x120\\n BN254.G1Point q4; // 0x140\\n // multiplication selector for 1st, 2nd wire\\n BN254.G1Point qM12; // 0x160\\n // multiplication selector for 3rd, 4th wire\\n BN254.G1Point qM34; // 0x180\\n // output selector\\n BN254.G1Point qO; // 0x1A0\\n // constant term selector\\n BN254.G1Point qC; // 0x1C0\\n // rescue selector qH1 * w_ai^5\\n BN254.G1Point qH1; // 0x1E0\\n // rescue selector qH2 * w_bi^5\\n BN254.G1Point qH2; // 0x200\\n // rescue selector qH3 * w_ci^5\\n BN254.G1Point qH3; // 0x220\\n // rescue selector qH4 * w_di^5\\n BN254.G1Point qH4; // 0x240\\n // elliptic curve selector\\n BN254.G1Point qEcc; // 0x260\\n }\\n\\n /// @dev Batch verify multiple TurboPlonk proofs.\\n /// @param verifyingKeys An array of verifying keys\\n /// @param publicInputs A two-dimensional array of public inputs.\\n /// @param proofs An array of Plonk proofs\\n /// @param extraTranscriptInitMsgs An array of bytes from\\n /// transcript initialization messages\\n /// @return _ A boolean that is true for successful verification, false otherwise\\n function batchVerify(\\n VerifyingKey[] memory verifyingKeys,\\n uint256[][] memory publicInputs,\\n PlonkProof[] memory proofs,\\n bytes[] memory extraTranscriptInitMsgs\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x05bacaa9c265b454292a0e68d4746c5c8ae1624459c8ba76248abd513100b8d1\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/BN254.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n//\\n// Based on:\\n// - Christian Reitwiessner: https://gist.githubusercontent.com/chriseth/f9be9d9391efc5beb9704255a8e2989d/raw/4d0fb90847df1d4e04d507019031888df8372239/snarktest.solidity\\n// - Aztec: https://github.com/AztecProtocol/aztec-2-bug-bounty\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Utils.sol\\\";\\n\\n/// @notice Barreto-Naehrig curve over a 254 bit prime field\\nlibrary BN254 {\\n // use notation from https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/\\n //\\n // Elliptic curve is defined over a prime field GF(p), with embedding degree k.\\n // Short Weierstrass (SW form) is, for a, b \\\\in GF(p^n) for some natural number n > 0:\\n // E: y^2 = x^3 + a * x + b\\n //\\n // Pairing is defined over cyclic subgroups G1, G2, both of which are of order r.\\n // G1 is a subgroup of E(GF(p)), G2 is a subgroup of E(GF(p^k)).\\n //\\n // BN family are parameterized curves with well-chosen t,\\n // p = 36 * t^4 + 36 * t^3 + 24 * t^2 + 6 * t + 1\\n // r = 36 * t^4 + 36 * t^3 + 18 * t^2 + 6 * t + 1\\n // for some integer t.\\n // E has the equation:\\n // E: y^2 = x^3 + b\\n // where b is a primitive element of multiplicative group (GF(p))^* of order (p-1).\\n // A pairing e is defined by taking G1 as a subgroup of E(GF(p)) of order r,\\n // G2 as a subgroup of E'(GF(p^2)),\\n // and G_T as a subgroup of a multiplicative group (GF(p^12))^* of order r.\\n //\\n // BN254 is defined over a 254-bit prime order p, embedding degree k = 12.\\n uint256 public constant P_MOD =\\n 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n uint256 public constant R_MOD =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n struct G1Point {\\n uint256 x;\\n uint256 y;\\n }\\n\\n // G2 group element where x \\\\in Fp2 = x0 * z + x1\\n struct G2Point {\\n uint256 x0;\\n uint256 x1;\\n uint256 y0;\\n uint256 y1;\\n }\\n\\n /// @return the generator of G1\\n // solhint-disable-next-line func-name-mixedcase\\n function P1() internal pure returns (G1Point memory) {\\n return G1Point(1, 2);\\n }\\n\\n /// @return the generator of G2\\n // solhint-disable-next-line func-name-mixedcase\\n function P2() internal pure returns (G2Point memory) {\\n return\\n G2Point({\\n x0: 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2,\\n x1: 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed,\\n y0: 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b,\\n y1: 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa\\n });\\n }\\n\\n /// @dev check if a G1 point is Infinity\\n /// @notice precompile bn256Add at address(6) takes (0, 0) as Point of Infinity,\\n /// some crypto libraries (such as arkwork) uses a boolean flag to mark PoI, and\\n /// just use (0, 1) as affine coordinates (not on curve) to represents PoI.\\n function isInfinity(G1Point memory point) internal pure returns (bool result) {\\n assembly {\\n let x := mload(point)\\n let y := mload(add(point, 0x20))\\n result := and(iszero(x), iszero(y))\\n }\\n }\\n\\n /// @return r the negation of p, i.e. p.add(p.negate()) should be zero.\\n function negate(G1Point memory p) internal pure returns (G1Point memory) {\\n if (isInfinity(p)) {\\n return p;\\n }\\n return G1Point(p.x, P_MOD - (p.y % P_MOD));\\n }\\n\\n /// @return res = -fr the negation of scalar field element.\\n function negate(uint256 fr) internal pure returns (uint256 res) {\\n return R_MOD - (fr % R_MOD);\\n }\\n\\n /// @return r the sum of two points of G1\\n function add(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {\\n uint256[4] memory input;\\n input[0] = p1.x;\\n input[1] = p1.y;\\n input[2] = p2.x;\\n input[3] = p2.y;\\n bool success;\\n assembly {\\n success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60)\\n // Use \\\"invalid\\\" to make gas estimation work\\n switch success\\n case 0 {\\n revert(0, 0)\\n }\\n }\\n require(success, \\\"Bn254: group addition failed!\\\");\\n }\\n\\n /// @return r the product of a point on G1 and a scalar, i.e.\\n /// p == p.mul(1) and p.add(p) == p.mul(2) for all points p.\\n function scalarMul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {\\n uint256[3] memory input;\\n input[0] = p.x;\\n input[1] = p.y;\\n input[2] = s;\\n bool success;\\n assembly {\\n success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60)\\n // Use \\\"invalid\\\" to make gas estimation work\\n switch success\\n case 0 {\\n revert(0, 0)\\n }\\n }\\n require(success, \\\"Bn254: scalar mul failed!\\\");\\n }\\n\\n /// @dev Multi-scalar Mulitiplication (MSM)\\n /// @return r = \\\\Prod{B_i^s_i} where {s_i} are `scalars` and {B_i} are `bases`\\n function multiScalarMul(G1Point[] memory bases, uint256[] memory scalars)\\n internal\\n view\\n returns (G1Point memory r)\\n {\\n require(scalars.length == bases.length, \\\"MSM error: length does not match\\\");\\n\\n r = scalarMul(bases[0], scalars[0]);\\n for (uint256 i = 1; i < scalars.length; i++) {\\n r = add(r, scalarMul(bases[i], scalars[i]));\\n }\\n }\\n\\n /// @dev Compute f^-1 for f \\\\in Fr scalar field\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function invert(uint256 fr) internal view returns (uint256 output) {\\n bool success;\\n uint256 p = R_MOD;\\n assembly {\\n let mPtr := mload(0x40)\\n mstore(mPtr, 0x20)\\n mstore(add(mPtr, 0x20), 0x20)\\n mstore(add(mPtr, 0x40), 0x20)\\n mstore(add(mPtr, 0x60), fr)\\n mstore(add(mPtr, 0x80), sub(p, 2))\\n mstore(add(mPtr, 0xa0), p)\\n success := staticcall(gas(), 0x05, mPtr, 0xc0, 0x00, 0x20)\\n output := mload(0x00)\\n }\\n require(success, \\\"Bn254: pow precompile failed!\\\");\\n }\\n\\n /**\\n * validate the following:\\n * x != 0\\n * y != 0\\n * x < p\\n * y < p\\n * y^2 = x^3 + 3 mod p\\n */\\n /// @dev validate G1 point and check if it is on curve\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function validateG1Point(G1Point memory point) internal pure {\\n bool isWellFormed;\\n uint256 p = P_MOD;\\n assembly {\\n let x := mload(point)\\n let y := mload(add(point, 0x20))\\n\\n isWellFormed := and(\\n and(and(lt(x, p), lt(y, p)), not(or(iszero(x), iszero(y)))),\\n eq(mulmod(y, y, p), addmod(mulmod(x, mulmod(x, x, p), p), 3, p))\\n )\\n }\\n require(isWellFormed, \\\"Bn254: invalid G1 point\\\");\\n }\\n\\n /// @dev Validate scalar field, revert if invalid (namely if fr > r_mod).\\n /// @notice Writing this inline instead of calling it might save gas.\\n function validateScalarField(uint256 fr) internal pure {\\n bool isValid;\\n assembly {\\n isValid := lt(fr, R_MOD)\\n }\\n require(isValid, \\\"Bn254: invalid scalar field\\\");\\n }\\n\\n /// @dev Evaluate the following pairing product:\\n /// @dev e(a1, a2).e(-b1, b2) == 1\\n /// @dev caller needs to ensure that a1, a2, b1 and b2 are within proper group\\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\\n function pairingProd2(\\n G1Point memory a1,\\n G2Point memory a2,\\n G1Point memory b1,\\n G2Point memory b2\\n ) internal view returns (bool) {\\n uint256 out;\\n bool success;\\n assembly {\\n let mPtr := mload(0x40)\\n mstore(mPtr, mload(a1))\\n mstore(add(mPtr, 0x20), mload(add(a1, 0x20)))\\n mstore(add(mPtr, 0x40), mload(a2))\\n mstore(add(mPtr, 0x60), mload(add(a2, 0x20)))\\n mstore(add(mPtr, 0x80), mload(add(a2, 0x40)))\\n mstore(add(mPtr, 0xa0), mload(add(a2, 0x60)))\\n\\n mstore(add(mPtr, 0xc0), mload(b1))\\n mstore(add(mPtr, 0xe0), mload(add(b1, 0x20)))\\n mstore(add(mPtr, 0x100), mload(b2))\\n mstore(add(mPtr, 0x120), mload(add(b2, 0x20)))\\n mstore(add(mPtr, 0x140), mload(add(b2, 0x40)))\\n mstore(add(mPtr, 0x160), mload(add(b2, 0x60)))\\n success := staticcall(gas(), 8, mPtr, 0x180, 0x00, 0x20)\\n out := mload(0x00)\\n }\\n require(success, \\\"Bn254: Pairing check failed!\\\");\\n return (out != 0);\\n }\\n\\n function fromLeBytesModOrder(bytes memory leBytes) internal pure returns (uint256 ret) {\\n for (uint256 i = 0; i < leBytes.length; i++) {\\n ret = mulmod(ret, 256, R_MOD);\\n ret = addmod(ret, uint256(uint8(leBytes[leBytes.length - 1 - i])), R_MOD);\\n }\\n }\\n\\n /// @dev Check if y-coordinate of G1 point is negative.\\n function isYNegative(G1Point memory point) internal pure returns (bool) {\\n return (point.y << 1) < P_MOD;\\n }\\n\\n // @dev Perform a modular exponentiation.\\n // @return base^exponent (mod modulus)\\n // This method is ideal for small exponents (~64 bits or less), as it is cheaper than using the pow precompile\\n // @notice credit: credit: Aztec, Spilsbury Holdings Ltd\\n function powSmall(\\n uint256 base,\\n uint256 exponent,\\n uint256 modulus\\n ) internal pure returns (uint256) {\\n uint256 result = 1;\\n uint256 input = base;\\n uint256 count = 1;\\n\\n assembly {\\n let endpoint := add(exponent, 0x01)\\n for {\\n\\n } lt(count, endpoint) {\\n count := add(count, count)\\n } {\\n if and(exponent, count) {\\n result := mulmod(result, input, modulus)\\n }\\n input := mulmod(input, input, modulus)\\n }\\n }\\n\\n return result;\\n }\\n\\n function g1Serialize(G1Point memory point) internal pure returns (bytes memory) {\\n uint256 mask = 0;\\n\\n // Set the 254-th bit to 1 for infinity\\n // https://docs.rs/ark-serialize/0.3.0/src/ark_serialize/flags.rs.html#117\\n if (isInfinity(point)) {\\n mask |= 0x4000000000000000000000000000000000000000000000000000000000000000;\\n }\\n\\n // Set the 255-th bit to 1 for positive Y\\n // https://docs.rs/ark-serialize/0.3.0/src/ark_serialize/flags.rs.html#118\\n if (!isYNegative(point)) {\\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\\n }\\n\\n return abi.encodePacked(Utils.reverseEndianness(point.x | mask));\\n }\\n\\n function g1Deserialize(bytes32 input) internal view returns (G1Point memory point) {\\n uint256 mask = 0x4000000000000000000000000000000000000000000000000000000000000000;\\n uint256 x = Utils.reverseEndianness(uint256(input));\\n uint256 y;\\n bool isQuadraticResidue;\\n bool isYPositive;\\n if (x & mask != 0) {\\n // the 254-th bit == 1 for infinity\\n x = 0;\\n y = 0;\\n } else {\\n // Set the 255-th bit to 1 for positive Y\\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\\n isYPositive = (x & mask != 0);\\n // mask off the first two bits of x\\n mask = 0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n x &= mask;\\n\\n // solve for y where E: y^2 = x^3 + 3\\n y = mulmod(x, x, P_MOD);\\n y = mulmod(y, x, P_MOD);\\n y = addmod(y, 3, P_MOD);\\n (isQuadraticResidue, y) = quadraticResidue(y);\\n\\n require(isQuadraticResidue, \\\"deser fail: not on curve\\\");\\n\\n if (isYPositive) {\\n y = P_MOD - y;\\n }\\n }\\n\\n point = G1Point(x, y);\\n }\\n\\n function quadraticResidue(uint256 x)\\n internal\\n view\\n returns (bool isQuadraticResidue, uint256 a)\\n {\\n bool success;\\n // e = (p+1)/4\\n uint256 e = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52;\\n uint256 p = P_MOD;\\n\\n // we have p == 3 mod 4 therefore\\n // a = x^((p+1)/4)\\n assembly {\\n // credit: Aztec\\n let mPtr := mload(0x40)\\n mstore(mPtr, 0x20)\\n mstore(add(mPtr, 0x20), 0x20)\\n mstore(add(mPtr, 0x40), 0x20)\\n mstore(add(mPtr, 0x60), x)\\n mstore(add(mPtr, 0x80), e)\\n mstore(add(mPtr, 0xa0), p)\\n success := staticcall(gas(), 0x05, mPtr, 0xc0, 0x00, 0x20)\\n a := mload(0x00)\\n }\\n require(success, \\\"pow precompile call failed!\\\");\\n\\n // ensure a < p/2\\n if (a << 1 > p) {\\n a = p - a;\\n }\\n\\n // check if a^2 = x, if not x is not a quadratic residue\\n e = mulmod(a, a, p);\\n\\n isQuadraticResidue = (e == x);\\n }\\n}\\n\",\"keccak256\":\"0x3607d86e6e230526d4cb8f5ae427d9ad04f7f77455f4994ee4f1c6d8d7e829ca\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Freeze2In2Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Freeze2In2Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 7)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 5118137774697846205332813764527928981094534629179826197661885163309718792664\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 21444510867008360096097791654924066970628086592132286765149218644570218218958\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 8803078987858664729272498900762799875194584982758288268215987493230494163132\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 2433303804972293717223914306424233027859258355453999879123493306111951897773\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 3260803333275595200572169884988811547059839215101652317716205725226978273005\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 3613466037895382109608881276133312019690204476510004381563636709063308697093\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 2899439069156777615431510251772750434873724497570948892914993632800602868003\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 8379069052308825781842073463279139505822176676050290986587894691217284563176\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 11732815069861807091165298838511758216456754114248634732985660813617441774658\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 13166648630773672378735632573860809427570624939066078822309995911184719468349\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 3491113372305405096734724369052497193940883294098266073462122391919346338715\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 9827940866231584614489847721346069816554104560301469101889136447541239075558\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 13435736629650136340196094187820825115318808951343660439499146542480924445056\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 17982003639419860944219119425071532203644939147988825284644182004036282633420\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 9420441314344923881108805693844267870391289724837370305813596950535269618889\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 14052028114719021167053334693322209909986772869796949309216011765205181071250\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 5993794253539477186956400554691260472169114800994727061541419240125118730670\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 7932960467420473760327919608797843731121974235494949218022535850994096308221\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 20429406452243707916630058273965650451352739230543746812138739882954609124362\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 19692763177526054221606086118119451355223254880919552106296824049356634107628\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 5116116081275540865026368436909879211124168610156815899416152073819842308833\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 19842614482623746480218449373220727139999815807703100436601033251034509288020\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 3222495709067365879961349438698872943831082393186134710609177690951286365439\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 3703532585269560394637679600890000571417416525562741673639173852507841008896\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 14390471925844384916287376853753782482889671388409569687933776522892272411453\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 12261059506574689542871751331715340905672203590996080541963527436628201655551\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 212133813390818941086614328570019936880884093617125797928913969643819686094\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 2058275687345409085609950154451527352761528547310163982911053914079075244754\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 7507728187668840967683000771945777493711131652056583548804845913578647015848\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 15764897865018924692970368330703479768257677759902236501992745661340099646248\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 18302496468173370667823199324779836313672317342261283918121073083547306893947\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 8286815911028648157724790867291052312955947067988434001008620797971639607610\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 3470304694844212768511296992238419575123994956442939632524758781128057967608\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 9660892985889164184033149081062412611630238705975373538019042544308335432760\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 2964316839877400858567376484261923751031240259689039666960763176068018735519\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 12811532772714855857084788747474913882317963037829729036129619334772557515102\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0xaed0ac1a38ac4b0efd28b720b24fe33648f5e74105f8edfcb965b48c32453edf\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Freeze3In3Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Freeze3In3Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 9)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 13960731824189571867091334541157339805012676983241098249236778497915465352053\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 15957967148909612161116218663566087497068811688498797226467515095325657152045\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 10072587287838607559866316765624459623039578259829899225485734337870604479821\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 15609102652788964903340031795269302405421393375766454476378251576322947285858\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 6565707169634610873662073730120423414251877113110818166564470784428289496576\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 9611712776953584296612678707999788907754017999002246476393974258810867124564\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 19122400063214294010991425447556532201595762243736666161415050184531098654161\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 8531074110951311734071734321378003618052738734286317677359289798683215129985\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 18914674706112982859579196036464470962561796494057486369943014188445892675591\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 8521550178820292984099911306615540388090622911114862049753515592863829430736\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 14630335835391046544786473024276900306274085179180854494149987003151236405693\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 11927636740621831793456799535735389934490350641107279163802406976389995490906\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 12724914112829888521503996001370933887413324349676112061904353298191125761834\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 3433370683786676509006167821257247081483834358490691629467376279251656650897\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 9566744544381523978155846140753126684369534823789897373672815695046810310988\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 260017699035964770662690666115311602214922546306804012310168827438556483441\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 18742890127040989288898023133652949889864689947035150783791742574000686319400\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 18749161983189150319356152659011703669863797011859087161475368338926038180308\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 20773233313791930222139945008080890514898946888819625041024291924369611870607\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 13521724424975535658347353167027580945107539483287924982357298371687877483981\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 10660982607928179139814177842882617778440401746692506684983260589289268170379\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 15139413484465466645149010003574654339361200137557967877891360282092282891685\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 17250558007005834955604250406579207360748810924758511953913092810009135851470\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 11258418978437321501318046240697776859180107275977030400553604411488978149668\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 18952078950487788846193130112459018587473354670050028821020889375362878213321\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 17193026626593699161155564126784943150078109362562131961513990003707313130311\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 14543481681504505345294846715453463092188884601462120536722150134676588633429\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 18051927297986484527611703191585266713528321784715802343699150271856051244721\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 17183091890960203175777065490726876011944304977299231686457191186480347944964\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 4490401529426574565331238171714181866458606184922225399124187058005801778892\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 1221754396433704762941109064372027557900417150628742839724350141274324105531\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 5852202975250895807153833762470523277935452126865915206223172229093142057204\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 15942219407079940317108327336758085920828255563342347502490598820248118460133\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 13932908789216121516788648116401360726086794781411868046768741292235436938527\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 11253921189643581015308547816247612243572238063440388125238308675751100437670\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 21538818198962061056994656088458979220103547193654086011201760604068846580076\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0xdd07fbe21dbdc1be9a602fc27b2ad4cbcecab74f4ff763ac190fb7be09d84d83\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Mint1In2Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Mint1In2Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 16384)\\n // num of public inputs\\n mstore(add(vk, 0x20), 22)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 18715857233450097233566665862469612667705408112918632327151254517366615510853\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 12056659507165533739511169991607046566607546589228993432633519678105063191994\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 14824195002671574468331715635494727121571793218927771429557442195822888294112\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 15545363005844852395434066542267547241977074468438704526560481952507920680442\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 12730937992652390663908670084945912580250489721157445258662047611384656062589\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 13922972325643955705903067190275250069235823502347080251607855678412413832655\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 11205515283341717493374802581094446196264159623530455592177314841729924213298\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 21626228139140341994554265888140425084500331880890693761295353772893134873176\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 1297892505212470170669591175924901147071008882331974691087297632739019966869\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 5046998337256619649328073625306172605427225136111531257681027197976756517579\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 3416126502361838053757816729968531801453964981226124461039874315717193603949\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 13457539169423794765649307630863376252412201646715715024708233511728175887361\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 14560725448400229197269899568322480538530865768296597131421754928016376186765\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 948706310326485520368947730671484733882983133515374382612890953953178516965\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 3629576662585230443325226017156907801568659344982452092584030101519414013585\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 11755059153403672321764085695058203755528587063932979109812536973510125660021\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 11004655709419206490244680738164512138236779409731663166100876015592834374329\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 3075086625849477481019461602494583874758896233088021555313650923393327170396\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 5116214943488395672472205024247672892505731883467355177124324350502474270399\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 5862627121952215177093377764664762757373132220173512585597211838016077936314\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 17591159830764396623974345916017368127032492198578190405514161605820133619635\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 21823861194811124564815272373053730365073236057851878678286985577859771922838\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 4270340305067371269951830198578603793146745643909898988425564374444309637164\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 3429516859933338020020014748205944416226065682096817012737681215798779959358\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 18140449432973717159678873762584078749849242918610972566667541337332136871548\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 9496973080403650076452512345486781056144944295333639818676842964799046293494\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 2679601553769052076036509170798838073426403353317218807312666276919478214029\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 8104020893469546307958011379600482565107943832349081304458473817724197756534\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 15359849857211682094089890949757251089555853826462724721381029431330976452771\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 16491566299722544741678927866350154870498939946959249271831955257228312538659\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 12100931690223724084472313998885551549102209045806672061992493151022394323721\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 789632069622495739311692844331711309820973570859008137449744966665497183364\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 9372499437356245507830218065264333778849228240985893278867565670067559001476\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 5071314442263159884139201702429590502916613589463313571011317767821015131114\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 13714688610643446356217590887080562811494820054657712165894734861828853586333\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 1823119861575201921550763026703044012616621870847156108104965194178825195245\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcd67c9657c6f07e963aa52abdf8596aec671a8f7d3a0a7c8b3587941a3d4ab01\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Transfer1In2Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Transfer1In2Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 14)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 6451930258054036397165544866644311272180786776693649154889113517935138989324\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 15824498031290932840309269587075035510403426361110328301862825820425402064333\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 16567945706248183214406921539823721483157024902030706018155219832331943151521\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 14506648136467119081958160505454685757895812203258866143116417397069305366174\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 16908805137848644970538829805684573945187052776129406508429516788865993229946\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 13370902069114408370627021011309095482019563080650295231694581484651030202227\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 11385428061273012554614867838291301202096376350855764984558871671579621291507\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 18938480909096008246537758317235530495583632544865390355616243879170108311037\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 7250836052061444170671162428779548720754588271620290284029438087321333136859\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 9774478170511284714380468511107372909275276960243638784016266344709965751507\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 2164661706057106993702119971892524764909406587180616475316536801798272746351\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 7993083931046493938644389635874939373576598203553188654440768055247347522377\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 17875027092910639802264620931724329796279457509298747494670931666396434012177\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 12276180841132702377773827582398158204508221552359644390751974783173207949116\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 6923045257159434019788850173231395134054684072354814328515094196682490129996\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 10297389981574891432841377306749459633586002482842974197875786670892058142179\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 13566140293342467207563198706820126266175769850278450464476746689910443370750\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 4337013617009771491102950113766314929630396941539697665107262932887431611820\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 19545356440018631139549838928930231615194677294299230322568967706100221743452\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 3905268653568739552774781017975590296651581349403516285498718251384231803637\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 3633513776458243190609011598510312470369153119749343878250857605063953894824\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 10348854780537633653024803962077925757963724802390956695225993897601858375068\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 10515123958235902109894586452633863486298290064878690665500349352367945576213\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 20835963785046732330293306231553834880816750576829504030205004088050809531737\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 10349250837084111252673833558497412287345352572732754388450385078539897036072\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 1295954576893766564415821998145161393110346678014886452040838119568563355556\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 18595738613642013642528283665640490180800278502934355301953048187579782737773\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 5708601727819525671780050950771464619626673626810479676243974296923430650735\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 8105844768413379370590866345497514518639783589779028631263566798017351944465\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 13767799708582015119198203890136804463714948257729839866946279972890684141171\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 13976995316216184532948677497270469464100744949177652840098916826286666391978\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 8782060747227562892357029272916715317651514559557103332761644499318601665300\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 10423258206189675762927713311069351374538317153673220039972782365668263479097\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 12712089727236847935392559371166622501626155101609755726562266635070650647609\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 3447947975392962233948092031223758925923495365282112464857270024948603045088\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 4655198050073279486560411245172865913095816956325221266986314415391129730949\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b675fc4b56b1f9b2580aef2ed84f6823fb8a180a637b97ff4d4603941be6d77\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Transfer2In2Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Transfer2In2Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 27)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 2353344940323935826134936223947938042521909475033774928828281661731550798722\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 9746655158250922067275109215926891774244956160343543537816404835253168644024\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 15455409296542685326830249024223724266624290984578410657713086954481835262616\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 18311379816054123251097409624258299432408683566103718315014121691958807960547\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 3595102568308999621710931895728700858137670894580826466196432246884451756647\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 5971868016111020985417776938700261612639243638290968867440360355753182506016\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 12443289603239702012200478229424802817855243081906319312702825218898138895946\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 14108881420049829870828878537593066975275378607590487898362908473190089969939\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 19679657199741651524390089978450662678686454680964744364368691879627016432652\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 17114067594856558864780849616452660298251042000563020846487894545389438664806\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 4521205613646422234630873762189179209607994647697100090154823061235920789353\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 16106449496625400183304424755719536524421029289605758534728292280016648447637\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 15558337488326969806891656016031810341177100586194811207644366322955582958290\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 154404024660163916069895563430486111291743096749375581648108814279740019496\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 10968315091130697826739702003431871061194509005508422925553623050382577326217\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 15427520064071248215056685014173235486104450904391795026852773491856938894709\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 18552120566932429867086353275996329695634259700395564758868503989836119743976\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 3758067104786429430903075307629079520236919298153864746942709833835554967358\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 15572105585408879365916525794377657194208962207139936775774251314043834098564\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 6020958592977720912767721649577520866900127639444801108025166566775601659967\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 7222736374399006211510699304087942059126683193629769887877014686905908945806\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 3206829195840321731462512861208486643839466222481973961857037286401683735687\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 3354591448826521438380040598853232839565248677422944332090180952953080366288\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 19963668090281374431317017250026510351550118984869870738585126468447913244591\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 17974807300702948996049252322259229942746003444136224778640009295566243156501\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 12052046477897583522878740699736101759681160588792932192885758224246430725626\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 4921034593166626300651198249205635549101612701433540517476055976860959484949\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 10185405862489710856496932329182422458788356942668474473592359869600739434412\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 5878093886505576171449048465070377785955067968838740459103515014923390639639\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 15259888626953734049577795735967576333281508824947666542918638019623811781546\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 19643669610230135658961129468905806322162637394453939877922249528939594418232\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 12224852444220822793589818921506014057813793178254991680570188956045824616826\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 6641963433101155753834035944397107424954075034582038862756599997819459513127\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 3589782713125700501109156506560851754947305163593203470270968608024453926281\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 12330486534063835148740124350008103247243211222952306312071501975705307117092\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 20509504091296584456523257770792088853619865130173628006197630419037120651742\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0x551bf64b658e5842e7e3ab18d5b86e5db9cd36682613d189d02f053e4d13a5bb\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Transfer2In3Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Transfer2In3Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 32768)\\n // num of public inputs\\n mstore(add(vk, 0x20), 32)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 11238918059962060895836660665905685183821438171673788872298187887301460117949\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 10312536098428436059770058647883007948230826032311055958980103002216444398029\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 3069296210454062532812049058888182398466997742713116483712055777740542557095\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 10585452901889142818220136732592206035573929406563129602198941778025261934559\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 49796010413150322443747223871067686918728570624660232645490911700120682624\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 19418979289570937603858876101332413214999751685423780259104815571219376501897\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 5017549683124968830897329522528615084825569869584518140023215913256996665369\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 6904459746270415738591583761210331008369254540754508554401155557939093240173\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 15294346261666962115813163162624127728984137808463913539428567756274357657589\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 6335459220235140110171052568798094575702073047123843498885605762024671566976\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 3447729854865352811909348476580581256116229886577313169808953699321178547567\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 10391923178665150678480226437763860904879593811452327022884721625331046561649\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 21331037483834702908326522885638199264097608653827628146912836859219217391521\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 17700979571500030343918100715185217716266526246917146097813330984808052588149\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 19231315187566819499805706567670055518295048760424962411545826184537652443122\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 1786951957014031658307434161704132339929023647859863721152324287915947831283\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 891318259297166657950777135402426115367536796891436125685210585889035809375\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 19080042747384460176894767057995469942920956949014313980914237214240134307208\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 8600864573298799022763786653218006387353791810267845686055695121259061041328\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 16693779427169671344028720673356223282089909563990595319572224701304611776922\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 9157681660736307225301034938839156685740016704526090406950858434609030225480\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 8030757918449598333025173041225419314601924784825356372892442933863889091921\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 13640927194155719878577037989318164230713264172921393074620679102349279698839\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 6900604409783116559678606532527525488965021296050678826316410961047810748517\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 5252746067177671060986834545182465389119363624955154280966570801582394785840\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 9195131821976884258765963928166452788332100806625752840914173681395711439614\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 14977645969508065057243931947507598769856801213808952261859994787935726005589\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 5096294777527669951530261927053173270421982090354495165464932330992574194565\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 3545567189598828405425832938456307851398759232755240447556204001745014820301\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 1941523779920680020402590579224743136261147114116204389037553310789640138016\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 18752226702425153987309996103585848095327330331398325134534482624274124156372\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 11041340585339071070596363521057299677913989755036511157364732122494432877984\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 14590850366538565268612154711126247437677807588903705071677135475079401886274\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 18590050088847501728340953044790139366495591524471631048198965975345765148219\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 21704590671982347430816904792389667189857927953663414983186296915645026530922\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 20891693206558394293557033642999941159043782671912221870570329299710569824990\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0x972a44ce31523b90135b140bf707d5dd82d67c4ea3f7d7f285627969704d03f7\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Transfer3In3Out24DepthVk.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./BN254.sol\\\";\\n\\nlibrary Transfer3In3Out24DepthVk {\\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\\n assembly {\\n // domain size\\n mstore(vk, 65536)\\n // num of public inputs\\n mstore(add(vk, 0x20), 45)\\n\\n // sigma0\\n mstore(\\n mload(add(vk, 0x40)),\\n 6745569324574292840123998773726184666805725845966057344477780763812378175216\\n )\\n mstore(\\n add(mload(add(vk, 0x40)), 0x20),\\n 15674359264100532117390420549335759541287602785521062799291583384533749901741\\n )\\n // sigma1\\n mstore(\\n mload(add(vk, 0x60)),\\n 3882047939060472482494153851462770573213675187290765799393847015027127043523\\n )\\n mstore(\\n add(mload(add(vk, 0x60)), 0x20),\\n 7630821036627726874781987389422412327209162597154025595018731571961516169947\\n )\\n // sigma2\\n mstore(\\n mload(add(vk, 0x80)),\\n 21225224708013383300469954369858606000505504678178518510917526718672976749965\\n )\\n mstore(\\n add(mload(add(vk, 0x80)), 0x20),\\n 16365929799382131762072204211493784381011606251973921052275294268694891754790\\n )\\n // sigma3\\n mstore(\\n mload(add(vk, 0xa0)),\\n 18816028553810513067728270242942259651783354986329945635353859047149476279687\\n )\\n mstore(\\n add(mload(add(vk, 0xa0)), 0x20),\\n 11882680851945303658063593837716037756293837416752296611477056121789431777064\\n )\\n // sigma4\\n mstore(\\n mload(add(vk, 0xc0)),\\n 21510097154791711734296287821852281209791416779989865544015434367940075374914\\n )\\n mstore(\\n add(mload(add(vk, 0xc0)), 0x20),\\n 3430102751397774877173034066414871678821827985103146314887340992082993984329\\n )\\n\\n // q1\\n mstore(\\n mload(add(vk, 0xe0)),\\n 19869597504326919094166107694290620558808748604476313005465666228287903414344\\n )\\n mstore(\\n add(mload(add(vk, 0xe0)), 0x20),\\n 7150111322568846997819037419437132637225578315562663408823282538527304893394\\n )\\n // q2\\n mstore(\\n mload(add(vk, 0x100)),\\n 15160992848460929858090744745540508270198264712727437471403260552347088002356\\n )\\n mstore(\\n add(mload(add(vk, 0x100)), 0x20),\\n 14658479685250391207452586531545916785099257310771621120220342224985727703397\\n )\\n // q3\\n mstore(\\n mload(add(vk, 0x120)),\\n 8235204123369855002620633544318875073465201482729570929826842086900101734240\\n )\\n mstore(\\n add(mload(add(vk, 0x120)), 0x20),\\n 1315782571791013709741742522230010040948540142932666264718230624795003912658\\n )\\n // q4\\n mstore(\\n mload(add(vk, 0x140)),\\n 7021080634443416008459948952678027962506306501245829421538884411847588184010\\n )\\n mstore(\\n add(mload(add(vk, 0x140)), 0x20),\\n 6584493294015254847476792897094566004873857428175399671267891995703671301938\\n )\\n\\n // qM12\\n mstore(\\n mload(add(vk, 0x160)),\\n 19199743165408884046745846028664619315169170959180153012829728401858950581623\\n )\\n mstore(\\n add(mload(add(vk, 0x160)), 0x20),\\n 14838749009602762930836652487207610572239367359059811743491751753845995666312\\n )\\n // qM34\\n mstore(\\n mload(add(vk, 0x180)),\\n 10248259393969855960972127876087560001222739594880062140977367664638629457979\\n )\\n mstore(\\n add(mload(add(vk, 0x180)), 0x20),\\n 3405469462517204071666729973707416410254082166076974198995581327928518673875\\n )\\n\\n // qO\\n mstore(\\n mload(add(vk, 0x1a0)),\\n 9259807925511910228709408577417518144465439748546649497440413244416264053909\\n )\\n mstore(\\n add(mload(add(vk, 0x1a0)), 0x20),\\n 4349742126987923639436565898601499377373071260693932114899380098788981806520\\n )\\n // qC\\n mstore(\\n mload(add(vk, 0x1c0)),\\n 195924708408078159303893377539882303047203274957430754688974876101940076523\\n )\\n mstore(\\n add(mload(add(vk, 0x1c0)), 0x20),\\n 2730242103617344574903225508726280194241425124842703262405260488972083367491\\n )\\n // qH1\\n mstore(\\n mload(add(vk, 0x1e0)),\\n 20219387287202350426068670038890996732790822982376234641416083193417653609683\\n )\\n mstore(\\n add(mload(add(vk, 0x1e0)), 0x20),\\n 4712902992473903996354956065401616044154872569903741964754702810524685939510\\n )\\n // qH2\\n mstore(\\n mload(add(vk, 0x200)),\\n 20606018511516306199576247848201856706631620007530428100607004704631466340548\\n )\\n mstore(\\n add(mload(add(vk, 0x200)), 0x20),\\n 3431535724436156106895017518971445784357440465218022981124980111332355382620\\n )\\n // qH3\\n mstore(\\n mload(add(vk, 0x220)),\\n 16926802729258759088538388518776752987858809292908095720269836387951179849328\\n )\\n mstore(\\n add(mload(add(vk, 0x220)), 0x20),\\n 17982233223518308144739071673627895392237126231063756253762501987899411496611\\n )\\n // qH4\\n mstore(\\n mload(add(vk, 0x240)),\\n 2769108222659962988853179530681878069454558991374977224908414446449310780711\\n )\\n mstore(\\n add(mload(add(vk, 0x240)), 0x20),\\n 1229799452453481995415811771099188864368739763357472273935665649735041438448\\n )\\n // qEcc\\n mstore(\\n mload(add(vk, 0x260)),\\n 4813470345909172814186147928188285492437945113396806975178500704379725081570\\n )\\n mstore(\\n add(mload(add(vk, 0x260)), 0x20),\\n 5911983361843136694947821727682990071782684402361679071602671084421707986423\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0x1b99c5af4d76f09fef1dd76c421b249560d3ff70288fef8f9e50534488401a1f\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/Utils.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nlibrary Utils {\\n function reverseEndianness(uint256 input) internal pure returns (uint256 v) {\\n v = input;\\n\\n // swap bytes\\n v =\\n ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) |\\n ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\\n\\n // swap 2-byte long pairs\\n v =\\n ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) |\\n ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\\n\\n // swap 4-byte long pairs\\n v =\\n ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) |\\n ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32);\\n\\n // swap 8-byte long pairs\\n v =\\n ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) |\\n ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64);\\n\\n // swap 16-byte long pairs\\n v = (v >> 128) | (v << 128);\\n }\\n}\\n\",\"keccak256\":\"0x6171f0308aaf0e5379abfee2ed1aa69b81232ef35f0a5576bf7e16d9ad73ac49\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/VerifyingKeys.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n//\\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\\n//\\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../interfaces/IPlonkVerifier.sol\\\";\\nimport \\\"./Transfer1In2Out24DepthVk.sol\\\";\\nimport \\\"./Transfer2In2Out24DepthVk.sol\\\";\\nimport \\\"./Transfer2In3Out24DepthVk.sol\\\";\\nimport \\\"./Transfer3In3Out24DepthVk.sol\\\";\\nimport \\\"./Mint1In2Out24DepthVk.sol\\\";\\nimport \\\"./Freeze2In2Out24DepthVk.sol\\\";\\nimport \\\"./Freeze3In3Out24DepthVk.sol\\\";\\n\\nlibrary VerifyingKeys {\\n function getVkById(uint256 encodedId)\\n external\\n pure\\n returns (IPlonkVerifier.VerifyingKey memory)\\n {\\n if (encodedId == getEncodedId(0, 1, 2, 24)) {\\n // transfer/burn-1-input-2-output-24-depth\\n return Transfer1In2Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(0, 2, 2, 24)) {\\n // transfer/burn-2-input-2-output-24-depth\\n return Transfer2In2Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(0, 2, 3, 24)) {\\n // transfer/burn-2-input-3-output-24-depth\\n return Transfer2In3Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(0, 3, 3, 24)) {\\n // transfer/burn-3-input-3-output-24-depth\\n return Transfer3In3Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(1, 1, 2, 24)) {\\n // mint-1-input-2-output-24-depth\\n return Mint1In2Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(2, 2, 2, 24)) {\\n // freeze-2-input-2-output-24-depth\\n return Freeze2In2Out24DepthVk.getVk();\\n } else if (encodedId == getEncodedId(2, 3, 3, 24)) {\\n // freeze-3-input-3-output-24-depth\\n return Freeze3In3Out24DepthVk.getVk();\\n } else {\\n revert(\\\"Unknown vk ID\\\");\\n }\\n }\\n\\n // returns (noteType, numInput, numOutput, treeDepth) as a 4*8 = 32 byte = uint256\\n // as the encoded ID.\\n function getEncodedId(\\n uint8 noteType,\\n uint8 numInput,\\n uint8 numOutput,\\n uint8 treeDepth\\n ) public pure returns (uint256 encodedId) {\\n assembly {\\n encodedId := add(\\n shl(24, noteType),\\n add(shl(16, numInput), add(shl(8, numOutput), treeDepth))\\n )\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe547ada74ff10128a51f61d3c1f5aeedd4efb5cc76399e74fa40aaaf062cd0fb\",\"license\":\"GPL-3.0-or-later\"}},\"version\":1}", + "bytecode": "0x612fe561003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c806322e6017b14610045578063b95a6ecc14610082575b600080fd5b61006f610053366004612d4d565b6000818360081b018460101b018560181b019050949350505050565b6040519081526020015b60405180910390f35b610095610090366004612da1565b6100a2565b6040516100799190612dba565b6100aa612abe565b6201021882036100c2576100bc61019c565b92915050565b6202021882036100d4576100bc61077d565b6202031882036100e6576100bc610d5d565b6203031882036100f8576100bc61133c565b6301010218820361010b576100bc61191d565b6302020218820361011e576100bc611efe565b63020303188203610131576100bc6124de565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f556e6b6e6f776e20766b20494400000000000000000000000000000000000000604482015260640160405180910390fd5b919050565b6101a4612abe565b6180008152600e60208201527f0e43a9c1f84504b3e9d9d66bba090d86342a6927ccb0831b4ad3e4314f1c650c6040820151527f22fc59364ac3ff6f432fbc0d99d55fd380644b90aedff62d7960d7abcd321dcd6020604083015101527f24a11ffd2dbff2c12e1b8d84449d8b8ce99cb171433e9f4660ba1a1e0a6a07a16060820151527f201278ccefb9424277a1cc6056c21188e47664b65867aa34d82f5a80b4ec469e6020606083015101527f25620b682e4b0c96b8e1a099b6662a4a8376d44ff983890173699f49d37b467a6080820151527f1d8fa991f3321b7560caf532d1e11e8c483b058f3b851d4bed59a9a4d57747736020608083015101527f192bec85ee4ae39d80938b36091b59b6dc1ed3fa9fde9ae7345ab160571975f360a0820151527f29decce2ba198a55fb8ded11be1c98a3944b4bdf2a16d88c3ddf41b5d4ec45fd602060a083015101527f1007d3e8d1bf392cdf90615060efe25b8498079e1c3f68a21d2843b9f27dfddb60c0820151527f159c28997f8a4aa650a8ea6cb3d8008b1d34a571f4ca3b1ce1a7d23df79024d3602060c083015101527f04c927b524846a12c4efed83946a39c74ab734ce958c4f71637e60b62f26836f60e0820151527f11abecd8cccbc86e924da099abe68dea35049684da97ee319fc0ef242ea61b49602060e083015101527f2784e8245e065a1f85ec2c85c65a9fd941373173a83e298243c014008c161811610100820151527f1b241276d42c90d21f71bead44a208fe5ad33ff0cb8e4ad27847d24936327f3c602061010083015101527f0f4e4e047e518774413e6edc7ed13b627f26722c73aefd695ad4f119f0042e4c610120820151527f16c41dbe8e8d78fd49a53850b0c169eeaabc76b461640a8f73af0d01b62fe5e3602061012083015101527f1dfe29ce2bea4467598d6e4a9c6bbf7ccd4fc743319c1f42bc51b0cea74868fe610140820151527f0996a9a7d69959d5f386951568429e50ec2360b7689c697b923df0c4c08d05ac602061014083015101527f2b36479b3f382fbc5a658c11947ef42700fccf3b60844e1dc11821c8b7d2115c610160820151527f08a24dc1195aa7a6f4e36a1755660fe66496c21eb7238ae1e609db2d8d39baf5602061016083015101527f08087ef47b82c20ef42a961ef6b65b860899ada0c6f2d8fb43b4b5d949f44da8610180820151527f16e13e860ba010b267637fa2e9f6b735c0063c782a84fc3c34b2eab30d258d9c602061018083015101527f173f59689c7dae0f41cbeae0f99c3dfe81de21fe5eee07817745c4e68fc66f156101a0820151527f2e10bcd2451be7affab48e365c6535ddfaf7f3af3141b3604ec5b388e2276d5960206101a083015101527f16e177e89964bb6637a4e504e7049c1b770163ea82ec10fd14aa87d887785d286101c0820151527f02dd7bfae0527e1b790de929718f48c5c7f1b4483645848526db85c73ba5bfa460206101c083015101527f291cd0a86c4775c29b7ff9071a039d1e2ab8cf7d56aa3ac3fa9364bc4fed2f6d6101e0820151527f0c9ef43e68125deb4e99c31f86bfe34d3e9161afc12cfaaf72f53afc5c43036f60206101e083015101527f11ebbedcb714f6c9a0cee61c167ef543bd45c4666861a282e1c2a3e2bbc48911610200820151527f1e704c699ae47d76c15f4b698e95e15605d9f6c3b0cf3a0fb9c28ea58fbfae73602061020083015101527f1ee6b2f1f34c55943ce4ec685db554f9fead0650bb9d70a40465dab0b6c5a1aa610220820151527f136a786164ad5fce4dab8c390193939ec940bd30a8704be668bbdc46cdffcb14602061022083015101527f170b5ae67c6bbb0f4f6db8a8a89a3254dfaa415ba7c0931a51e03c091b5e4739610240820151527f1c1ac9ae0b2799d5b7c79ddac85be419663b55f16550bf383cf69088ed130439602061024083015101527f079f782a6032ff962a379d098b66fb9845271c675bdad2fab3ac95e2b5be44e0610260820151527f0a4abfac66665570e746c1e589de2638c14b60bd37552a2172450d3b729bff856020610260830151015290565b610785612abe565b6180008152601b60208201527f0533f22f45fcaaf2072440bbef87e5b4617c2c007a0240df1ccc8738195823826040820151527f158c694c9dbb17304780263f0d5c14098ea97f1978d8c0eb5848bbdd750c1fb86020604083015101527f222b73a03dc4512969c7e8d04bb5605a67c4e332ff960643e05be3a3318f42986060820151527f287bdfaa69ae372c2b73c8e882eba0d65e1bbc16336c2b669aaf6e8f951d1be36020606083015101527f07f2c18596554958b7abc6f42fa238b56576e7357cf70ad371062f7a54d42a676080820151527f0d33f51fc3b7e708aac18a0776fa694c0b226b45595f19b127de0e4fb8f62c206020608083015101527f1b82a6ff4fabd0ff22f78ba31ddab995474b4dec926f722decd808387bba164a60a0820151527f1f3158096cf9912974ba9cc5824a1707a5d009a90ff71c644a1c1cfceeef5113602060a083015101527f2b824a8f4979f7260dd49adc72fc401c1443d1465fdeb0987fdbd23f96e4ec0c60c0820151527f25d6380fdc7910fb7e88160f15619a6ef0a18406ca8504b12a9ad1cabcf08066602060c083015101527f09fee964b4e39c6573d1e3d883dc7c9c618eb1d08d8c24c1ee55656a95dbdf6960e0820151527f239bed6762dd8411fbe02ec642b41ab26bc19419e26822f9c7f18d320b66a695602060e083015101527f2265b4fb0fcd978ef617f13812dcd45a43f269001340752a8cfb175cfe87ead2610100820151527e5763bb9460e8da53ce7de4e8572544032dda53316d9b9870072bac5fa4d328602061010083015101527f183fd8a9fcabcd560e33e1ae46cd6ac648da8017e4ad433374f146b89fd55889610120820151527f221baabb1d7503be0c28c1a432723b6edd7d2eff2c51af0f4c6761fff1900575602061012083015101527f290420cd26cf81afc3721aa6b968f2bf825efdf92b0bae59a81ad16059231de8610140820151527f084efd98329c65d96b873323ed9245dae7adf215c37f28d1f5c35e840a068f3e602061014083015101527f226d7fda2a5fe36ad573c7761cd2605e2d9830066a9b51debbb83de004846384610160820151527f0d4fbde67608d8127cfc9f2510139e3b607d175d71c8e35ad60b1eb1b862803f602061016083015101527f0ff7ec85d8de88b01dd268fae3f0af7993427c3dbdb3f907bd99a9d37881638e610180820151527f07170041c62ea422b4cac07bf3463d74a88f70c9e7ac674d3041b2e150b3c487602061018083015101527f076aa1a859adc2862a3d83990ebcf051a323fddd8905c8cbd3d132297a11c4d06101a0820151527f2c230924b521438db0a3678cf358b81bd314afd7865edfc898efc28a1bedf7af60206101a083015101527f27bd6161f8cd7c118efa6794d5aa8682a548f5a0c257f2875f30aa0ad828d2156101c0820151527f1aa537713dec1a7f8f5f08385d68aeee0cbf4d234f6069a4f9b5654edd4b75fa60206101c083015101527f0ae134f5cea42657316905d0465c12ce8f10e81e509a27c924f8bdbbac31ac156101e0820151527f1684bc44b9547ef8843431f84a42b371e0d7bd92d35520d6b96a28932c691fac60206101e083015101527f0cfee21bfb400da57fab05206bac008411f2d84723d4e90f4136823b70d55e17610200820151527f21bcca7789fd18c025c13a33c6d6c71d7ac01e89a11948d2cc373708565f93aa602061020083015101527f2b6dec496743634994859199d3f936a7a707db95901aa14fbafc0a10b8fc8838610220820151527f1b070572c6041e1747f95986d98c6392f2ae8b34cb39a6824fd2c79ac231e97a602061022083015101527f0eaf37d42fdf1125af20a36209fb86cf5db52079f4aa3af6073bf60c46f4ab27610240820151527f07efbeb9310ae16ce44d5d62c702aa8f0fee562fad18a711a3dc8463e0634d89602061024083015101527f1b42cedcee61d05323fedca0519afe4949f20720a84fc1322cf433d40270f624610260820151527f2d57f7cb3ad82fb7b95dfd7e5bd5696e10e61331d67e0025c0035faf72ec61de6020610260830151015290565b610d65612abe565b61800081526020808201527f18d9008ff369bcced7cd6754a30b877215c141c8b04d41655f225b96bcbe49bd6040820151527f16ccb04741387cd2bcec081b4c97ef72a2af284bd374dcc87b884523aecf09cd6020604083015101527f06c928fbd22b9db901950614fcafcf8d3f281683f4879dde67f96fe26d69bba76060820151527f1767276e1d70214a444944c44c4abf3ec92c367a342117476b9f1d2ca199a7df6020606083015101527e1c2efcae58bcb22af73dd0fe1eda780496cf27d4dbd9be663da308b1bac0806080820151527f2aeec0b635a098722ff71443a011b72e9de34ccaefdf14ac509ed71d5477f4896020608083015101527f0b17d51d75d42924b9fc927cc4826e2b6a546a7be14ee8370903680aa911781960a0820151527f0f43c92594950deaae35efa1485e8f3379c38e4339a3afb0702c73c5db88f96d602060a083015101527f21d04b103ec44a6b112f9f7464ea0e18720c227fa3c485bb9fce52212b265ff560c0820151527f0e01be2b123dc742b88c5370bd6a6c3bfe0b0813b8f5bc7b745cc2573dec5c80602060c083015101527f079f588fd5f3dabaddfbef8bda97aa4ec301fac78b72dd238a1b8edf59a0e56f60e0820151527f16f99ebdb7bf17291ee254cf830a8a4d47d877fb4f358c7cb65dc00e7c043771602060e083015101527f2f28f07a5b1814470bea772a8f1ef3efd7b5ea6e55cd7ad8c59da0e99ff69fa1610100820151527f2722663eff7d2170b427f857aabea8a5d9c93cfbcc58c76c987cf568333a7e75602061010083015101527f2a8489e5cb999c94662a738eca14c8a57d853bc63557e47281230d2eb675b7f2610120820151527f03f36103e63eaa846647052721eec6e910ce1bcaf9f5694baeb6ee058e05aff3602061012083015101527f01f877dfb2305eac19a42e8cc2c897e5c93784a6c2ffb3740ccf24855d64725f610140820151527f2a2eebe723c834ce42ded9b187173193dc50ef74a66c3f4c7de54911df669d88602061014083015101527f1303eab5c3dd3b94a20d43e1962c86961bb8df59e2ee946abac269749663d8b0610160820151527f24e858254b75f8560135086d6e56a62a4b5924269282c24cd67475b2f1c3a99a602061016083015101527f143f106b6b9fab414a725e381d2d329cef77f58bd635230288a4687816fdde48610180820151527f11c13f76a86f631dcf8f986deca4d8aa6b364bce7d60d14d5c06814aed09bd51602061018083015101527f1e287dbe7f1530200f3561e3b75c7443c7334135db9952f03ba69876a8631f976101a0820151527f0f419a8b33c8ce164129d232bc7fa21450f11e0decd961c1506b0451ecf8306560206101a083015101527f0b9cf2ec3428af666ed3244d66346bb88962b2e2475c82b38b12509b483740306101c0820151527f1454429b1ac5f2a8e70937b80962fd5428fb973fc1bd2b49276a11e61f8172fe60206101c083015101527f211d0c158778541083dc84fb5dfb83fa6f3e0110f3827158229538063d76ed556101e0820151527f0b44668f586037d69d8e7ba7411352b6503dec8a885251e2be45e8fa9ad8e38560206101e083015101527f07d6b84c45fa960b89c8a0c0b8a4b1cbf00b4e98515d39e8dce218e807bb0dcd610200820151527f044add0f763d8e78c49467e8ad19c3ccd1f9124191cbae5251ceb431b1782d20602061020083015101527f2975625a3cb953129efffdf246dd1afc27118addc8baa8e31a3e589cea7eadd4610220820151527f18692d641c182409ae193fdbb8acbfe8f4cb4a4005cdfa7d1173ca44e60e9da0602061022083015101527f204220ef3bb60d1b617758293b440a2fd23510ab1ad836b14077d678127ed242610240820151527f291998714fb82bce0860e2ed473ec019d0b0666996cc7689ff2bb5ca6675e63b602061024083015101527f2ffc5cec2fcb693854bbc6b76dc9e182739c518287698ad8fc4e3ddbab17f66a610260820151527f2e3047816681474370f0a73f7b2078c0bed0fd0ae08e013cae949ba5168f42de6020610260830151015290565b611344612abe565b620100008152602d60208201527f0ee9db604936e0b1e77ed5081cb6386d75797088cf2b97e4049841c28f9be6f06040820151527f22a75f79e7a4f15a403c7194653d1ac00bc9758a16ccc90fdc6c5db0ffaaa9ad6020604083015101527f08952948eda2cbde138abd644a34cbd46c1e3cdb8992f9a3446d036f6e3745c36060820151527f10dee4433d114dea7180d068a6ffd0f9896a6610daf22442e8c66d5c69b69adb6020606083015101527f2eed0d2c5dea737bdfed99ccd0d22525c13b16052dc1ecd7a54ed162594c258d6080820151527f242ec9babc61d1959256d7e1f942870450465529d064d09996bf65ee6d7675266020608083015101527f29997ea86edbc6a227b048c46f54dde90acf46c87729b77ef1185351be9c758760a0820151527f1a455be906e3af30d0932628eccb25ac63934759d4cc22da166f6bcf40718728602060a083015101527f2f8e4896af3325c41a0127b1fc73580e81cfd37c790f093dcb61c790fddec94260c0820151527f07955e8e3ad08d1202478bcbf8019864cbf88095b4683518c0204c9f9fcfb349602060c083015101527f2bedcb2cbf50eb062802d6a9528c27d50015c8fb07188d4d5de58779b690b84860e0820151527f0fced1d0f52d3ae1d9c352cb56d5f37d5a6310337a629a69e7415cb723dac3d2602060e083015101527f2184d15f3d8a639220414e70e297ff4b2aeaae29dfbc2e2807d8c4a4755f1d34610100820151527f206867ce15238c6d6d57fdb7b71dfb138f088ef95cfca740a9ee4f35ad801965602061010083015101527f1234f5d9dd9e6fd062b538d3e81a795757a7ed2945ca04e44991534993dadf60610120820151527f02e8b4e01521b2481e6bb1f28d260fe01b96332c6fb725d930f22c2d801301d2602061012083015101527f0f85ca72bcccb58ec088b37767100e478cfc1c84f91193b569ebcfa844ebffca610140820151527f0e8eb0ee40d2ac89cc9bda611eac915eb0f5bcca36caa8e0f56b400d742ca732602061014083015101527f2a72ab666854284c4db7b49917d0c08c0bc94549b34804196632adbf3fcfcd77610160820151527f20ce6f2ef30257e84b7afbd63e996b5facb05233073b3445c1dedf9b4746fb88602061016083015101527f16a84f2bc78f5de42849ba39b01a62d5d46297c4b41a5a0bec2b3193081f303b610180820151527f07876d6ac372c528f50629d14cebe6016c90b1e4b2f1bcabab26ba227cca85d3602061018083015101527f1478dd951d6bfe3868f0cf3a2eb95ed340fe47c0f6d11bb2e9d960854e5524956101a0820151527f099ddde683662eb763546ca9bdf762792cb51c9e3772c117d35ca554d43d15b860206101a083015101527e6ee3b355c1d3f7a3c7c759550f88937f5f882099238e7bdee8b62c1227dfeb6101c0820151527f06094324093967c2811537678ce7ffff947e5f29bd715f2ccff7a911e0e38e4360206101c083015101527f2cb3c484e36265190711c6cddc5030aab4770b6efe5b110f3c04af12d604e4d36101e0820151527f0a6b6897ac3ae3cacb9916a8ac7965f21b1d8c98cf902f40c06e94b1c857b33660206101e083015101527f2d8e97da0a7bcb965970198941a0762947c3cf494bad6fcbab54828c77f5b0c4610200820151527f07962e2e2760e20506058bce20bca54c270b15e97d2132e1c6e6d19b32f09d5c602061020083015101527f256c3b17f2c9d4d96a6cd1c3aa9a2a3d3a2f4d82f737302c7d717ad2a991de70610220820151527f27c19554c1f87fd43b19bf44b5539873234c24c41556a6d44c93e67b49bf7ea3602061022083015101527f061f427c839bb22f0d9f1d6f0b5b6c27058d6c8fe0dd1f78ee0f578a31474d27610240820151527f02b80ab4ee786884d840e634a684dfb605f1b6fe50df1d184c5cf02e28d652f0602061024083015101527f0aa453e221c951b1deeaeb50bcf594ea778cc1516fb3fac9937d78804fe6ebe2610260820151527f0d1210627c2faf65c31d1a32ebd6d61f86a79b14c8c98f0cb3c8112be8bbf5f76020610260830151015290565b611925612abe565b6140008152601660208201527f2960ccbfa831a793352828ed96d1bdd8bb2641a95baf9fb57edb83f2cca50f456040820151527f1aa7d3d401d969fa5991bc2632cdd9662376b73d711da7dac798add1a71af5ba6020604083015101527f20c63270d438c7a1d5f2efa6fc8433880b20b0d5e8a5a8f0007dc717d21f16e06060820151527f225e5d18c26d8fb7f3b40486988726a589f7d287760c5cda3d56b02ee8b885fa6020606083015101527f1c25749f104c4c40bb85df869a45c24db6100a94d15c00272f06c12df488687d6080820151527f1ec81f81dc7db4bcdda5b8df435b0cf41ff63d2a4f07c7acecfe7f76fae18dcf6020608083015101527f18c618ce1b1e3ad035d7095b05552e02d3ae458a8e09ff4566b631e565be2a3260a0820151527f2fd002e84c76c7b0965a8d760b939a359e1e4335208372002ec024387d536258602060a083015101527f02de94c4a1f57b5649a43fa5af3ab5a16515c87115e202d6847550b705abc99560c0820151527f0b287ff4c028444fa5db9da160d292b93fa6bb42fd5d4517b44957b0c1d27acb602060c083015101527f078d7586574326613d2fb3fa445b97a597b714e990ddd239df94fb31a3399b6d60e0820151527f1dc0b27e9a7acd6fd3dadae3aa6e0b399e263e45856d2b24ed0fee99eb5fb401602060e083015101527f2031141beab16ef28e125b9f5dfac68b76653fe6b84517f54680ccf9df6bc78d610100820151527f0218f2e0d088f3484260384fa109ae07933f88dd91914c2ec2420e0dee3f7de5602061010083015101527f08064480d001be521821d062356588eda5f261272033a191e4a2d6d4357f2e91610120820151527f19fd20b1228ef31c7f5894581eda8a6bc76d8b63ce53e8c7b01a4935cb25a775602061012083015101527f18546a166f8d6c476d8a7d67acac1708df0147e8f1414e2cf9c917cac2689ab9610140820151527f06cc6ff643d568ae6ca2ba7ae4d62e534850d1a4def63d81b41d01042666035c602061014083015101527f0b4faccf5dc34066b8c1f8f35854050a7874d0a2818c74fe1adeb59e7ec2c6bf610160820151527f0cf6211dcca044fbe21e36a09ed22a39e0628221cd3b890167a3e15e8213b6ba602061016083015101527f26e43e5e6b83059e5c7de162cbeb6ff59b2a131f3c19cb8e24bfaa29369b37b3610180820151527f303fde21c1632dd69563ef7f34c003ebf7eff104aabdba74e602d07db9a9f996602061018083015101527f0970ed4d40373e01ba957d0ffbdec21cedcf141cbeef56fdd60db26481e6682c6101a0820151527f079509aa4eb8f12b9cebeab63f99b3c675fa24ec587a104a91da2f928d0dd83e60206101a083015101527f281b216a2154f4b3a41ebcf4a1661ecea487ecfeffb10a3af1c95e646cf9067c6101c0820151527f14ff18a5a0a146561af17c7e25e1e7aedca96f63e0e45e6db06e6fda83a017f660206101c083015101527f05ec99c9a5750e772e09b59c2900a27e133c89e37e53dbeb8e25aeaf71ca5d8d6101e0820151527f11eab6996efe30a8d9060d724aca0b8f1039d78f2bb3fa80866678a5c2ff5e7660206101e083015101527f21f55defa3da3d5cb88371ec2e3cf363e946e56ccc6e5d9521817596609250a3610200820151527f2475e54f88b4653c0c2ad0a68d81c9fd036236afde52118e681ae3bf8cad6e23602061020083015101527f1ac0e2768b54bc5994bb1224cc1b418e961b5d78298c4f0a3b8ff84cf60f3309610220820151527f01beea794b532e5f28169b659ca8942272ef94b4173aa265c75e8f58f47b8484602061022083015101527f14b8a58d9a83070b9412f50ffe8303ef7a9635202eba89f81ad07e14db58ed84610240820151527f0b364323368f55e1034dd161810931cbdc0af799e8ec0f730e829e0ebdd423ea602061024083015101527f1e523d197e5d7c2f0c2552e6f07966c391a25410c770ffb2597825e45827d99d610260820151527f0407d96a0a3a4123a33c4f08dcfc5b095dff98909bb5f7408fdd7f9d08468eed6020610260830151015290565b611f06612abe565b6180008152600760208201527f0b50c36923c6944a1fd8b9d260fc6786910299e5cd838b082a5d4b959c5369d86040820151527f2f6929bc105c2e4941e799e34147419a7f1e1e4d7d39bc84772d77203340c5ce6020604083015101527f13765dbb447c8ea8d3c358686bc464642b658c768d7b7d5c52d24090aa3120bc6060820151527f0561337e6621272cf83f4be0bd99d884f88724b1056e75d2231eaf34f3d804ad6020606083015101527f07358c9dccb7c0836af2ba0d84da7e125cb0e22f81ae70e8da68096d2f3066ed6080820151527f07fd263887d67d02c6997ac3385d290fe95a30133ab6c42c47a8354e30d55e056020608083015101527f0669063c49e18373adb984bbe5c4d448001c0ae449b68b03dcd130d6e1a4492360a0820151527f12866290a8990a143b6d6d7e3329183b1c4ad82ee250f57a8e1f615ef67480e8602060a083015101527f19f089ba3858226bac8a3053cc4486250d544430f238ca1542bc27497d9f9c4260c0820151527f1d1c0f1cda207c95080375a6863553ada605e24b80d9357e11e037f7a87ed73d602060c083015101527f07b7e66feeda9acbabe16f98ddd329f47a8860e2aae0addf0a16c66f881c4b9b60e0820151527f15ba6adb189f8d6cd44f9042bfbb7952409c3b2f0672940978440f52b66bd2e6602060e083015101527f1db45b81750780476089df0ef4ee6e1fa97c25b40706be930349c27de04d8980610100820151527f27c17411029c4cbd0e6a2d50bca1ad65466295a2ce33e408958ecaf4f4604ccc602061010083015101527f14d3c7e4a751138c29243664e5053dcd9a9ec44989c247894a8e586e6a6d94c9610120820151527f1f112a8320a2c479f950604f0504fbb37d30a9633e77543c758d7089b406ff92602061012083015101527f0d405e091ca140684368ee442484b1e8b973c621f4cf1ee8adccc9d7febed1ae610140820151527f1189e58196d34f3615ea805405e60b9581018f619000791d69d36a26177e7ffd602061014083015101527f2d2aa260acf145ec8ecd374a1d31515887737b2b95b7325decd82191ae3fe40a610160820151527f2b89b57f056713d19aac051d2b5c08f236835c77b33f890751b6c2cdd570aeec602061016083015101527f0b4f9e7c5cec4c89df8d1aa6ba509d027260a677d417a1e57764efbf98b66ae1610180820151527f2bde8594d8bf90d47542af98857a6a39ad4b13190e190a424ec6b3b0a29b2254602061018083015101527f071fde310bde93132ebc32f5feab394d5996ead1274d1afd18a88a0649dd9cff6101a0820151527f0830200a720e589651bcc1dd20a71e3712866f0636b1b7704e5a5949f768950060206101a083015101527f1fd0b7edc94f5166e68e5e52348eb514fe688626149ad57616aedd7ed1af233d6101c0820151527f1b1b83855b78e077da0d8dc06560314a9e20a8c7d52a76667cb2d44e36c94cff60206101c083015101527e7810407438091255399e5ec6e09b3792600687cf33b75811c285455afcd8ce6101e0820151527f048cf15864a37e55e19e326830010346a2624a4cce2e27e203cf30ab95481ad260206101e083015101527f1099393bb6c289d29cf9ae8d964f85399a0a233655d53ee01b5a54daa97f51a8610200820151527f22da9db142456e54f6c0792a4e0ab59cd7cda9db011349b499993b1eb2019328602061020083015101527f2876d88cba11d74ce75506378ba17971ba6b0ad5c558bb2074efbb2ccf2b227b610220820151527f12522bed77d00f4e9b6cfb7ee67f7aee83e4a234b94d17e81fde44c17c9ca13a602061022083015101527f07ac1f7330524e548ca80d43b5adbc60ef3358dbe26c0a6f34f95e33c6da53f8610240820151527f155bdf24d80bd533d322b67aeac75a62889fb0e0dfbfd1e62b284f7767385438602061024083015101527f068dbe6e8cf3d48579fba32c6f10d5b9b2d392a9f1ec35c2beea28feb596099f610260820151527f1c5312119a55f63257c803b4ce1657007f27129c2caefd028d4ae140643a895e6020610260830151015290565b6124e6612abe565b6180008152600960208201527f1edd7e8380fa133b1caaf53e19bbb36e4f67e6fa317f6c0923ebdd406181c3756040820151527f2347e3ab0314a024f6f41faade3c0a97d3c4573c10a9ba5d5aab5e24a8ee3a2d6020604083015101527f1644e1e336c01d9de5b481f81522fcaef5cef40e319fe07f2bc376e648932d4d6060820151527f22827063aa139c74a19f16936a01b44d555a22a90c3d57fd7b15967bc45403626020606083015101527f0e840efe2c1615d356b2b2f467f7f49f0cc6b75db5dc73b5591124dcfc0b16006080820151527f1540096182590988e27101f66661809800bfee896d5230f59381632c350b89546020608083015101527f2a46e5174dc5d55be95f6f451b089f2b3b792478d411e6313d85505ca516d5d160a0820151527f12dc6ab5a4a2bef6fd1972faa6aa6be0efb94eb8c59e46687149ff9678c5ed81602060a083015101527f29d1539594e7b749f9eb84c7da6b2f9e91d4a976ea856819f95bdf2b4955080760c0820151527f12d706c75de12ebc0fe0bf0a72e84a7cd6a3217eee90331dded2ba12810b91d0602060c083015101527f20587a04ac2c473abdea8a7eb923d2d19e48aaba464f594034c5494df99719bd60e0820151527f1a5ecd9b9d63611e9a4ccedc8eafdef1a85961406b180e43859ce1f3abceee5a602060e083015101527f1c220bd0f159e539302773922e23c0abfa5bdc4667b423a0a08d1d7eb316cf2a610100820151527f0797380c9433b8481a319aada22999d0bee4823c75fbb447d16e0cb9d8e43091602061010083015101527f152695e50f8d7f189c67af3300f448b9140d65ab361f404fe055fe8f74cc994c610120820151527e932a307c4ae6e70d89b73e7edca162fec708fd4f15f19944139d97c6178f71602061012083015101527f2970199168a67327b37350a8b5bae9dbc9a02718dd6f00274945d3f179b54728610140820151527f2973a64d7b98c27f60ec6c96e4fcb63bcd39d247031d04513873bad8c3a061d4602061014083015101527f2ded3bbfc595e96ac35de63c912c713d3c9af7b56a08bda4ddb3a2d581fed18f610160820151527f1de5065a0cd9a3f5f70bfbe4353d9c02ff142e652d129233be149c327f2c9dcd602061016083015101527f1791e6fe9df2f1afd69622868dcb1e65f0ad57cbac90bd57a26647366195ce8b610180820151527f21789ab824cfae26033c42fa151b3f0e0e40ad8f61679731a5a4ca26e3a0cda5602061018083015101527f262378469faedbe48fe5052bc079852e6d951097a728bd85f91463163668a7ce6101a0820151527f18e40a1137e63ff15e99c7d56382d255aea3bebcd0e3693315655f2779b9212460206101a083015101527f29e67f1e1d585638a82e01f00bf8f11e3b6be7b88d9d22ca9f6b6ca4a7470cc96101c0820151527f2602e8811f78f7aa4a9f38b6b1a2930ae66182183cbd84fb014b3a9abdbc0b4760206101c083015101527f202751a50df1526007632280f56285499e2f3af307ef74f4a98c483001909d556101e0820151527f27e9075da78fb1345d429966c80d5418f67aa25eaeb88b924fb40318a8184eb160206101e083015101527f25fd490d4c3a7bf6f5c9ebfdfd92b3e27491db705ef86f50c3cb04f528431804610200820151527f09ed7a29b8555d0f94d6fb108ac8f142488076c24f9d5e239ecc048f05053ecc602061020083015101527f02b37d0d38042045bcf65eab3d9cee1c05d89b2331786f7fc59e60a9907a793b610220820151527f0cf03ac0b56e935b8f0beeb42919771651ea29f49036be6397378f306c9450f4602061022083015101527f233ef9f6cdb1b60f174a71d16995cdf2223b3657a127b73671cfae10ab917ee5610240820151527f1ecdbf35c77e6a976548cf263c7f6f2fe1d290e0628fc8f4d029d46818b9551f602061024083015101527f18e17e60f5b3cbf99034e926d3b01a7834433239040f172d435e7ba1a63654a6610260820151527f2f9e8a016bd92a9e13329c9de40d1a26317d3f7517f3cecfa325f8c2eeb5316c6020610260830151015290565b6040518061028001604052806000815260200160008152602001612af5604051806040016040528060008152602001600081525090565b8152602001612b17604051806040016040528060008152602001600081525090565b8152602001612b39604051806040016040528060008152602001600081525090565b8152602001612b5b604051806040016040528060008152602001600081525090565b8152602001612b7d604051806040016040528060008152602001600081525090565b8152602001612b9f604051806040016040528060008152602001600081525090565b8152602001612bc1604051806040016040528060008152602001600081525090565b8152602001612be3604051806040016040528060008152602001600081525090565b8152602001612c05604051806040016040528060008152602001600081525090565b8152602001612c27604051806040016040528060008152602001600081525090565b8152602001612c49604051806040016040528060008152602001600081525090565b8152602001612c6b604051806040016040528060008152602001600081525090565b8152602001612c8d604051806040016040528060008152602001600081525090565b8152602001612caf604051806040016040528060008152602001600081525090565b8152602001612cd1604051806040016040528060008152602001600081525090565b8152602001612cf3604051806040016040528060008152602001600081525090565b8152602001612d15604051806040016040528060008152602001600081525090565b8152602001612d37604051806040016040528060008152602001600081525090565b905290565b803560ff8116811461019757600080fd5b60008060008060808587031215612d6357600080fd5b612d6c85612d3c565b9350612d7a60208601612d3c565b9250612d8860408601612d3c565b9150612d9660608601612d3c565b905092959194509250565b600060208284031215612db357600080fd5b5035919050565b60006104c08201905082518252602083015160208301526040830151612ded604084018280518252602090810151910152565b50606083015180516080840152602081015160a0840152506080830151805160c0840152602081015160e08401525060a0830151610100612e3a8185018380518252602090810151910152565b60c08501519150610140612e5a8186018480518252602090810151910152565b60e08601519250610180612e7a8187018580518252602090810151910152565b9186015192506101c091612e9a8684018580518252602090810151910152565b6101208701519350610200612ebb8188018680518252602090810151910152565b91870151935061024091612edb8784018680518252602090810151910152565b61016088015180516102808901526020908101516102a08901529188015180516102c08901528201516102e08801526101a088015180516103008901528201516103208801529287015180516103408801528101516103608701526101e087015180516103808801528101516103a08701529186015180516103c08701528201516103e0860152610220860151805161040087015282015161042086015285015180516104408601529081015161046085015290505061026092909201518051610480830152602001516104a0909101529056fea264697066735822122001744a823532336746c68b1ac624f1978215eddb05a58dd61de7d93eefd43c6a64736f6c634300080d0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c806322e6017b14610045578063b95a6ecc14610082575b600080fd5b61006f610053366004612d4d565b6000818360081b018460101b018560181b019050949350505050565b6040519081526020015b60405180910390f35b610095610090366004612da1565b6100a2565b6040516100799190612dba565b6100aa612abe565b6201021882036100c2576100bc61019c565b92915050565b6202021882036100d4576100bc61077d565b6202031882036100e6576100bc610d5d565b6203031882036100f8576100bc61133c565b6301010218820361010b576100bc61191d565b6302020218820361011e576100bc611efe565b63020303188203610131576100bc6124de565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f556e6b6e6f776e20766b20494400000000000000000000000000000000000000604482015260640160405180910390fd5b919050565b6101a4612abe565b6180008152600e60208201527f0e43a9c1f84504b3e9d9d66bba090d86342a6927ccb0831b4ad3e4314f1c650c6040820151527f22fc59364ac3ff6f432fbc0d99d55fd380644b90aedff62d7960d7abcd321dcd6020604083015101527f24a11ffd2dbff2c12e1b8d84449d8b8ce99cb171433e9f4660ba1a1e0a6a07a16060820151527f201278ccefb9424277a1cc6056c21188e47664b65867aa34d82f5a80b4ec469e6020606083015101527f25620b682e4b0c96b8e1a099b6662a4a8376d44ff983890173699f49d37b467a6080820151527f1d8fa991f3321b7560caf532d1e11e8c483b058f3b851d4bed59a9a4d57747736020608083015101527f192bec85ee4ae39d80938b36091b59b6dc1ed3fa9fde9ae7345ab160571975f360a0820151527f29decce2ba198a55fb8ded11be1c98a3944b4bdf2a16d88c3ddf41b5d4ec45fd602060a083015101527f1007d3e8d1bf392cdf90615060efe25b8498079e1c3f68a21d2843b9f27dfddb60c0820151527f159c28997f8a4aa650a8ea6cb3d8008b1d34a571f4ca3b1ce1a7d23df79024d3602060c083015101527f04c927b524846a12c4efed83946a39c74ab734ce958c4f71637e60b62f26836f60e0820151527f11abecd8cccbc86e924da099abe68dea35049684da97ee319fc0ef242ea61b49602060e083015101527f2784e8245e065a1f85ec2c85c65a9fd941373173a83e298243c014008c161811610100820151527f1b241276d42c90d21f71bead44a208fe5ad33ff0cb8e4ad27847d24936327f3c602061010083015101527f0f4e4e047e518774413e6edc7ed13b627f26722c73aefd695ad4f119f0042e4c610120820151527f16c41dbe8e8d78fd49a53850b0c169eeaabc76b461640a8f73af0d01b62fe5e3602061012083015101527f1dfe29ce2bea4467598d6e4a9c6bbf7ccd4fc743319c1f42bc51b0cea74868fe610140820151527f0996a9a7d69959d5f386951568429e50ec2360b7689c697b923df0c4c08d05ac602061014083015101527f2b36479b3f382fbc5a658c11947ef42700fccf3b60844e1dc11821c8b7d2115c610160820151527f08a24dc1195aa7a6f4e36a1755660fe66496c21eb7238ae1e609db2d8d39baf5602061016083015101527f08087ef47b82c20ef42a961ef6b65b860899ada0c6f2d8fb43b4b5d949f44da8610180820151527f16e13e860ba010b267637fa2e9f6b735c0063c782a84fc3c34b2eab30d258d9c602061018083015101527f173f59689c7dae0f41cbeae0f99c3dfe81de21fe5eee07817745c4e68fc66f156101a0820151527f2e10bcd2451be7affab48e365c6535ddfaf7f3af3141b3604ec5b388e2276d5960206101a083015101527f16e177e89964bb6637a4e504e7049c1b770163ea82ec10fd14aa87d887785d286101c0820151527f02dd7bfae0527e1b790de929718f48c5c7f1b4483645848526db85c73ba5bfa460206101c083015101527f291cd0a86c4775c29b7ff9071a039d1e2ab8cf7d56aa3ac3fa9364bc4fed2f6d6101e0820151527f0c9ef43e68125deb4e99c31f86bfe34d3e9161afc12cfaaf72f53afc5c43036f60206101e083015101527f11ebbedcb714f6c9a0cee61c167ef543bd45c4666861a282e1c2a3e2bbc48911610200820151527f1e704c699ae47d76c15f4b698e95e15605d9f6c3b0cf3a0fb9c28ea58fbfae73602061020083015101527f1ee6b2f1f34c55943ce4ec685db554f9fead0650bb9d70a40465dab0b6c5a1aa610220820151527f136a786164ad5fce4dab8c390193939ec940bd30a8704be668bbdc46cdffcb14602061022083015101527f170b5ae67c6bbb0f4f6db8a8a89a3254dfaa415ba7c0931a51e03c091b5e4739610240820151527f1c1ac9ae0b2799d5b7c79ddac85be419663b55f16550bf383cf69088ed130439602061024083015101527f079f782a6032ff962a379d098b66fb9845271c675bdad2fab3ac95e2b5be44e0610260820151527f0a4abfac66665570e746c1e589de2638c14b60bd37552a2172450d3b729bff856020610260830151015290565b610785612abe565b6180008152601b60208201527f0533f22f45fcaaf2072440bbef87e5b4617c2c007a0240df1ccc8738195823826040820151527f158c694c9dbb17304780263f0d5c14098ea97f1978d8c0eb5848bbdd750c1fb86020604083015101527f222b73a03dc4512969c7e8d04bb5605a67c4e332ff960643e05be3a3318f42986060820151527f287bdfaa69ae372c2b73c8e882eba0d65e1bbc16336c2b669aaf6e8f951d1be36020606083015101527f07f2c18596554958b7abc6f42fa238b56576e7357cf70ad371062f7a54d42a676080820151527f0d33f51fc3b7e708aac18a0776fa694c0b226b45595f19b127de0e4fb8f62c206020608083015101527f1b82a6ff4fabd0ff22f78ba31ddab995474b4dec926f722decd808387bba164a60a0820151527f1f3158096cf9912974ba9cc5824a1707a5d009a90ff71c644a1c1cfceeef5113602060a083015101527f2b824a8f4979f7260dd49adc72fc401c1443d1465fdeb0987fdbd23f96e4ec0c60c0820151527f25d6380fdc7910fb7e88160f15619a6ef0a18406ca8504b12a9ad1cabcf08066602060c083015101527f09fee964b4e39c6573d1e3d883dc7c9c618eb1d08d8c24c1ee55656a95dbdf6960e0820151527f239bed6762dd8411fbe02ec642b41ab26bc19419e26822f9c7f18d320b66a695602060e083015101527f2265b4fb0fcd978ef617f13812dcd45a43f269001340752a8cfb175cfe87ead2610100820151527e5763bb9460e8da53ce7de4e8572544032dda53316d9b9870072bac5fa4d328602061010083015101527f183fd8a9fcabcd560e33e1ae46cd6ac648da8017e4ad433374f146b89fd55889610120820151527f221baabb1d7503be0c28c1a432723b6edd7d2eff2c51af0f4c6761fff1900575602061012083015101527f290420cd26cf81afc3721aa6b968f2bf825efdf92b0bae59a81ad16059231de8610140820151527f084efd98329c65d96b873323ed9245dae7adf215c37f28d1f5c35e840a068f3e602061014083015101527f226d7fda2a5fe36ad573c7761cd2605e2d9830066a9b51debbb83de004846384610160820151527f0d4fbde67608d8127cfc9f2510139e3b607d175d71c8e35ad60b1eb1b862803f602061016083015101527f0ff7ec85d8de88b01dd268fae3f0af7993427c3dbdb3f907bd99a9d37881638e610180820151527f07170041c62ea422b4cac07bf3463d74a88f70c9e7ac674d3041b2e150b3c487602061018083015101527f076aa1a859adc2862a3d83990ebcf051a323fddd8905c8cbd3d132297a11c4d06101a0820151527f2c230924b521438db0a3678cf358b81bd314afd7865edfc898efc28a1bedf7af60206101a083015101527f27bd6161f8cd7c118efa6794d5aa8682a548f5a0c257f2875f30aa0ad828d2156101c0820151527f1aa537713dec1a7f8f5f08385d68aeee0cbf4d234f6069a4f9b5654edd4b75fa60206101c083015101527f0ae134f5cea42657316905d0465c12ce8f10e81e509a27c924f8bdbbac31ac156101e0820151527f1684bc44b9547ef8843431f84a42b371e0d7bd92d35520d6b96a28932c691fac60206101e083015101527f0cfee21bfb400da57fab05206bac008411f2d84723d4e90f4136823b70d55e17610200820151527f21bcca7789fd18c025c13a33c6d6c71d7ac01e89a11948d2cc373708565f93aa602061020083015101527f2b6dec496743634994859199d3f936a7a707db95901aa14fbafc0a10b8fc8838610220820151527f1b070572c6041e1747f95986d98c6392f2ae8b34cb39a6824fd2c79ac231e97a602061022083015101527f0eaf37d42fdf1125af20a36209fb86cf5db52079f4aa3af6073bf60c46f4ab27610240820151527f07efbeb9310ae16ce44d5d62c702aa8f0fee562fad18a711a3dc8463e0634d89602061024083015101527f1b42cedcee61d05323fedca0519afe4949f20720a84fc1322cf433d40270f624610260820151527f2d57f7cb3ad82fb7b95dfd7e5bd5696e10e61331d67e0025c0035faf72ec61de6020610260830151015290565b610d65612abe565b61800081526020808201527f18d9008ff369bcced7cd6754a30b877215c141c8b04d41655f225b96bcbe49bd6040820151527f16ccb04741387cd2bcec081b4c97ef72a2af284bd374dcc87b884523aecf09cd6020604083015101527f06c928fbd22b9db901950614fcafcf8d3f281683f4879dde67f96fe26d69bba76060820151527f1767276e1d70214a444944c44c4abf3ec92c367a342117476b9f1d2ca199a7df6020606083015101527e1c2efcae58bcb22af73dd0fe1eda780496cf27d4dbd9be663da308b1bac0806080820151527f2aeec0b635a098722ff71443a011b72e9de34ccaefdf14ac509ed71d5477f4896020608083015101527f0b17d51d75d42924b9fc927cc4826e2b6a546a7be14ee8370903680aa911781960a0820151527f0f43c92594950deaae35efa1485e8f3379c38e4339a3afb0702c73c5db88f96d602060a083015101527f21d04b103ec44a6b112f9f7464ea0e18720c227fa3c485bb9fce52212b265ff560c0820151527f0e01be2b123dc742b88c5370bd6a6c3bfe0b0813b8f5bc7b745cc2573dec5c80602060c083015101527f079f588fd5f3dabaddfbef8bda97aa4ec301fac78b72dd238a1b8edf59a0e56f60e0820151527f16f99ebdb7bf17291ee254cf830a8a4d47d877fb4f358c7cb65dc00e7c043771602060e083015101527f2f28f07a5b1814470bea772a8f1ef3efd7b5ea6e55cd7ad8c59da0e99ff69fa1610100820151527f2722663eff7d2170b427f857aabea8a5d9c93cfbcc58c76c987cf568333a7e75602061010083015101527f2a8489e5cb999c94662a738eca14c8a57d853bc63557e47281230d2eb675b7f2610120820151527f03f36103e63eaa846647052721eec6e910ce1bcaf9f5694baeb6ee058e05aff3602061012083015101527f01f877dfb2305eac19a42e8cc2c897e5c93784a6c2ffb3740ccf24855d64725f610140820151527f2a2eebe723c834ce42ded9b187173193dc50ef74a66c3f4c7de54911df669d88602061014083015101527f1303eab5c3dd3b94a20d43e1962c86961bb8df59e2ee946abac269749663d8b0610160820151527f24e858254b75f8560135086d6e56a62a4b5924269282c24cd67475b2f1c3a99a602061016083015101527f143f106b6b9fab414a725e381d2d329cef77f58bd635230288a4687816fdde48610180820151527f11c13f76a86f631dcf8f986deca4d8aa6b364bce7d60d14d5c06814aed09bd51602061018083015101527f1e287dbe7f1530200f3561e3b75c7443c7334135db9952f03ba69876a8631f976101a0820151527f0f419a8b33c8ce164129d232bc7fa21450f11e0decd961c1506b0451ecf8306560206101a083015101527f0b9cf2ec3428af666ed3244d66346bb88962b2e2475c82b38b12509b483740306101c0820151527f1454429b1ac5f2a8e70937b80962fd5428fb973fc1bd2b49276a11e61f8172fe60206101c083015101527f211d0c158778541083dc84fb5dfb83fa6f3e0110f3827158229538063d76ed556101e0820151527f0b44668f586037d69d8e7ba7411352b6503dec8a885251e2be45e8fa9ad8e38560206101e083015101527f07d6b84c45fa960b89c8a0c0b8a4b1cbf00b4e98515d39e8dce218e807bb0dcd610200820151527f044add0f763d8e78c49467e8ad19c3ccd1f9124191cbae5251ceb431b1782d20602061020083015101527f2975625a3cb953129efffdf246dd1afc27118addc8baa8e31a3e589cea7eadd4610220820151527f18692d641c182409ae193fdbb8acbfe8f4cb4a4005cdfa7d1173ca44e60e9da0602061022083015101527f204220ef3bb60d1b617758293b440a2fd23510ab1ad836b14077d678127ed242610240820151527f291998714fb82bce0860e2ed473ec019d0b0666996cc7689ff2bb5ca6675e63b602061024083015101527f2ffc5cec2fcb693854bbc6b76dc9e182739c518287698ad8fc4e3ddbab17f66a610260820151527f2e3047816681474370f0a73f7b2078c0bed0fd0ae08e013cae949ba5168f42de6020610260830151015290565b611344612abe565b620100008152602d60208201527f0ee9db604936e0b1e77ed5081cb6386d75797088cf2b97e4049841c28f9be6f06040820151527f22a75f79e7a4f15a403c7194653d1ac00bc9758a16ccc90fdc6c5db0ffaaa9ad6020604083015101527f08952948eda2cbde138abd644a34cbd46c1e3cdb8992f9a3446d036f6e3745c36060820151527f10dee4433d114dea7180d068a6ffd0f9896a6610daf22442e8c66d5c69b69adb6020606083015101527f2eed0d2c5dea737bdfed99ccd0d22525c13b16052dc1ecd7a54ed162594c258d6080820151527f242ec9babc61d1959256d7e1f942870450465529d064d09996bf65ee6d7675266020608083015101527f29997ea86edbc6a227b048c46f54dde90acf46c87729b77ef1185351be9c758760a0820151527f1a455be906e3af30d0932628eccb25ac63934759d4cc22da166f6bcf40718728602060a083015101527f2f8e4896af3325c41a0127b1fc73580e81cfd37c790f093dcb61c790fddec94260c0820151527f07955e8e3ad08d1202478bcbf8019864cbf88095b4683518c0204c9f9fcfb349602060c083015101527f2bedcb2cbf50eb062802d6a9528c27d50015c8fb07188d4d5de58779b690b84860e0820151527f0fced1d0f52d3ae1d9c352cb56d5f37d5a6310337a629a69e7415cb723dac3d2602060e083015101527f2184d15f3d8a639220414e70e297ff4b2aeaae29dfbc2e2807d8c4a4755f1d34610100820151527f206867ce15238c6d6d57fdb7b71dfb138f088ef95cfca740a9ee4f35ad801965602061010083015101527f1234f5d9dd9e6fd062b538d3e81a795757a7ed2945ca04e44991534993dadf60610120820151527f02e8b4e01521b2481e6bb1f28d260fe01b96332c6fb725d930f22c2d801301d2602061012083015101527f0f85ca72bcccb58ec088b37767100e478cfc1c84f91193b569ebcfa844ebffca610140820151527f0e8eb0ee40d2ac89cc9bda611eac915eb0f5bcca36caa8e0f56b400d742ca732602061014083015101527f2a72ab666854284c4db7b49917d0c08c0bc94549b34804196632adbf3fcfcd77610160820151527f20ce6f2ef30257e84b7afbd63e996b5facb05233073b3445c1dedf9b4746fb88602061016083015101527f16a84f2bc78f5de42849ba39b01a62d5d46297c4b41a5a0bec2b3193081f303b610180820151527f07876d6ac372c528f50629d14cebe6016c90b1e4b2f1bcabab26ba227cca85d3602061018083015101527f1478dd951d6bfe3868f0cf3a2eb95ed340fe47c0f6d11bb2e9d960854e5524956101a0820151527f099ddde683662eb763546ca9bdf762792cb51c9e3772c117d35ca554d43d15b860206101a083015101527e6ee3b355c1d3f7a3c7c759550f88937f5f882099238e7bdee8b62c1227dfeb6101c0820151527f06094324093967c2811537678ce7ffff947e5f29bd715f2ccff7a911e0e38e4360206101c083015101527f2cb3c484e36265190711c6cddc5030aab4770b6efe5b110f3c04af12d604e4d36101e0820151527f0a6b6897ac3ae3cacb9916a8ac7965f21b1d8c98cf902f40c06e94b1c857b33660206101e083015101527f2d8e97da0a7bcb965970198941a0762947c3cf494bad6fcbab54828c77f5b0c4610200820151527f07962e2e2760e20506058bce20bca54c270b15e97d2132e1c6e6d19b32f09d5c602061020083015101527f256c3b17f2c9d4d96a6cd1c3aa9a2a3d3a2f4d82f737302c7d717ad2a991de70610220820151527f27c19554c1f87fd43b19bf44b5539873234c24c41556a6d44c93e67b49bf7ea3602061022083015101527f061f427c839bb22f0d9f1d6f0b5b6c27058d6c8fe0dd1f78ee0f578a31474d27610240820151527f02b80ab4ee786884d840e634a684dfb605f1b6fe50df1d184c5cf02e28d652f0602061024083015101527f0aa453e221c951b1deeaeb50bcf594ea778cc1516fb3fac9937d78804fe6ebe2610260820151527f0d1210627c2faf65c31d1a32ebd6d61f86a79b14c8c98f0cb3c8112be8bbf5f76020610260830151015290565b611925612abe565b6140008152601660208201527f2960ccbfa831a793352828ed96d1bdd8bb2641a95baf9fb57edb83f2cca50f456040820151527f1aa7d3d401d969fa5991bc2632cdd9662376b73d711da7dac798add1a71af5ba6020604083015101527f20c63270d438c7a1d5f2efa6fc8433880b20b0d5e8a5a8f0007dc717d21f16e06060820151527f225e5d18c26d8fb7f3b40486988726a589f7d287760c5cda3d56b02ee8b885fa6020606083015101527f1c25749f104c4c40bb85df869a45c24db6100a94d15c00272f06c12df488687d6080820151527f1ec81f81dc7db4bcdda5b8df435b0cf41ff63d2a4f07c7acecfe7f76fae18dcf6020608083015101527f18c618ce1b1e3ad035d7095b05552e02d3ae458a8e09ff4566b631e565be2a3260a0820151527f2fd002e84c76c7b0965a8d760b939a359e1e4335208372002ec024387d536258602060a083015101527f02de94c4a1f57b5649a43fa5af3ab5a16515c87115e202d6847550b705abc99560c0820151527f0b287ff4c028444fa5db9da160d292b93fa6bb42fd5d4517b44957b0c1d27acb602060c083015101527f078d7586574326613d2fb3fa445b97a597b714e990ddd239df94fb31a3399b6d60e0820151527f1dc0b27e9a7acd6fd3dadae3aa6e0b399e263e45856d2b24ed0fee99eb5fb401602060e083015101527f2031141beab16ef28e125b9f5dfac68b76653fe6b84517f54680ccf9df6bc78d610100820151527f0218f2e0d088f3484260384fa109ae07933f88dd91914c2ec2420e0dee3f7de5602061010083015101527f08064480d001be521821d062356588eda5f261272033a191e4a2d6d4357f2e91610120820151527f19fd20b1228ef31c7f5894581eda8a6bc76d8b63ce53e8c7b01a4935cb25a775602061012083015101527f18546a166f8d6c476d8a7d67acac1708df0147e8f1414e2cf9c917cac2689ab9610140820151527f06cc6ff643d568ae6ca2ba7ae4d62e534850d1a4def63d81b41d01042666035c602061014083015101527f0b4faccf5dc34066b8c1f8f35854050a7874d0a2818c74fe1adeb59e7ec2c6bf610160820151527f0cf6211dcca044fbe21e36a09ed22a39e0628221cd3b890167a3e15e8213b6ba602061016083015101527f26e43e5e6b83059e5c7de162cbeb6ff59b2a131f3c19cb8e24bfaa29369b37b3610180820151527f303fde21c1632dd69563ef7f34c003ebf7eff104aabdba74e602d07db9a9f996602061018083015101527f0970ed4d40373e01ba957d0ffbdec21cedcf141cbeef56fdd60db26481e6682c6101a0820151527f079509aa4eb8f12b9cebeab63f99b3c675fa24ec587a104a91da2f928d0dd83e60206101a083015101527f281b216a2154f4b3a41ebcf4a1661ecea487ecfeffb10a3af1c95e646cf9067c6101c0820151527f14ff18a5a0a146561af17c7e25e1e7aedca96f63e0e45e6db06e6fda83a017f660206101c083015101527f05ec99c9a5750e772e09b59c2900a27e133c89e37e53dbeb8e25aeaf71ca5d8d6101e0820151527f11eab6996efe30a8d9060d724aca0b8f1039d78f2bb3fa80866678a5c2ff5e7660206101e083015101527f21f55defa3da3d5cb88371ec2e3cf363e946e56ccc6e5d9521817596609250a3610200820151527f2475e54f88b4653c0c2ad0a68d81c9fd036236afde52118e681ae3bf8cad6e23602061020083015101527f1ac0e2768b54bc5994bb1224cc1b418e961b5d78298c4f0a3b8ff84cf60f3309610220820151527f01beea794b532e5f28169b659ca8942272ef94b4173aa265c75e8f58f47b8484602061022083015101527f14b8a58d9a83070b9412f50ffe8303ef7a9635202eba89f81ad07e14db58ed84610240820151527f0b364323368f55e1034dd161810931cbdc0af799e8ec0f730e829e0ebdd423ea602061024083015101527f1e523d197e5d7c2f0c2552e6f07966c391a25410c770ffb2597825e45827d99d610260820151527f0407d96a0a3a4123a33c4f08dcfc5b095dff98909bb5f7408fdd7f9d08468eed6020610260830151015290565b611f06612abe565b6180008152600760208201527f0b50c36923c6944a1fd8b9d260fc6786910299e5cd838b082a5d4b959c5369d86040820151527f2f6929bc105c2e4941e799e34147419a7f1e1e4d7d39bc84772d77203340c5ce6020604083015101527f13765dbb447c8ea8d3c358686bc464642b658c768d7b7d5c52d24090aa3120bc6060820151527f0561337e6621272cf83f4be0bd99d884f88724b1056e75d2231eaf34f3d804ad6020606083015101527f07358c9dccb7c0836af2ba0d84da7e125cb0e22f81ae70e8da68096d2f3066ed6080820151527f07fd263887d67d02c6997ac3385d290fe95a30133ab6c42c47a8354e30d55e056020608083015101527f0669063c49e18373adb984bbe5c4d448001c0ae449b68b03dcd130d6e1a4492360a0820151527f12866290a8990a143b6d6d7e3329183b1c4ad82ee250f57a8e1f615ef67480e8602060a083015101527f19f089ba3858226bac8a3053cc4486250d544430f238ca1542bc27497d9f9c4260c0820151527f1d1c0f1cda207c95080375a6863553ada605e24b80d9357e11e037f7a87ed73d602060c083015101527f07b7e66feeda9acbabe16f98ddd329f47a8860e2aae0addf0a16c66f881c4b9b60e0820151527f15ba6adb189f8d6cd44f9042bfbb7952409c3b2f0672940978440f52b66bd2e6602060e083015101527f1db45b81750780476089df0ef4ee6e1fa97c25b40706be930349c27de04d8980610100820151527f27c17411029c4cbd0e6a2d50bca1ad65466295a2ce33e408958ecaf4f4604ccc602061010083015101527f14d3c7e4a751138c29243664e5053dcd9a9ec44989c247894a8e586e6a6d94c9610120820151527f1f112a8320a2c479f950604f0504fbb37d30a9633e77543c758d7089b406ff92602061012083015101527f0d405e091ca140684368ee442484b1e8b973c621f4cf1ee8adccc9d7febed1ae610140820151527f1189e58196d34f3615ea805405e60b9581018f619000791d69d36a26177e7ffd602061014083015101527f2d2aa260acf145ec8ecd374a1d31515887737b2b95b7325decd82191ae3fe40a610160820151527f2b89b57f056713d19aac051d2b5c08f236835c77b33f890751b6c2cdd570aeec602061016083015101527f0b4f9e7c5cec4c89df8d1aa6ba509d027260a677d417a1e57764efbf98b66ae1610180820151527f2bde8594d8bf90d47542af98857a6a39ad4b13190e190a424ec6b3b0a29b2254602061018083015101527f071fde310bde93132ebc32f5feab394d5996ead1274d1afd18a88a0649dd9cff6101a0820151527f0830200a720e589651bcc1dd20a71e3712866f0636b1b7704e5a5949f768950060206101a083015101527f1fd0b7edc94f5166e68e5e52348eb514fe688626149ad57616aedd7ed1af233d6101c0820151527f1b1b83855b78e077da0d8dc06560314a9e20a8c7d52a76667cb2d44e36c94cff60206101c083015101527e7810407438091255399e5ec6e09b3792600687cf33b75811c285455afcd8ce6101e0820151527f048cf15864a37e55e19e326830010346a2624a4cce2e27e203cf30ab95481ad260206101e083015101527f1099393bb6c289d29cf9ae8d964f85399a0a233655d53ee01b5a54daa97f51a8610200820151527f22da9db142456e54f6c0792a4e0ab59cd7cda9db011349b499993b1eb2019328602061020083015101527f2876d88cba11d74ce75506378ba17971ba6b0ad5c558bb2074efbb2ccf2b227b610220820151527f12522bed77d00f4e9b6cfb7ee67f7aee83e4a234b94d17e81fde44c17c9ca13a602061022083015101527f07ac1f7330524e548ca80d43b5adbc60ef3358dbe26c0a6f34f95e33c6da53f8610240820151527f155bdf24d80bd533d322b67aeac75a62889fb0e0dfbfd1e62b284f7767385438602061024083015101527f068dbe6e8cf3d48579fba32c6f10d5b9b2d392a9f1ec35c2beea28feb596099f610260820151527f1c5312119a55f63257c803b4ce1657007f27129c2caefd028d4ae140643a895e6020610260830151015290565b6124e6612abe565b6180008152600960208201527f1edd7e8380fa133b1caaf53e19bbb36e4f67e6fa317f6c0923ebdd406181c3756040820151527f2347e3ab0314a024f6f41faade3c0a97d3c4573c10a9ba5d5aab5e24a8ee3a2d6020604083015101527f1644e1e336c01d9de5b481f81522fcaef5cef40e319fe07f2bc376e648932d4d6060820151527f22827063aa139c74a19f16936a01b44d555a22a90c3d57fd7b15967bc45403626020606083015101527f0e840efe2c1615d356b2b2f467f7f49f0cc6b75db5dc73b5591124dcfc0b16006080820151527f1540096182590988e27101f66661809800bfee896d5230f59381632c350b89546020608083015101527f2a46e5174dc5d55be95f6f451b089f2b3b792478d411e6313d85505ca516d5d160a0820151527f12dc6ab5a4a2bef6fd1972faa6aa6be0efb94eb8c59e46687149ff9678c5ed81602060a083015101527f29d1539594e7b749f9eb84c7da6b2f9e91d4a976ea856819f95bdf2b4955080760c0820151527f12d706c75de12ebc0fe0bf0a72e84a7cd6a3217eee90331dded2ba12810b91d0602060c083015101527f20587a04ac2c473abdea8a7eb923d2d19e48aaba464f594034c5494df99719bd60e0820151527f1a5ecd9b9d63611e9a4ccedc8eafdef1a85961406b180e43859ce1f3abceee5a602060e083015101527f1c220bd0f159e539302773922e23c0abfa5bdc4667b423a0a08d1d7eb316cf2a610100820151527f0797380c9433b8481a319aada22999d0bee4823c75fbb447d16e0cb9d8e43091602061010083015101527f152695e50f8d7f189c67af3300f448b9140d65ab361f404fe055fe8f74cc994c610120820151527e932a307c4ae6e70d89b73e7edca162fec708fd4f15f19944139d97c6178f71602061012083015101527f2970199168a67327b37350a8b5bae9dbc9a02718dd6f00274945d3f179b54728610140820151527f2973a64d7b98c27f60ec6c96e4fcb63bcd39d247031d04513873bad8c3a061d4602061014083015101527f2ded3bbfc595e96ac35de63c912c713d3c9af7b56a08bda4ddb3a2d581fed18f610160820151527f1de5065a0cd9a3f5f70bfbe4353d9c02ff142e652d129233be149c327f2c9dcd602061016083015101527f1791e6fe9df2f1afd69622868dcb1e65f0ad57cbac90bd57a26647366195ce8b610180820151527f21789ab824cfae26033c42fa151b3f0e0e40ad8f61679731a5a4ca26e3a0cda5602061018083015101527f262378469faedbe48fe5052bc079852e6d951097a728bd85f91463163668a7ce6101a0820151527f18e40a1137e63ff15e99c7d56382d255aea3bebcd0e3693315655f2779b9212460206101a083015101527f29e67f1e1d585638a82e01f00bf8f11e3b6be7b88d9d22ca9f6b6ca4a7470cc96101c0820151527f2602e8811f78f7aa4a9f38b6b1a2930ae66182183cbd84fb014b3a9abdbc0b4760206101c083015101527f202751a50df1526007632280f56285499e2f3af307ef74f4a98c483001909d556101e0820151527f27e9075da78fb1345d429966c80d5418f67aa25eaeb88b924fb40318a8184eb160206101e083015101527f25fd490d4c3a7bf6f5c9ebfdfd92b3e27491db705ef86f50c3cb04f528431804610200820151527f09ed7a29b8555d0f94d6fb108ac8f142488076c24f9d5e239ecc048f05053ecc602061020083015101527f02b37d0d38042045bcf65eab3d9cee1c05d89b2331786f7fc59e60a9907a793b610220820151527f0cf03ac0b56e935b8f0beeb42919771651ea29f49036be6397378f306c9450f4602061022083015101527f233ef9f6cdb1b60f174a71d16995cdf2223b3657a127b73671cfae10ab917ee5610240820151527f1ecdbf35c77e6a976548cf263c7f6f2fe1d290e0628fc8f4d029d46818b9551f602061024083015101527f18e17e60f5b3cbf99034e926d3b01a7834433239040f172d435e7ba1a63654a6610260820151527f2f9e8a016bd92a9e13329c9de40d1a26317d3f7517f3cecfa325f8c2eeb5316c6020610260830151015290565b6040518061028001604052806000815260200160008152602001612af5604051806040016040528060008152602001600081525090565b8152602001612b17604051806040016040528060008152602001600081525090565b8152602001612b39604051806040016040528060008152602001600081525090565b8152602001612b5b604051806040016040528060008152602001600081525090565b8152602001612b7d604051806040016040528060008152602001600081525090565b8152602001612b9f604051806040016040528060008152602001600081525090565b8152602001612bc1604051806040016040528060008152602001600081525090565b8152602001612be3604051806040016040528060008152602001600081525090565b8152602001612c05604051806040016040528060008152602001600081525090565b8152602001612c27604051806040016040528060008152602001600081525090565b8152602001612c49604051806040016040528060008152602001600081525090565b8152602001612c6b604051806040016040528060008152602001600081525090565b8152602001612c8d604051806040016040528060008152602001600081525090565b8152602001612caf604051806040016040528060008152602001600081525090565b8152602001612cd1604051806040016040528060008152602001600081525090565b8152602001612cf3604051806040016040528060008152602001600081525090565b8152602001612d15604051806040016040528060008152602001600081525090565b8152602001612d37604051806040016040528060008152602001600081525090565b905290565b803560ff8116811461019757600080fd5b60008060008060808587031215612d6357600080fd5b612d6c85612d3c565b9350612d7a60208601612d3c565b9250612d8860408601612d3c565b9150612d9660608601612d3c565b905092959194509250565b600060208284031215612db357600080fd5b5035919050565b60006104c08201905082518252602083015160208301526040830151612ded604084018280518252602090810151910152565b50606083015180516080840152602081015160a0840152506080830151805160c0840152602081015160e08401525060a0830151610100612e3a8185018380518252602090810151910152565b60c08501519150610140612e5a8186018480518252602090810151910152565b60e08601519250610180612e7a8187018580518252602090810151910152565b9186015192506101c091612e9a8684018580518252602090810151910152565b6101208701519350610200612ebb8188018680518252602090810151910152565b91870151935061024091612edb8784018680518252602090810151910152565b61016088015180516102808901526020908101516102a08901529188015180516102c08901528201516102e08801526101a088015180516103008901528201516103208801529287015180516103408801528101516103608701526101e087015180516103808801528101516103a08701529186015180516103c08701528201516103e0860152610220860151805161040087015282015161042086015285015180516104408601529081015161046085015290505061026092909201518051610480830152602001516104a0909101529056fea264697066735822122001744a823532336746c68b1ac624f1978215eddb05a58dd61de7d93eefd43c6a64736f6c634300080d0033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts/deployments/arbitrum_goerli/solcInputs/72a14774796fae5d4ac4d3b6f26df06c.json b/contracts/deployments/arbitrum_goerli/solcInputs/72a14774796fae5d4ac4d3b6f26df06c.json new file mode 100644 index 00000000..71d22f44 --- /dev/null +++ b/contracts/deployments/arbitrum_goerli/solcInputs/72a14774796fae5d4ac4d3b6f26df06c.json @@ -0,0 +1,188 @@ +{ + "language": "Solidity", + "sources": { + "contracts/AssetRegistry.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"./libraries/BN254.sol\";\nimport \"./libraries/EdOnBN254.sol\";\n\ncontract AssetRegistry {\n bytes13 public constant DOM_SEP_FOREIGN_ASSET = \"FOREIGN_ASSET\";\n bytes14 public constant DOM_SEP_DOMESTIC_ASSET = \"DOMESTIC_ASSET\";\n uint256 public constant CAP_NATIVE_ASSET_CODE = 1;\n\n event AssetSponsored(address erc20Address, uint256 assetDefinitionCode);\n\n mapping(bytes32 => address) public assets;\n\n struct AssetDefinition {\n uint256 code;\n AssetPolicy policy;\n }\n\n struct AssetPolicy {\n EdOnBN254.EdOnBN254Point auditorPk;\n EdOnBN254.EdOnBN254Point credPk;\n EdOnBN254.EdOnBN254Point freezerPk;\n uint256 revealMap;\n uint128 revealThreshold;\n }\n\n /// @notice Return the CAP-native asset definition.\n function nativeDomesticAsset() public pure returns (AssetDefinition memory assetDefinition) {\n assetDefinition.code = CAP_NATIVE_ASSET_CODE;\n // affine representation of zero point in arkwork is (0,1)\n assetDefinition.policy.auditorPk.y = 1;\n assetDefinition.policy.credPk.y = 1;\n assetDefinition.policy.freezerPk.y = 1;\n }\n\n /// @notice Fetch the ERC-20 token address corresponding to the\n /// given asset definition.\n /// @param assetDefinition an asset definition\n /// @return An ERC-20 address\n function lookup(AssetDefinition memory assetDefinition) public view returns (address) {\n bytes32 key = keccak256(abi.encode(assetDefinition));\n return assets[key];\n }\n\n /// @notice Is the given asset definition registered?\n /// @param assetDefinition an asset definition\n /// @return True if the asset type is registered, false otherwise.\n function isCapeAssetRegistered(AssetDefinition memory assetDefinition)\n public\n view\n returns (bool)\n {\n return lookup(assetDefinition) != address(0);\n }\n\n /// @notice Create and register a new asset type associated with an\n /// ERC-20 token. Will revert if the asset type is already\n /// registered or the ERC-20 token address is zero.\n /// @param erc20Address An ERC-20 token address\n /// @param newAsset An asset type to be registered in the contract\n function sponsorCapeAsset(address erc20Address, AssetDefinition memory newAsset) external {\n require(erc20Address != address(0), \"Bad asset address\");\n require(!isCapeAssetRegistered(newAsset), \"Asset already registered\");\n\n _checkForeignAssetCode(newAsset.code, erc20Address, msg.sender, newAsset.policy);\n\n bytes32 key = keccak256(abi.encode(newAsset));\n assets[key] = erc20Address;\n\n emit AssetSponsored(erc20Address, newAsset.code);\n }\n\n /// @notice Throws an exception if the asset definition code is\n /// not correctly derived from the ERC-20 address of the token and\n /// the address of the sponsor.\n /// @dev Requires \"view\" to access msg.sender.\n /// @param assetDefinitionCode The code of an asset definition\n /// @param erc20Address The ERC-20 address bound to the asset definition\n /// @param sponsor The sponsor address of this wrapped asset\n /// @param policy asset policy\n function _checkForeignAssetCode(\n uint256 assetDefinitionCode,\n address erc20Address,\n address sponsor,\n AssetPolicy memory policy\n ) internal pure {\n bytes memory description = _computeAssetDescription(erc20Address, sponsor, policy);\n require(\n assetDefinitionCode ==\n BN254.fromLeBytesModOrder(\n bytes.concat(keccak256(bytes.concat(DOM_SEP_FOREIGN_ASSET, description)))\n ),\n \"Wrong foreign asset code\"\n );\n }\n\n /// @dev Checks if the asset definition code is correctly derived from the internal asset code.\n /// @param assetDefinitionCode asset definition code\n /// @param internalAssetCode internal asset code\n function _checkDomesticAssetCode(uint256 assetDefinitionCode, uint256 internalAssetCode)\n internal\n pure\n {\n require(\n assetDefinitionCode ==\n BN254.fromLeBytesModOrder(\n bytes.concat(\n keccak256(\n bytes.concat(\n DOM_SEP_DOMESTIC_ASSET,\n bytes32(Utils.reverseEndianness(internalAssetCode))\n )\n )\n )\n ),\n \"Wrong domestic asset code\"\n );\n }\n\n /// @dev Compute the asset description from the address of the\n /// ERC-20 token and the address of the sponsor.\n /// @param erc20Address address of the erc20 token\n /// @param sponsor address of the sponsor\n /// @param policy asset policy\n /// @return The asset description\n function _computeAssetDescription(\n address erc20Address,\n address sponsor,\n AssetPolicy memory policy\n ) internal pure returns (bytes memory) {\n return\n bytes.concat(\n \"EsSCAPE ERC20\",\n bytes20(erc20Address),\n \"sponsored by\",\n bytes20(sponsor),\n \"policy\",\n abi.encode(policy)\n );\n }\n}\n" + }, + "contracts/libraries/BN254.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\n//\n// Based on:\n// - Christian Reitwiessner: https://gist.githubusercontent.com/chriseth/f9be9d9391efc5beb9704255a8e2989d/raw/4d0fb90847df1d4e04d507019031888df8372239/snarktest.solidity\n// - Aztec: https://github.com/AztecProtocol/aztec-2-bug-bounty\n\npragma solidity ^0.8.0;\n\nimport \"./Utils.sol\";\n\n/// @notice Barreto-Naehrig curve over a 254 bit prime field\nlibrary BN254 {\n // use notation from https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/\n //\n // Elliptic curve is defined over a prime field GF(p), with embedding degree k.\n // Short Weierstrass (SW form) is, for a, b \\in GF(p^n) for some natural number n > 0:\n // E: y^2 = x^3 + a * x + b\n //\n // Pairing is defined over cyclic subgroups G1, G2, both of which are of order r.\n // G1 is a subgroup of E(GF(p)), G2 is a subgroup of E(GF(p^k)).\n //\n // BN family are parameterized curves with well-chosen t,\n // p = 36 * t^4 + 36 * t^3 + 24 * t^2 + 6 * t + 1\n // r = 36 * t^4 + 36 * t^3 + 18 * t^2 + 6 * t + 1\n // for some integer t.\n // E has the equation:\n // E: y^2 = x^3 + b\n // where b is a primitive element of multiplicative group (GF(p))^* of order (p-1).\n // A pairing e is defined by taking G1 as a subgroup of E(GF(p)) of order r,\n // G2 as a subgroup of E'(GF(p^2)),\n // and G_T as a subgroup of a multiplicative group (GF(p^12))^* of order r.\n //\n // BN254 is defined over a 254-bit prime order p, embedding degree k = 12.\n uint256 public constant P_MOD =\n 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n uint256 public constant R_MOD =\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n\n struct G1Point {\n uint256 x;\n uint256 y;\n }\n\n // G2 group element where x \\in Fp2 = x0 * z + x1\n struct G2Point {\n uint256 x0;\n uint256 x1;\n uint256 y0;\n uint256 y1;\n }\n\n /// @return the generator of G1\n // solhint-disable-next-line func-name-mixedcase\n function P1() internal pure returns (G1Point memory) {\n return G1Point(1, 2);\n }\n\n /// @return the generator of G2\n // solhint-disable-next-line func-name-mixedcase\n function P2() internal pure returns (G2Point memory) {\n return\n G2Point({\n x0: 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2,\n x1: 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed,\n y0: 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b,\n y1: 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa\n });\n }\n\n /// @dev check if a G1 point is Infinity\n /// @notice precompile bn256Add at address(6) takes (0, 0) as Point of Infinity,\n /// some crypto libraries (such as arkwork) uses a boolean flag to mark PoI, and\n /// just use (0, 1) as affine coordinates (not on curve) to represents PoI.\n function isInfinity(G1Point memory point) internal pure returns (bool result) {\n assembly {\n let x := mload(point)\n let y := mload(add(point, 0x20))\n result := and(iszero(x), iszero(y))\n }\n }\n\n /// @return r the negation of p, i.e. p.add(p.negate()) should be zero.\n function negate(G1Point memory p) internal pure returns (G1Point memory) {\n if (isInfinity(p)) {\n return p;\n }\n return G1Point(p.x, P_MOD - (p.y % P_MOD));\n }\n\n /// @return res = -fr the negation of scalar field element.\n function negate(uint256 fr) internal pure returns (uint256 res) {\n return R_MOD - (fr % R_MOD);\n }\n\n /// @return r the sum of two points of G1\n function add(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {\n uint256[4] memory input;\n input[0] = p1.x;\n input[1] = p1.y;\n input[2] = p2.x;\n input[3] = p2.y;\n bool success;\n assembly {\n success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60)\n // Use \"invalid\" to make gas estimation work\n switch success\n case 0 {\n revert(0, 0)\n }\n }\n require(success, \"Bn254: group addition failed!\");\n }\n\n /// @return r the product of a point on G1 and a scalar, i.e.\n /// p == p.mul(1) and p.add(p) == p.mul(2) for all points p.\n function scalarMul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {\n uint256[3] memory input;\n input[0] = p.x;\n input[1] = p.y;\n input[2] = s;\n bool success;\n assembly {\n success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60)\n // Use \"invalid\" to make gas estimation work\n switch success\n case 0 {\n revert(0, 0)\n }\n }\n require(success, \"Bn254: scalar mul failed!\");\n }\n\n /// @dev Multi-scalar Mulitiplication (MSM)\n /// @return r = \\Prod{B_i^s_i} where {s_i} are `scalars` and {B_i} are `bases`\n function multiScalarMul(G1Point[] memory bases, uint256[] memory scalars)\n internal\n view\n returns (G1Point memory r)\n {\n require(scalars.length == bases.length, \"MSM error: length does not match\");\n\n r = scalarMul(bases[0], scalars[0]);\n for (uint256 i = 1; i < scalars.length; i++) {\n r = add(r, scalarMul(bases[i], scalars[i]));\n }\n }\n\n /// @dev Compute f^-1 for f \\in Fr scalar field\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\n function invert(uint256 fr) internal view returns (uint256 output) {\n bool success;\n uint256 p = R_MOD;\n assembly {\n let mPtr := mload(0x40)\n mstore(mPtr, 0x20)\n mstore(add(mPtr, 0x20), 0x20)\n mstore(add(mPtr, 0x40), 0x20)\n mstore(add(mPtr, 0x60), fr)\n mstore(add(mPtr, 0x80), sub(p, 2))\n mstore(add(mPtr, 0xa0), p)\n success := staticcall(gas(), 0x05, mPtr, 0xc0, 0x00, 0x20)\n output := mload(0x00)\n }\n require(success, \"Bn254: pow precompile failed!\");\n }\n\n /**\n * validate the following:\n * x != 0\n * y != 0\n * x < p\n * y < p\n * y^2 = x^3 + 3 mod p\n */\n /// @dev validate G1 point and check if it is on curve\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\n function validateG1Point(G1Point memory point) internal pure {\n bool isWellFormed;\n uint256 p = P_MOD;\n assembly {\n let x := mload(point)\n let y := mload(add(point, 0x20))\n\n isWellFormed := and(\n and(and(lt(x, p), lt(y, p)), not(or(iszero(x), iszero(y)))),\n eq(mulmod(y, y, p), addmod(mulmod(x, mulmod(x, x, p), p), 3, p))\n )\n }\n require(isWellFormed, \"Bn254: invalid G1 point\");\n }\n\n /// @dev Validate scalar field, revert if invalid (namely if fr > r_mod).\n /// @notice Writing this inline instead of calling it might save gas.\n function validateScalarField(uint256 fr) internal pure {\n bool isValid;\n assembly {\n isValid := lt(fr, R_MOD)\n }\n require(isValid, \"Bn254: invalid scalar field\");\n }\n\n /// @dev Evaluate the following pairing product:\n /// @dev e(a1, a2).e(-b1, b2) == 1\n /// @dev caller needs to ensure that a1, a2, b1 and b2 are within proper group\n /// @notice credit: Aztec, Spilsbury Holdings Ltd\n function pairingProd2(\n G1Point memory a1,\n G2Point memory a2,\n G1Point memory b1,\n G2Point memory b2\n ) internal view returns (bool) {\n uint256 out;\n bool success;\n assembly {\n let mPtr := mload(0x40)\n mstore(mPtr, mload(a1))\n mstore(add(mPtr, 0x20), mload(add(a1, 0x20)))\n mstore(add(mPtr, 0x40), mload(a2))\n mstore(add(mPtr, 0x60), mload(add(a2, 0x20)))\n mstore(add(mPtr, 0x80), mload(add(a2, 0x40)))\n mstore(add(mPtr, 0xa0), mload(add(a2, 0x60)))\n\n mstore(add(mPtr, 0xc0), mload(b1))\n mstore(add(mPtr, 0xe0), mload(add(b1, 0x20)))\n mstore(add(mPtr, 0x100), mload(b2))\n mstore(add(mPtr, 0x120), mload(add(b2, 0x20)))\n mstore(add(mPtr, 0x140), mload(add(b2, 0x40)))\n mstore(add(mPtr, 0x160), mload(add(b2, 0x60)))\n success := staticcall(gas(), 8, mPtr, 0x180, 0x00, 0x20)\n out := mload(0x00)\n }\n require(success, \"Bn254: Pairing check failed!\");\n return (out != 0);\n }\n\n function fromLeBytesModOrder(bytes memory leBytes) internal pure returns (uint256 ret) {\n for (uint256 i = 0; i < leBytes.length; i++) {\n ret = mulmod(ret, 256, R_MOD);\n ret = addmod(ret, uint256(uint8(leBytes[leBytes.length - 1 - i])), R_MOD);\n }\n }\n\n /// @dev Check if y-coordinate of G1 point is negative.\n function isYNegative(G1Point memory point) internal pure returns (bool) {\n return (point.y << 1) < P_MOD;\n }\n\n // @dev Perform a modular exponentiation.\n // @return base^exponent (mod modulus)\n // This method is ideal for small exponents (~64 bits or less), as it is cheaper than using the pow precompile\n // @notice credit: credit: Aztec, Spilsbury Holdings Ltd\n function powSmall(\n uint256 base,\n uint256 exponent,\n uint256 modulus\n ) internal pure returns (uint256) {\n uint256 result = 1;\n uint256 input = base;\n uint256 count = 1;\n\n assembly {\n let endpoint := add(exponent, 0x01)\n for {\n\n } lt(count, endpoint) {\n count := add(count, count)\n } {\n if and(exponent, count) {\n result := mulmod(result, input, modulus)\n }\n input := mulmod(input, input, modulus)\n }\n }\n\n return result;\n }\n\n function g1Serialize(G1Point memory point) internal pure returns (bytes memory) {\n uint256 mask = 0;\n\n // Set the 254-th bit to 1 for infinity\n // https://docs.rs/ark-serialize/0.3.0/src/ark_serialize/flags.rs.html#117\n if (isInfinity(point)) {\n mask |= 0x4000000000000000000000000000000000000000000000000000000000000000;\n }\n\n // Set the 255-th bit to 1 for positive Y\n // https://docs.rs/ark-serialize/0.3.0/src/ark_serialize/flags.rs.html#118\n if (!isYNegative(point)) {\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\n }\n\n return abi.encodePacked(Utils.reverseEndianness(point.x | mask));\n }\n\n function g1Deserialize(bytes32 input) internal view returns (G1Point memory point) {\n uint256 mask = 0x4000000000000000000000000000000000000000000000000000000000000000;\n uint256 x = Utils.reverseEndianness(uint256(input));\n uint256 y;\n bool isQuadraticResidue;\n bool isYPositive;\n if (x & mask != 0) {\n // the 254-th bit == 1 for infinity\n x = 0;\n y = 0;\n } else {\n // Set the 255-th bit to 1 for positive Y\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\n isYPositive = (x & mask != 0);\n // mask off the first two bits of x\n mask = 0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\n x &= mask;\n\n // solve for y where E: y^2 = x^3 + 3\n y = mulmod(x, x, P_MOD);\n y = mulmod(y, x, P_MOD);\n y = addmod(y, 3, P_MOD);\n (isQuadraticResidue, y) = quadraticResidue(y);\n\n require(isQuadraticResidue, \"deser fail: not on curve\");\n\n if (isYPositive) {\n y = P_MOD - y;\n }\n }\n\n point = G1Point(x, y);\n }\n\n function quadraticResidue(uint256 x)\n internal\n view\n returns (bool isQuadraticResidue, uint256 a)\n {\n bool success;\n // e = (p+1)/4\n uint256 e = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52;\n uint256 p = P_MOD;\n\n // we have p == 3 mod 4 therefore\n // a = x^((p+1)/4)\n assembly {\n // credit: Aztec\n let mPtr := mload(0x40)\n mstore(mPtr, 0x20)\n mstore(add(mPtr, 0x20), 0x20)\n mstore(add(mPtr, 0x40), 0x20)\n mstore(add(mPtr, 0x60), x)\n mstore(add(mPtr, 0x80), e)\n mstore(add(mPtr, 0xa0), p)\n success := staticcall(gas(), 0x05, mPtr, 0xc0, 0x00, 0x20)\n a := mload(0x00)\n }\n require(success, \"pow precompile call failed!\");\n\n // ensure a < p/2\n if (a << 1 > p) {\n a = p - a;\n }\n\n // check if a^2 = x, if not x is not a quadratic residue\n e = mulmod(a, a, p);\n\n isQuadraticResidue = (e == x);\n }\n}\n" + }, + "contracts/libraries/EdOnBN254.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"../libraries/Utils.sol\";\n\n/// @notice Edward curve on BN254.\n/// This library only implements a serialization function that is consistent with\n/// Arkworks' format. It does not support any group operations.\nlibrary EdOnBN254 {\n uint256 public constant P_MOD =\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n\n struct EdOnBN254Point {\n uint256 x;\n uint256 y;\n }\n\n /// @dev Check if y-coordinate of G1 point is negative.\n function isYNegative(EdOnBN254Point memory point) internal pure returns (bool) {\n return (point.y << 1) < P_MOD;\n }\n\n function serialize(EdOnBN254Point memory point) internal pure returns (bytes memory res) {\n uint256 mask = 0;\n // Edward curve does not have an infinity flag.\n // Set the 255-th bit to 1 for positive Y\n // See: https://github.com/arkworks-rs/algebra/blob/d6365c3a0724e5d71322fe19cbdb30f979b064c8/serialize/src/flags.rs#L148\n if (!EdOnBN254.isYNegative(point)) {\n mask = 0x8000000000000000000000000000000000000000000000000000000000000000;\n }\n\n return abi.encodePacked(Utils.reverseEndianness(point.x | mask));\n }\n}\n" + }, + "contracts/libraries/Utils.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nlibrary Utils {\n function reverseEndianness(uint256 input) internal pure returns (uint256 v) {\n v = input;\n\n // swap bytes\n v =\n ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) |\n ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\n\n // swap 2-byte long pairs\n v =\n ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) |\n ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\n\n // swap 4-byte long pairs\n v =\n ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) |\n ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32);\n\n // swap 8-byte long pairs\n v =\n ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) |\n ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64);\n\n // swap 16-byte long pairs\n v = (v >> 128) | (v << 128);\n }\n}\n" + }, + "contracts/CAPE.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\n/// @title Configurable Anonymous Payments for Ethereum\n/// CAPE provides auditable anonymous payments on Ethereum.\n/// @author Espresso Systems \n\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport \"@rari-capital/solmate/src/utils/SafeTransferLib.sol\";\n\nimport \"solidity-bytes-utils/contracts/BytesLib.sol\";\nimport \"./libraries/AccumulatingArray.sol\";\nimport \"./libraries/EdOnBN254.sol\";\nimport \"./libraries/RescueLib.sol\";\nimport \"./libraries/VerifyingKeys.sol\";\nimport \"./interfaces/IPlonkVerifier.sol\";\nimport \"./interfaces/IRecordsMerkleTree.sol\";\nimport \"./AssetRegistry.sol\";\nimport \"./RootStore.sol\";\n\ncontract CAPE is RootStore, AssetRegistry, ReentrancyGuard {\n using AccumulatingArray for AccumulatingArray.Data;\n\n mapping(uint256 => bool) public nullifiers;\n uint64 public blockHeight;\n IPlonkVerifier private _verifier;\n IRecordsMerkleTree internal _recordsMerkleTree;\n uint256[] public pendingDeposits;\n\n // NOTE: used for faucet in testnet only, will be removed for mainnet\n address public deployer;\n bool public faucetInitialized;\n\n bytes public constant CAPE_BURN_MAGIC_BYTES = \"EsSCAPE burn\";\n uint256 public constant CAPE_BURN_MAGIC_BYTES_SIZE = 12;\n // In order to avoid the contract running out of gas if the queue is too large\n // we set the maximum number of pending deposits record commitments to process\n // when a new block is submitted. This is a temporary solution.\n // See https://github.com/EspressoSystems/cape/issues/400\n uint256 public constant MAX_NUM_PENDING_DEPOSIT = 10;\n\n event FaucetInitialized(bytes roBytes);\n\n event BlockCommitted(\n uint64 indexed height,\n uint256[] depositCommitments,\n // What follows is a `CapeBlock` struct split up into fields.\n // This may no longer be necessary once\n // https://github.com/gakonst/ethers-rs/issues/1220\n // is fixed.\n bytes minerAddr,\n bytes noteTypes,\n bytes transferNotes,\n bytes mintNotes,\n bytes freezeNotes,\n bytes burnNotes\n );\n\n event Erc20TokensDeposited(bytes roBytes, address erc20TokenAddress, address from);\n\n struct AuditMemo {\n EdOnBN254.EdOnBN254Point ephemeralKey;\n uint256[] data;\n }\n\n enum NoteType {\n TRANSFER,\n MINT,\n FREEZE,\n BURN\n }\n\n struct TransferNote {\n uint256[] inputNullifiers;\n uint256[] outputCommitments;\n IPlonkVerifier.PlonkProof proof;\n AuditMemo auditMemo;\n TransferAuxInfo auxInfo;\n }\n\n struct BurnNote {\n TransferNote transferNote;\n RecordOpening recordOpening;\n }\n\n struct MintNote {\n /// nullifier for the input (i.e. transaction fee record)\n uint256 inputNullifier;\n /// output commitment for the fee change\n uint256 chgComm;\n /// output commitment for the minted asset\n uint256 mintComm;\n /// the amount of the minted asset\n uint128 mintAmount;\n /// the asset definition of the asset\n AssetDefinition mintAssetDef;\n /// Internal asset code\n uint256 mintInternalAssetCode;\n /// the validity proof of this note\n IPlonkVerifier.PlonkProof proof;\n /// memo for policy compliance specified for the designated auditor\n AuditMemo auditMemo;\n /// auxiliary information\n MintAuxInfo auxInfo;\n }\n\n struct FreezeNote {\n uint256[] inputNullifiers;\n uint256[] outputCommitments;\n IPlonkVerifier.PlonkProof proof;\n FreezeAuxInfo auxInfo;\n }\n\n struct TransferAuxInfo {\n uint256 merkleRoot;\n uint128 fee;\n uint64 validUntil;\n EdOnBN254.EdOnBN254Point txnMemoVerKey;\n bytes extraProofBoundData;\n }\n\n struct MintAuxInfo {\n uint256 merkleRoot;\n uint128 fee;\n EdOnBN254.EdOnBN254Point txnMemoVerKey;\n }\n\n struct FreezeAuxInfo {\n uint256 merkleRoot;\n uint128 fee;\n EdOnBN254.EdOnBN254Point txnMemoVerKey;\n }\n\n struct RecordOpening {\n uint128 amount;\n AssetDefinition assetDef;\n EdOnBN254.EdOnBN254Point userAddr;\n bytes32 encKey;\n bool freezeFlag;\n uint256 blind;\n }\n\n struct CapeBlock {\n EdOnBN254.EdOnBN254Point minerAddr;\n NoteType[] noteTypes;\n TransferNote[] transferNotes;\n MintNote[] mintNotes;\n FreezeNote[] freezeNotes;\n BurnNote[] burnNotes;\n }\n\n /// @notice CAPE contract constructor method.\n /// @param nRoots number of the most recent roots of the records merkle tree to be stored\n /// @param verifierAddr address of the Plonk Verifier contract\n constructor(\n uint64 nRoots,\n address verifierAddr,\n address recordsMerkleTreeAddr\n ) RootStore(nRoots) {\n _verifier = IPlonkVerifier(verifierAddr);\n _recordsMerkleTree = IRecordsMerkleTree(recordsMerkleTreeAddr);\n\n // NOTE: used for faucet in testnet only, will be removed for mainnet\n deployer = msg.sender;\n }\n\n /// @notice Allocate native token faucet to a manager. For testnet only.\n /// @param faucetManagerAddress address of public key of faucet manager for CAP native token (testnet only!)\n /// @param faucetManagerEncKey public key of faucet manager for CAP native token (testnet only!)\n function faucetSetupForTestnet(\n EdOnBN254.EdOnBN254Point memory faucetManagerAddress,\n bytes32 faucetManagerEncKey\n ) external {\n // faucet can only be set up once by the manager\n require(msg.sender == deployer, \"Only invocable by deployer\");\n require(!faucetInitialized, \"Faucet already set up\");\n\n // allocate maximum possible amount of native CAP token to faucet manager on testnet\n // max amount len is set to 63 bits: https://github.com/EspressoSystems/cap/blob/main/src/constants.rs#L50-L51\n RecordOpening memory ro = RecordOpening(\n type(uint128).max / 2,\n nativeDomesticAsset(),\n faucetManagerAddress,\n faucetManagerEncKey,\n false,\n 0 // arbitrary blind factor\n );\n uint256[] memory recordCommitments = new uint256[](1);\n recordCommitments[0] = _deriveRecordCommitment(ro);\n\n // Insert the record into record accumulator.\n //\n // This is a call to our own contract, not an arbitrary external contract.\n // slither-disable-next-line reentrancy-no-eth\n _recordsMerkleTree.updateRecordsMerkleTree(recordCommitments);\n // slither-disable-next-line reentrancy-benign\n _addRoot(_recordsMerkleTree.getRootValue());\n\n // slither-disable-next-line reentrancy-events\n emit FaucetInitialized(abi.encode(ro));\n faucetInitialized = true;\n }\n\n /// @notice Publish an array of nullifiers.\n /// @dev Requires all nullifiers to be unique and unpublished.\n /// @dev A block creator must not submit notes with duplicate nullifiers.\n /// @param newNullifiers list of nullifiers to publish\n function _publish(uint256[] memory newNullifiers) internal {\n for (uint256 j = 0; j < newNullifiers.length; j++) {\n _publish(newNullifiers[j]);\n }\n }\n\n /// @notice Publish a nullifier if it hasn't been published before.\n /// @dev Reverts if the nullifier is already published.\n /// @param nullifier nullifier to publish\n function _publish(uint256 nullifier) internal {\n require(!nullifiers[nullifier], \"Nullifier already published\");\n nullifiers[nullifier] = true;\n }\n\n /// @notice Wraps ERC-20 tokens into a CAPE asset defined in the record opening.\n /// @param ro record opening that will be inserted in the records merkle tree once the deposit is validated\n /// @param erc20Address address of the ERC-20 token corresponding to the deposit\n function depositErc20(RecordOpening memory ro, address erc20Address) external nonReentrant {\n require(isCapeAssetRegistered(ro.assetDef), \"Asset definition not registered\");\n require(lookup(ro.assetDef) == erc20Address, \"Wrong ERC20 address\");\n\n // We skip the sanity checks mentioned in the rust specification as they are optional.\n if (pendingDeposits.length >= MAX_NUM_PENDING_DEPOSIT) {\n revert(\"Pending deposits queue is full\");\n }\n pendingDeposits.push(_deriveRecordCommitment(ro));\n\n SafeTransferLib.safeTransferFrom(\n ERC20(erc20Address),\n msg.sender,\n address(this),\n ro.amount\n );\n\n emit Erc20TokensDeposited(abi.encode(ro), erc20Address, msg.sender);\n }\n\n /// @notice Submit a new block with extra data to the CAPE contract.\n /// @param newBlock block to be processed by the CAPE contract\n /// @param {bytes} extraData data to be stored in calldata; this data is ignored by the contract function\n function submitCapeBlockWithMemos(\n CapeBlock memory newBlock,\n bytes calldata /* extraData */\n ) external {\n submitCapeBlock(newBlock);\n }\n\n /// @notice Submit a new block to the CAPE contract.\n /// @dev Transactions are validated and the blockchain state is updated. Moreover *BURN* transactions trigger the unwrapping of cape asset records into erc20 tokens.\n /// @param newBlock block to be processed by the CAPE contract.\n function submitCapeBlock(CapeBlock memory newBlock) public nonReentrant {\n AccumulatingArray.Data memory commitments = AccumulatingArray.create(\n _computeNumCommitments(newBlock) + pendingDeposits.length\n );\n\n uint256 numNotes = newBlock.noteTypes.length;\n\n // Batch verify plonk proofs\n IPlonkVerifier.VerifyingKey[] memory vks = new IPlonkVerifier.VerifyingKey[](numNotes);\n uint256[][] memory publicInputs = new uint256[][](numNotes);\n IPlonkVerifier.PlonkProof[] memory proofs = new IPlonkVerifier.PlonkProof[](numNotes);\n bytes[] memory extraMsgs = new bytes[](numNotes);\n\n // Preserve the ordering of the (sub) arrays of notes.\n uint256 transferIdx = 0;\n uint256 mintIdx = 0;\n uint256 freezeIdx = 0;\n uint256 burnIdx = 0;\n\n // We require either the block or the pending deposits queue to be non empty. That is we expect the block submission to trigger some change in the blockchain state.\n // The reason is that, due to race conditions, it is possible to have the relayer send an empty block while the pending deposits queue is still empty.\n // If we do not reject the block, the `blockHeight` contract variable will be incremented, yet the set of records merkle tree roots will be unchanged.\n // On the other side, the wallet assumes that the blockHeight is equal to the number of roots and thus, in the case of a block submission that only increments `blockHeight`,\n // the wallet and the contract states become inconsistent.\n require(!((numNotes == 0) && (pendingDeposits.length == 0)), \"Block must be non-empty\");\n\n for (uint256 i = 0; i < numNotes; i++) {\n NoteType noteType = newBlock.noteTypes[i];\n\n if (noteType == NoteType.TRANSFER) {\n TransferNote memory note = newBlock.transferNotes[transferIdx];\n transferIdx += 1;\n\n _checkContainsRoot(note.auxInfo.merkleRoot);\n _checkTransfer(note);\n require(!_isExpired(note), \"Expired note\");\n\n _publish(note.inputNullifiers);\n\n commitments.add(note.outputCommitments);\n\n (vks[i], publicInputs[i], proofs[i], extraMsgs[i]) = _prepareForProofVerification(\n note\n );\n } else if (noteType == NoteType.MINT) {\n MintNote memory note = newBlock.mintNotes[mintIdx];\n mintIdx += 1;\n\n _checkContainsRoot(note.auxInfo.merkleRoot);\n _checkDomesticAssetCode(note.mintAssetDef.code, note.mintInternalAssetCode);\n\n _publish(note.inputNullifier);\n\n commitments.add(note.chgComm);\n commitments.add(note.mintComm);\n\n (vks[i], publicInputs[i], proofs[i], extraMsgs[i]) = _prepareForProofVerification(\n note\n );\n } else if (noteType == NoteType.FREEZE) {\n FreezeNote memory note = newBlock.freezeNotes[freezeIdx];\n freezeIdx += 1;\n\n _checkContainsRoot(note.auxInfo.merkleRoot);\n\n _publish(note.inputNullifiers);\n\n commitments.add(note.outputCommitments);\n\n (vks[i], publicInputs[i], proofs[i], extraMsgs[i]) = _prepareForProofVerification(\n note\n );\n } else if (noteType == NoteType.BURN) {\n BurnNote memory note = newBlock.burnNotes[burnIdx];\n burnIdx += 1;\n\n _checkContainsRoot(note.transferNote.auxInfo.merkleRoot);\n _checkBurn(note);\n\n _publish(note.transferNote.inputNullifiers);\n\n // Insert all the output commitments to the records merkle tree except from the second one (corresponding to the burned output)\n for (uint256 j = 0; j < note.transferNote.outputCommitments.length; j++) {\n if (j != 1) {\n commitments.add(note.transferNote.outputCommitments[j]);\n }\n }\n\n (vks[i], publicInputs[i], proofs[i], extraMsgs[i]) = _prepareForProofVerification(\n note\n );\n\n // Send the tokens\n _handleWithdrawal(note);\n } else {\n revert(\"Cape: unreachable!\");\n }\n }\n\n // Skip the batch plonk verification if the block is empty\n if (numNotes > 0) {\n require(\n _verifier.batchVerify(vks, publicInputs, proofs, extraMsgs),\n \"Cape: batch verify failed.\"\n );\n }\n\n // Process the pending deposits obtained after calling `depositErc20`\n for (uint256 i = 0; i < pendingDeposits.length; i++) {\n commitments.add(pendingDeposits[i]);\n }\n\n // Only update the merkle tree and add the root if the list of records commitments is non empty\n if (!commitments.isEmpty()) {\n // This is a call to our own contract, not an arbitrary external contract.\n // slither-disable-next-line reentrancy-no-eth\n _recordsMerkleTree.updateRecordsMerkleTree(commitments.items);\n // slither-disable-next-line reentrancy-benign\n _addRoot(_recordsMerkleTree.getRootValue());\n }\n\n // In all cases (the block is empty or not), the height is incremented.\n blockHeight += 1;\n\n // Inform clients about the new block and the processed deposits.\n // slither-disable-next-line reentrancy-events\n _emitBlockEvent(newBlock);\n\n // Empty the queue now that the record commitments have been inserted\n delete pendingDeposits;\n }\n\n /// @notice This function only exists to avoid a stack too deep compilation error.\n function _emitBlockEvent(CapeBlock memory newBlock) internal {\n emit BlockCommitted(\n blockHeight,\n pendingDeposits,\n abi.encode(newBlock.minerAddr),\n abi.encode(newBlock.noteTypes),\n abi.encode(newBlock.transferNotes),\n abi.encode(newBlock.mintNotes),\n abi.encode(newBlock.freezeNotes),\n abi.encode(newBlock.burnNotes)\n );\n }\n\n /// @dev send the ERC-20 tokens equivalent to the asset records being burnt. Recall that the burned record opening is contained inside the note.\n /// @param note note of type *BURN*\n function _handleWithdrawal(BurnNote memory note) internal {\n address ercTokenAddress = lookup(note.recordOpening.assetDef);\n\n // Extract recipient address\n address recipientAddress = BytesLib.toAddress(\n note.transferNote.auxInfo.extraProofBoundData,\n CAPE_BURN_MAGIC_BYTES_SIZE\n );\n SafeTransferLib.safeTransfer(\n ERC20(ercTokenAddress),\n recipientAddress,\n note.recordOpening.amount\n );\n }\n\n /// @dev Compute an upper bound on the number of records to be inserted\n function _computeNumCommitments(CapeBlock memory newBlock) internal pure returns (uint256) {\n // MintNote always has 2 commitments: mint_comm, chg_comm\n uint256 numComms = 2 * newBlock.mintNotes.length;\n for (uint256 i = 0; i < newBlock.transferNotes.length; i++) {\n numComms += newBlock.transferNotes[i].outputCommitments.length;\n }\n for (uint256 i = 0; i < newBlock.burnNotes.length; i++) {\n // Subtract one for the burn record commitment that is not inserted.\n // The function _containsBurnRecord checks that there are at least 2 output commitments.\n numComms += newBlock.burnNotes[i].transferNote.outputCommitments.length - 1;\n }\n for (uint256 i = 0; i < newBlock.freezeNotes.length; i++) {\n numComms += newBlock.freezeNotes[i].outputCommitments.length;\n }\n return numComms;\n }\n\n /// @dev Verify if a note is of type *TRANSFER*.\n /// @param note note which could be of type *TRANSFER* or *BURN*\n function _checkTransfer(TransferNote memory note) internal pure {\n require(\n !_containsBurnPrefix(note.auxInfo.extraProofBoundData),\n \"Burn prefix in transfer note\"\n );\n }\n\n /// @dev Check if a note has expired.\n /// @param note note for which we want to check its timestamp against the current block height\n function _isExpired(TransferNote memory note) internal view returns (bool) {\n return note.auxInfo.validUntil < blockHeight;\n }\n\n /// @dev Check if a burn note is well formed.\n /// @param note note of type *BURN*\n function _checkBurn(BurnNote memory note) internal view {\n bytes memory extra = note.transferNote.auxInfo.extraProofBoundData;\n require(_containsBurnPrefix(extra), \"Bad burn tag\");\n require(_containsBurnRecord(note), \"Bad record commitment\");\n }\n\n /// @dev Checks if a sequence of bytes contains hardcoded prefix.\n /// @param byteSeq sequence of bytes\n function _containsBurnPrefix(bytes memory byteSeq) internal pure returns (bool) {\n if (byteSeq.length < CAPE_BURN_MAGIC_BYTES_SIZE) {\n return false;\n }\n return\n BytesLib.equal(\n BytesLib.slice(byteSeq, 0, CAPE_BURN_MAGIC_BYTES_SIZE),\n CAPE_BURN_MAGIC_BYTES\n );\n }\n\n /// @dev Check if the burned record opening and the record commitment in position 1 are consistent.\n /// @param note note of type *BURN*\n function _containsBurnRecord(BurnNote memory note) internal view returns (bool) {\n if (note.transferNote.outputCommitments.length < 2) {\n return false;\n }\n uint256 rc = _deriveRecordCommitment(note.recordOpening);\n return rc == note.transferNote.outputCommitments[1];\n }\n\n /// @dev Compute the commitment of a record opening.\n /// @param ro record opening\n function _deriveRecordCommitment(RecordOpening memory ro) internal view returns (uint256 rc) {\n require(ro.assetDef.policy.revealMap < 2**12, \"Reveal map exceeds 12 bits\");\n\n // No overflow check, only 12 bits in reveal map\n uint256 revealMapAndFreezeFlag = 2 *\n ro.assetDef.policy.revealMap +\n (ro.freezeFlag ? 1 : 0);\n\n // blind in front of rest -> 13 elements, pad to 15 (5 x 3)\n uint256[15] memory inputs = [\n ro.blind,\n ro.amount,\n ro.assetDef.code,\n ro.userAddr.x,\n ro.userAddr.y,\n ro.assetDef.policy.auditorPk.x,\n ro.assetDef.policy.auditorPk.y,\n ro.assetDef.policy.credPk.x,\n ro.assetDef.policy.credPk.y,\n ro.assetDef.policy.freezerPk.x,\n ro.assetDef.policy.freezerPk.y,\n revealMapAndFreezeFlag,\n ro.assetDef.policy.revealThreshold,\n 0,\n 0\n ];\n\n return RescueLib.commit(inputs);\n }\n\n /// @dev An overloaded function (one for each note type) to prepare all inputs necessary for batch verification of the plonk proof.\n /// @param note note of type *TRANSFER*\n function _prepareForProofVerification(TransferNote memory note)\n internal\n view\n returns (\n IPlonkVerifier.VerifyingKey memory vk,\n uint256[] memory publicInput,\n IPlonkVerifier.PlonkProof memory proof,\n bytes memory transcriptInitMsg\n )\n {\n // load the correct (hardcoded) vk\n // slither-disable-next-line calls-loop\n vk = VerifyingKeys.getVkById(\n VerifyingKeys.getEncodedId(\n uint8(NoteType.TRANSFER),\n uint8(note.inputNullifiers.length),\n uint8(note.outputCommitments.length),\n uint8(_recordsMerkleTree.getHeight())\n )\n );\n // prepare public inputs\n // 4: root, native_asset_code, valid_until, fee\n // 2: audit_memo.ephemeral_key (x and y)\n publicInput = new uint256[](\n 4 +\n note.inputNullifiers.length +\n note.outputCommitments.length +\n 2 +\n note.auditMemo.data.length\n );\n publicInput[0] = note.auxInfo.merkleRoot;\n publicInput[1] = CAP_NATIVE_ASSET_CODE;\n publicInput[2] = note.auxInfo.validUntil;\n publicInput[3] = note.auxInfo.fee;\n {\n uint256 idx = 4;\n for (uint256 i = 0; i < note.inputNullifiers.length; i++) {\n publicInput[idx + i] = note.inputNullifiers[i];\n }\n idx += note.inputNullifiers.length;\n\n for (uint256 i = 0; i < note.outputCommitments.length; i++) {\n publicInput[idx + i] = note.outputCommitments[i];\n }\n idx += note.outputCommitments.length;\n\n publicInput[idx] = note.auditMemo.ephemeralKey.x;\n publicInput[idx + 1] = note.auditMemo.ephemeralKey.y;\n idx += 2;\n\n for (uint256 i = 0; i < note.auditMemo.data.length; i++) {\n publicInput[idx + i] = note.auditMemo.data[i];\n }\n }\n\n // extract out proof\n proof = note.proof;\n\n // prepare transcript init messages\n transcriptInitMsg = abi.encodePacked(\n EdOnBN254.serialize(note.auxInfo.txnMemoVerKey),\n note.auxInfo.extraProofBoundData\n );\n }\n\n /// @dev An overloaded function (one for each note type) to prepare all inputs necessary for batch verification of the plonk proof.\n /// @param note note of type *BURN*\n function _prepareForProofVerification(BurnNote memory note)\n internal\n view\n returns (\n IPlonkVerifier.VerifyingKey memory,\n uint256[] memory,\n IPlonkVerifier.PlonkProof memory,\n bytes memory\n )\n {\n return _prepareForProofVerification(note.transferNote);\n }\n\n /// @dev An overloaded function (one for each note type) to prepare all inputs necessary for batch verification of the plonk proof.\n /// @param note note of type *MINT*\n function _prepareForProofVerification(MintNote memory note)\n internal\n view\n returns (\n IPlonkVerifier.VerifyingKey memory vk,\n uint256[] memory publicInput,\n IPlonkVerifier.PlonkProof memory proof,\n bytes memory transcriptInitMsg\n )\n {\n // load the correct (hardcoded) vk\n // slither-disable-next-line calls-loop\n vk = VerifyingKeys.getVkById(\n VerifyingKeys.getEncodedId(\n uint8(NoteType.MINT),\n 1, // num of input\n 2, // num of output\n uint8(_recordsMerkleTree.getHeight())\n )\n );\n\n // prepare public inputs\n // 9: see below; 8: asset policy; rest: audit memo\n publicInput = new uint256[](9 + 8 + 2 + note.auditMemo.data.length);\n publicInput[0] = note.auxInfo.merkleRoot;\n publicInput[1] = CAP_NATIVE_ASSET_CODE;\n publicInput[2] = note.inputNullifier;\n publicInput[3] = note.auxInfo.fee;\n publicInput[4] = note.mintComm;\n publicInput[5] = note.chgComm;\n publicInput[6] = note.mintAmount;\n publicInput[7] = note.mintAssetDef.code;\n publicInput[8] = note.mintInternalAssetCode;\n\n publicInput[9] = note.mintAssetDef.policy.revealMap;\n publicInput[10] = note.mintAssetDef.policy.auditorPk.x;\n publicInput[11] = note.mintAssetDef.policy.auditorPk.y;\n publicInput[12] = note.mintAssetDef.policy.credPk.x;\n publicInput[13] = note.mintAssetDef.policy.credPk.y;\n publicInput[14] = note.mintAssetDef.policy.freezerPk.x;\n publicInput[15] = note.mintAssetDef.policy.freezerPk.y;\n publicInput[16] = note.mintAssetDef.policy.revealThreshold;\n\n {\n publicInput[17] = note.auditMemo.ephemeralKey.x;\n publicInput[18] = note.auditMemo.ephemeralKey.y;\n\n uint256 idx = 19;\n for (uint256 i = 0; i < note.auditMemo.data.length; i++) {\n publicInput[idx + i] = note.auditMemo.data[i];\n }\n }\n\n // extract out proof\n proof = note.proof;\n\n // prepare transcript init messages\n transcriptInitMsg = EdOnBN254.serialize(note.auxInfo.txnMemoVerKey);\n }\n\n /// @dev An overloaded function (one for each note type) to prepare all inputs necessary for batch verification of the plonk proof.\n /// @param note note of type *FREEZE*\n function _prepareForProofVerification(FreezeNote memory note)\n internal\n view\n returns (\n IPlonkVerifier.VerifyingKey memory vk,\n uint256[] memory publicInput,\n IPlonkVerifier.PlonkProof memory proof,\n bytes memory transcriptInitMsg\n )\n {\n // load the correct (hardcoded) vk\n // slither-disable-next-line calls-loop\n vk = VerifyingKeys.getVkById(\n VerifyingKeys.getEncodedId(\n uint8(NoteType.FREEZE),\n uint8(note.inputNullifiers.length),\n uint8(note.outputCommitments.length),\n uint8(_recordsMerkleTree.getHeight())\n )\n );\n\n // prepare public inputs\n publicInput = new uint256[](\n 3 + note.inputNullifiers.length + note.outputCommitments.length\n );\n publicInput[0] = note.auxInfo.merkleRoot;\n publicInput[1] = CAP_NATIVE_ASSET_CODE;\n publicInput[2] = note.auxInfo.fee;\n {\n uint256 idx = 3;\n for (uint256 i = 0; i < note.inputNullifiers.length; i++) {\n publicInput[idx + i] = note.inputNullifiers[i];\n }\n idx += note.inputNullifiers.length;\n\n for (uint256 i = 0; i < note.outputCommitments.length; i++) {\n publicInput[idx + i] = note.outputCommitments[i];\n }\n }\n\n // extract out proof\n proof = note.proof;\n\n // prepare transcript init messages\n transcriptInitMsg = EdOnBN254.serialize(note.auxInfo.txnMemoVerKey);\n }\n\n function getRootValue() external view returns (uint256) {\n return _recordsMerkleTree.getRootValue();\n }\n}\n" + }, + "@openzeppelin/contracts/security/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and make it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" + }, + "@rari-capital/solmate/src/utils/SafeTransferLib.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\nimport {ERC20} from \"../tokens/ERC20.sol\";\n\n/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)\n/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)\n/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.\nlibrary SafeTransferLib {\n /*///////////////////////////////////////////////////////////////\n ETH OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferETH(address to, uint256 amount) internal {\n bool callStatus;\n\n assembly {\n // Transfer the ETH and store if it succeeded or not.\n callStatus := call(gas(), to, amount, 0, 0, 0, 0)\n }\n\n require(callStatus, \"ETH_TRANSFER_FAILED\");\n }\n\n /*///////////////////////////////////////////////////////////////\n ERC20 OPERATIONS\n //////////////////////////////////////////////////////////////*/\n\n function safeTransferFrom(\n ERC20 token,\n address from,\n address to,\n uint256 amount\n ) internal {\n bool callStatus;\n\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata to memory piece by piece:\n mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\n mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"from\" argument.\n mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"to\" argument.\n mstore(add(freeMemoryPointer, 68), amount) // Finally append the \"amount\" argument. No mask as it's a full 32 byte value.\n\n // Call the token and store if it succeeded or not.\n // We use 100 because the calldata length is 4 + 32 * 3.\n callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)\n }\n\n require(didLastOptionalReturnCallSucceed(callStatus), \"TRANSFER_FROM_FAILED\");\n }\n\n function safeTransfer(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool callStatus;\n\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata to memory piece by piece:\n mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\n mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Finally append the \"amount\" argument. No mask as it's a full 32 byte value.\n\n // Call the token and store if it succeeded or not.\n // We use 68 because the calldata length is 4 + 32 * 2.\n callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)\n }\n\n require(didLastOptionalReturnCallSucceed(callStatus), \"TRANSFER_FAILED\");\n }\n\n function safeApprove(\n ERC20 token,\n address to,\n uint256 amount\n ) internal {\n bool callStatus;\n\n assembly {\n // Get a pointer to some free memory.\n let freeMemoryPointer := mload(0x40)\n\n // Write the abi-encoded calldata to memory piece by piece:\n mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.\n mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the \"to\" argument.\n mstore(add(freeMemoryPointer, 36), amount) // Finally append the \"amount\" argument. No mask as it's a full 32 byte value.\n\n // Call the token and store if it succeeded or not.\n // We use 68 because the calldata length is 4 + 32 * 2.\n callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)\n }\n\n require(didLastOptionalReturnCallSucceed(callStatus), \"APPROVE_FAILED\");\n }\n\n /*///////////////////////////////////////////////////////////////\n INTERNAL HELPER LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {\n assembly {\n // Get how many bytes the call returned.\n let returnDataSize := returndatasize()\n\n // If the call reverted:\n if iszero(callStatus) {\n // Copy the revert message into memory.\n returndatacopy(0, 0, returnDataSize)\n\n // Revert with the same message.\n revert(0, returnDataSize)\n }\n\n switch returnDataSize\n case 32 {\n // Copy the return data into memory.\n returndatacopy(0, 0, returnDataSize)\n\n // Set success to whether it returned true.\n success := iszero(iszero(mload(0)))\n }\n case 0 {\n // There was no return data.\n success := 1\n }\n default {\n // It returned some malformed input.\n success := 0\n }\n }\n }\n}\n" + }, + "solidity-bytes-utils/contracts/BytesLib.sol": { + "content": "// SPDX-License-Identifier: Unlicense\n/*\n * @title Solidity Bytes Arrays Utils\n * @author Gonçalo Sá \n *\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\n */\npragma solidity >=0.8.0 <0.9.0;\n\n\nlibrary BytesLib {\n function concat(\n bytes memory _preBytes,\n bytes memory _postBytes\n )\n internal\n pure\n returns (bytes memory)\n {\n bytes memory tempBytes;\n\n assembly {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // Store the length of the first bytes array at the beginning of\n // the memory for tempBytes.\n let length := mload(_preBytes)\n mstore(tempBytes, length)\n\n // Maintain a memory counter for the current write location in the\n // temp bytes array by adding the 32 bytes for the array length to\n // the starting location.\n let mc := add(tempBytes, 0x20)\n // Stop copying when the memory counter reaches the length of the\n // first bytes array.\n let end := add(mc, length)\n\n for {\n // Initialize a copy counter to the start of the _preBytes data,\n // 32 bytes into its memory.\n let cc := add(_preBytes, 0x20)\n } lt(mc, end) {\n // Increase both counters by 32 bytes each iteration.\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n // Write the _preBytes data into the tempBytes memory 32 bytes\n // at a time.\n mstore(mc, mload(cc))\n }\n\n // Add the length of _postBytes to the current length of tempBytes\n // and store it as the new length in the first 32 bytes of the\n // tempBytes memory.\n length := mload(_postBytes)\n mstore(tempBytes, add(length, mload(tempBytes)))\n\n // Move the memory counter back from a multiple of 0x20 to the\n // actual end of the _preBytes data.\n mc := end\n // Stop copying when the memory counter reaches the new combined\n // length of the arrays.\n end := add(mc, length)\n\n for {\n let cc := add(_postBytes, 0x20)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n // Update the free-memory pointer by padding our last write location\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\n // next 32 byte block, then round down to the nearest multiple of\n // 32. If the sum of the length of the two arrays is zero then add\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\n mstore(0x40, and(\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\n not(31) // Round down to the nearest 32 bytes.\n ))\n }\n\n return tempBytes;\n }\n\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\n assembly {\n // Read the first 32 bytes of _preBytes storage, which is the length\n // of the array. (We don't need to use the offset into the slot\n // because arrays use the entire slot.)\n let fslot := sload(_preBytes.slot)\n // Arrays of 31 bytes or less have an even value in their slot,\n // while longer arrays have an odd value. The actual length is\n // the slot divided by two for odd values, and the lowest order\n // byte divided by two for even values.\n // If the slot is even, bitwise and the slot with 255 and divide by\n // two to get the length. If the slot is odd, bitwise and the slot\n // with -1 and divide by two.\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n let mlength := mload(_postBytes)\n let newlength := add(slength, mlength)\n // slength can contain both the length and contents of the array\n // if length < 32 bytes so let's prepare for that\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n switch add(lt(slength, 32), lt(newlength, 32))\n case 2 {\n // Since the new array still fits in the slot, we just need to\n // update the contents of the slot.\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\n sstore(\n _preBytes.slot,\n // all the modifications to the slot are inside this\n // next block\n add(\n // we can just add to the slot contents because the\n // bytes we want to change are the LSBs\n fslot,\n add(\n mul(\n div(\n // load the bytes from memory\n mload(add(_postBytes, 0x20)),\n // zero all bytes to the right\n exp(0x100, sub(32, mlength))\n ),\n // and now shift left the number of bytes to\n // leave space for the length in the slot\n exp(0x100, sub(32, newlength))\n ),\n // increase length by the double of the memory\n // bytes length\n mul(mlength, 2)\n )\n )\n )\n }\n case 1 {\n // The stored value fits in the slot, but the combined value\n // will exceed it.\n // get the keccak hash to get the contents of the array\n mstore(0x0, _preBytes.slot)\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n // save new length\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\n\n // The contents of the _postBytes array start 32 bytes into\n // the structure. Our first read should obtain the `submod`\n // bytes that can fit into the unused space in the last word\n // of the stored array. To get this, we read 32 bytes starting\n // from `submod`, so the data we read overlaps with the array\n // contents by `submod` bytes. Masking the lowest-order\n // `submod` bytes allows us to add that value directly to the\n // stored value.\n\n let submod := sub(32, slength)\n let mc := add(_postBytes, submod)\n let end := add(_postBytes, mlength)\n let mask := sub(exp(0x100, submod), 1)\n\n sstore(\n sc,\n add(\n and(\n fslot,\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\n ),\n and(mload(mc), mask)\n )\n )\n\n for {\n mc := add(mc, 0x20)\n sc := add(sc, 1)\n } lt(mc, end) {\n sc := add(sc, 1)\n mc := add(mc, 0x20)\n } {\n sstore(sc, mload(mc))\n }\n\n mask := exp(0x100, sub(mc, end))\n\n sstore(sc, mul(div(mload(mc), mask), mask))\n }\n default {\n // get the keccak hash to get the contents of the array\n mstore(0x0, _preBytes.slot)\n // Start copying to the last used word of the stored array.\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\n\n // save new length\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\n\n // Copy over the first `submod` bytes of the new data as in\n // case 1 above.\n let slengthmod := mod(slength, 32)\n let mlengthmod := mod(mlength, 32)\n let submod := sub(32, slengthmod)\n let mc := add(_postBytes, submod)\n let end := add(_postBytes, mlength)\n let mask := sub(exp(0x100, submod), 1)\n\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\n\n for {\n sc := add(sc, 1)\n mc := add(mc, 0x20)\n } lt(mc, end) {\n sc := add(sc, 1)\n mc := add(mc, 0x20)\n } {\n sstore(sc, mload(mc))\n }\n\n mask := exp(0x100, sub(mc, end))\n\n sstore(sc, mul(div(mload(mc), mask), mask))\n }\n }\n }\n\n function slice(\n bytes memory _bytes,\n uint256 _start,\n uint256 _length\n )\n internal\n pure\n returns (bytes memory)\n {\n require(_length + 31 >= _length, \"slice_overflow\");\n require(_bytes.length >= _start + _length, \"slice_outOfBounds\");\n\n bytes memory tempBytes;\n\n assembly {\n switch iszero(_length)\n case 0 {\n // Get a location of some free memory and store it in tempBytes as\n // Solidity does for memory variables.\n tempBytes := mload(0x40)\n\n // The first word of the slice result is potentially a partial\n // word read from the original array. To read it, we calculate\n // the length of that partial word and start copying that many\n // bytes into the array. The first word we copy will start with\n // data we don't care about, but the last `lengthmod` bytes will\n // land at the beginning of the contents of the new array. When\n // we're done copying, we overwrite the full first word with\n // the actual length of the slice.\n let lengthmod := and(_length, 31)\n\n // The multiplication in the next line is necessary\n // because when slicing multiples of 32 bytes (lengthmod == 0)\n // the following copy loop was copying the origin's length\n // and then ending prematurely not copying everything it should.\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\n let end := add(mc, _length)\n\n for {\n // The multiplication in the next line has the same exact purpose\n // as the one above.\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\n } lt(mc, end) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n mstore(mc, mload(cc))\n }\n\n mstore(tempBytes, _length)\n\n //update free-memory pointer\n //allocating the array padded to 32 bytes like the compiler does now\n mstore(0x40, and(add(mc, 31), not(31)))\n }\n //if we want a zero-length slice let's just return a zero-length array\n default {\n tempBytes := mload(0x40)\n //zero out the 32 bytes slice we are about to return\n //we need to do it because Solidity does not garbage collect\n mstore(tempBytes, 0)\n\n mstore(0x40, add(tempBytes, 0x20))\n }\n }\n\n return tempBytes;\n }\n\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n address tempAddress;\n\n assembly {\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n }\n\n return tempAddress;\n }\n\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\n require(_bytes.length >= _start + 1 , \"toUint8_outOfBounds\");\n uint8 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x1), _start))\n }\n\n return tempUint;\n }\n\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\n require(_bytes.length >= _start + 2, \"toUint16_outOfBounds\");\n uint16 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x2), _start))\n }\n\n return tempUint;\n }\n\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\n require(_bytes.length >= _start + 4, \"toUint32_outOfBounds\");\n uint32 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x4), _start))\n }\n\n return tempUint;\n }\n\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\n require(_bytes.length >= _start + 8, \"toUint64_outOfBounds\");\n uint64 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x8), _start))\n }\n\n return tempUint;\n }\n\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\n require(_bytes.length >= _start + 12, \"toUint96_outOfBounds\");\n uint96 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0xc), _start))\n }\n\n return tempUint;\n }\n\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\n require(_bytes.length >= _start + 16, \"toUint128_outOfBounds\");\n uint128 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x10), _start))\n }\n\n return tempUint;\n }\n\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\n require(_bytes.length >= _start + 32, \"toUint256_outOfBounds\");\n uint256 tempUint;\n\n assembly {\n tempUint := mload(add(add(_bytes, 0x20), _start))\n }\n\n return tempUint;\n }\n\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\n require(_bytes.length >= _start + 32, \"toBytes32_outOfBounds\");\n bytes32 tempBytes32;\n\n assembly {\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\n }\n\n return tempBytes32;\n }\n\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\n bool success = true;\n\n assembly {\n let length := mload(_preBytes)\n\n // if lengths don't match the arrays are not equal\n switch eq(length, mload(_postBytes))\n case 1 {\n // cb is a circuit breaker in the for loop since there's\n // no said feature for inline assembly loops\n // cb = 1 - don't breaker\n // cb = 0 - break\n let cb := 1\n\n let mc := add(_preBytes, 0x20)\n let end := add(mc, length)\n\n for {\n let cc := add(_postBytes, 0x20)\n // the next line is the loop condition:\n // while(uint256(mc < end) + cb == 2)\n } eq(add(lt(mc, end), cb), 2) {\n mc := add(mc, 0x20)\n cc := add(cc, 0x20)\n } {\n // if any of these checks fails then arrays are not equal\n if iszero(eq(mload(mc), mload(cc))) {\n // unsuccess:\n success := 0\n cb := 0\n }\n }\n }\n default {\n // unsuccess:\n success := 0\n }\n }\n\n return success;\n }\n\n function equalStorage(\n bytes storage _preBytes,\n bytes memory _postBytes\n )\n internal\n view\n returns (bool)\n {\n bool success = true;\n\n assembly {\n // we know _preBytes_offset is 0\n let fslot := sload(_preBytes.slot)\n // Decode the length of the stored array like in concatStorage().\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\n let mlength := mload(_postBytes)\n\n // if lengths don't match the arrays are not equal\n switch eq(slength, mlength)\n case 1 {\n // slength can contain both the length and contents of the array\n // if length < 32 bytes so let's prepare for that\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\n if iszero(iszero(slength)) {\n switch lt(slength, 32)\n case 1 {\n // blank the last byte which is the length\n fslot := mul(div(fslot, 0x100), 0x100)\n\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\n // unsuccess:\n success := 0\n }\n }\n default {\n // cb is a circuit breaker in the for loop since there's\n // no said feature for inline assembly loops\n // cb = 1 - don't breaker\n // cb = 0 - break\n let cb := 1\n\n // get the keccak hash to get the contents of the array\n mstore(0x0, _preBytes.slot)\n let sc := keccak256(0x0, 0x20)\n\n let mc := add(_postBytes, 0x20)\n let end := add(mc, mlength)\n\n // the next line is the loop condition:\n // while(uint256(mc < end) + cb == 2)\n for {} eq(add(lt(mc, end), cb), 2) {\n sc := add(sc, 1)\n mc := add(mc, 0x20)\n } {\n if iszero(eq(sload(sc), mload(mc))) {\n // unsuccess:\n success := 0\n cb := 0\n }\n }\n }\n }\n }\n default {\n // unsuccess:\n success := 0\n }\n }\n\n return success;\n }\n}\n" + }, + "contracts/libraries/AccumulatingArray.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\n/// @title AccumulatingArray library\n/// @dev This library simplifies inserting elements into an array by keeping track\n/// of the insertion index.\n\nlibrary AccumulatingArray {\n struct Data {\n uint256[] items;\n uint256 index;\n }\n\n /// @dev Create a new AccumulatingArray\n /// @param length the number of items that will be inserted\n function create(uint256 length) internal pure returns (Data memory) {\n return Data(new uint256[](length), 0);\n }\n\n /// @param items the items to accumulate\n /// @dev Will revert if items past length are added.\n function add(Data memory self, uint256[] memory items) internal pure {\n for (uint256 i = 0; i < items.length; i++) {\n self.items[i + self.index] = items[i];\n }\n self.index += items.length;\n }\n\n /// @param item the item to accumulate.\n /// @dev Will revert if items past length are added.\n function add(Data memory self, uint256 item) internal pure {\n self.items[self.index] = item;\n self.index += 1;\n }\n\n function isEmpty(Data memory self) internal pure returns (bool) {\n return (self.index == 0);\n }\n}\n" + }, + "contracts/libraries/RescueLib.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nlibrary RescueLib {\n /// The constants are obtained from the Sage script\n /// https://github.com/EspressoSystems/Marvellous/blob/fcd4c41672f485ac2f62526bc87a16789d4d0459/rescue254.sage\n\n // These constants are no longer used, left here for readability.\n // uint256 private constant _N_ROUNDS = 12;\n // uint256 private constant _STATE_SIZE = 4;\n // uint256 private constant _SCHEDULED_KEY_SIZE = (2 * _N_ROUNDS + 1) * _STATE_SIZE;\n // uint256 private constant _ALPHA = 5;\n\n // Obtained by running KeyScheduling([0,0,0,0]). See Algorithm 2 of AT specification document.\n\n uint256 private constant _PRIME =\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n\n uint256 private constant _ALPHA_INV =\n 17510594297471420177797124596205820070838691520332827474958563349260646796493;\n\n // MDS is hardcoded\n function _linearOp(\n uint256 s0,\n uint256 s1,\n uint256 s2,\n uint256 s3\n )\n private\n pure\n returns (\n uint256,\n uint256,\n uint256,\n uint256\n )\n {\n // Matrix multiplication\n unchecked {\n return (\n mulmod(\n 21888242871839275222246405745257275088548364400416034343698204186575808479992,\n s0,\n _PRIME\n ) +\n mulmod(\n 21888242871839275222246405745257275088548364400416034343698204186575806058117,\n s1,\n _PRIME\n ) +\n mulmod(\n 21888242871839275222246405745257275088548364400416034343698204186575491214367,\n s2,\n _PRIME\n ) +\n mulmod(\n 21888242871839275222246405745257275088548364400416034343698204186535831058117,\n s3,\n _PRIME\n ),\n mulmod(19500, s0, _PRIME) +\n mulmod(3026375, s1, _PRIME) +\n mulmod(393529500, s2, _PRIME) +\n mulmod(49574560750, s3, _PRIME),\n mulmod(\n 21888242871839275222246405745257275088548364400416034343698204186575808491587,\n s0,\n _PRIME\n ) +\n mulmod(\n 21888242871839275222246405745257275088548364400416034343698204186575807886437,\n s1,\n _PRIME\n ) +\n mulmod(\n 21888242871839275222246405745257275088548364400416034343698204186575729688812,\n s2,\n _PRIME\n ) +\n mulmod(\n 21888242871839275222246405745257275088548364400416034343698204186565891044437,\n s3,\n _PRIME\n ),\n mulmod(156, s0, _PRIME) +\n mulmod(20306, s1, _PRIME) +\n mulmod(2558556, s2, _PRIME) +\n mulmod(320327931, s3, _PRIME)\n );\n }\n }\n\n function _expAlphaInv4Setup(uint256[6] memory scratch) private pure {\n assembly {\n let p := scratch\n mstore(p, 0x20) // Length of Base\n mstore(add(p, 0x20), 0x20) // Length of Exponent\n mstore(add(p, 0x40), 0x20) // Length of Modulus\n mstore(add(p, 0x80), _ALPHA_INV) // Exponent\n mstore(add(p, 0xa0), _PRIME) // Modulus\n }\n }\n\n function _expAlphaInv4(\n uint256[6] memory scratch,\n uint256 s0,\n uint256 s1,\n uint256 s2,\n uint256 s3\n )\n private\n view\n returns (\n uint256 o0,\n uint256 o1,\n uint256 o2,\n uint256 o3\n )\n {\n assembly {\n // define pointer\n let p := scratch\n let basep := add(p, 0x60)\n mstore(basep, s0) // Base\n // store data assembly-favouring ways\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\n // data\n o0 := mload(basep)\n mstore(basep, s1) // Base\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\n // data\n o1 := mload(basep)\n mstore(basep, s2) // Base\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\n // data\n o2 := mload(basep)\n mstore(basep, s3) // Base\n pop(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, basep, 0x20))\n // data\n o3 := mload(basep)\n }\n }\n\n // Computes the Rescue permutation on some input\n // Recall that the scheduled key is precomputed in our case\n // @param input input for the permutation\n // @return permutation output\n function perm(\n // slither-disable-next-line write-after-write\n uint256 s0,\n // slither-disable-next-line write-after-write\n uint256 s1,\n // slither-disable-next-line write-after-write\n uint256 s2,\n // slither-disable-next-line write-after-write\n uint256 s3\n )\n internal\n view\n returns (\n uint256,\n uint256,\n uint256,\n uint256\n )\n {\n // slither-disable-next-line uninitialized-local\n uint256[6] memory alphaInvScratch;\n\n _expAlphaInv4Setup(alphaInvScratch);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 14613516837064033601098425266946467918409544647446217386229959902054563533267,\n s1 + 376600575581954944138907282479272751264978206975465380433764825531344567663,\n s2 + 7549886658634274343394883631367643327196152481472281919735617268044202589860,\n s3 + 3682071510138521345600424597536598375718773365536872232193107639375194756918\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 18657517374128716281071590782771170166993445602755371021955596036781411817786;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 7833794394096838639430144230563403530989402760602204539559270044687522640191;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 21303828694647266539931030987057572024333442749881970102454081226349775826204;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 10601447988834057856019990466870413629636256450824419416829818546423193802418;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 3394657260998945409283098835682964352503279447198495330506177586645995289229,\n s1 + 18437084083724939316390841967750487133622937044030373241106776324730657101302,\n s2 + 9281739916935170266925270432337475828741505406943764438550188362765269530037,\n s3 + 7363758719535652813463843693256839865026387361836644774317493432208443086206\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 307094088106440279963968943984309088038734274328527845883669678290790702381;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 20802277384865839022876847241719852837518994021170013346790603773477912819001;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 19754579269464973651593381036132218829220609572271224048608091445854164824042;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 3618840933841571232310395486452077846249117988789467996234635426899783130819;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 2604166168648013711791424714498680546427073388134923208733633668316805639713,\n s1 + 21355705619901626246699129842094174300693414345856149669339147704587730744579,\n s2 + 492957643799044929042114590851019953669919577182050726596188173945730031352,\n s3 + 8495959434717951575638107349559891417392372124707619959558593515759091841138\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 15608173629791582453867933160400609222904457931922627396107815347244961625587;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 16346164988481725869223011419855264063160651334419415042919928342589111681923;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 21085652277104054699752179865196164165969290053517659864117475352262716334100;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 20640310021063232205677193759981403045043444605175178332133134865746039279935;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 6015589261538006311719125697023069952804098656652050863009463360598997670240,\n s1 + 12498423882721726012743791752811798719201859023192663855805526312393108407357,\n s2 + 10785527781711732350693172404486938622378708235957779975342240483505724965040,\n s3 + 5563181134859229953817163002660048854420912281911747312557025480927280392569\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 4585980485870975597083581718044393941512074846925247225127276913719050121968;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 8135760428078872176830812746579993820254685977237403304445687861806698035222;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 4525715538433244696411192727226186804883202134636681498489663161593606654720;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 2537497100749435007113677475828631400227339157221711397900070636998427379023;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 6957758175844522415482704083077249782181516476067074624906502033584870962925,\n s1 + 17134288156316028142861248367413235848595762718317063354217292516610545487813,\n s2 + 20912428573104312239411321877435657586184425249645076131891636094671938892815,\n s3 + 16000236205755938926858829908701623009580043315308207671921283074116709575629\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 10226182617544046880850643054874064693998595520540061157646952229134207239372;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 18584346134948015676264599354709457865255277240606855245909703396343731224626;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 9263628039314899758000383385773954136696958567872461042004915206775147151562;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 21095966719856094705113273596585696209808876361583941931684481364905087347856;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 2671157351815122058649197205531097090514563992249109660044882868649840700911,\n s1 + 19371695134219415702961622134896564229962454573253508904477489696588594622079,\n s2 + 5458968308231210904289987830881528056037123818964633914555287871152343390175,\n s3 + 7336332584551233792026746889434554547883125466404119632794862500961953384162\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 10351436748086126474964482623536554036637945319698748519226181145454116702488;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 10588209357420186457766745724579739104572139534486480334142455690083813419064;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 14330277147584936710957102218096795520430543834717433464500965846826655802131;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 20752197679372238381408962682213349118865256502118746003818603260257076802028;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 19390446529582160674621825412345750405397926216690583196542690617266028463414,\n s1 + 4169994013656329171830126793466321040216273832271989491631696813297571003664,\n s2 + 3014817248268674641565961681956715664833306954478820029563459099892548946802,\n s3 + 14285412497877984113655094566695921704826935980354186365694472961163628072901\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 16224484149774307577146165975762490690838415946665379067259822320752729067513;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 5404416528124718330316441408560295270695591369912905197499507811036327404407;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 20127204244332635127213425090893250761286848618448128307344971109698523903374;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 14939477686176063572999014162186372798386193194442661892600584389296609365740;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 183740587182448242823071506013879595265109215202349952517434740768878294134,\n s1 + 15366166801397358994305040367078329374182896694582870542425225835844885654667,\n s2 + 10066796014802701613007252979619633540090232697942390802486559078446300507813,\n s3 + 4824035239925904398047276123907644574421550988870123756876333092498925242854\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 5526416022516734657935645023952329824887761902324086126076396040056459740202;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 18157816292703983306114736850721419851645159304249709756659476015594698876611;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 767446206481623130855439732549764381286210118638028499466788453347759203223;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 16303412231051555792435190427637047658258796056382698277687500021321460387129;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 15475465085113677237835653765189267963435264152924949727326000496982746660612,\n s1 + 14574823710073720047190393602502575509282844662732045439760066078137662816054,\n s2 + 13746490178929963947720756220409862158443939172096620003896874772477437733602,\n s3 + 13804898145881881347835367366352189037341704254740510664318597456840481739975\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 3523599105403569319090449327691358425990456728660349400211678603795116364226;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 8632053982708637954870974502506145434219829622278773822242070316888003350278;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 20293222318844554840191640739970825558851264905959070636369796127300969629060;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 7583204376683983181255811699503668584283525661852773339144064901897953897564;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 7562572155566079175343789986900217168516831778275127159068657756836798778249,\n s1 + 12689811910161401007144285031988539999455902164332232460061366402869461973371,\n s2 + 21878400680687418538050108788381481970431106443696421074205107984690362920637,\n s3 + 3428721187625124675258692786364137915132424621324969246210899039774126165479\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 2552744099402346352193097862110515290335034445517764751557635302899937367219;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 13706727374402840004346872704605212996406886221231239230397976011930486183550;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 19786308443934570499119114884492461847023732197118902978413499381102456961966;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 11767081169862697956461405434786280425108140215784390008330611807075539962898;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 1273319740931699377003430019539548781935202579355152343831464213279794249000,\n s1 + 20225620070386241931202098463018472034137960205721651875253423327929063224115,\n s2 + 13107884970924459680133954992354588464904218518440707039430314610799573960437,\n s3 + 10574066469653966216567896842413898230152427846140046825523989742590727910280\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 21386271527766270535632132320974945129946865648321206442664310421414128279311;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 15743262855527118149527268525857865250723531109306484598629175225221686341453;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 16251140915157602891864152518526119259367827194524273940185283798897653655734;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 5420158299017134702074915284768041702367316125403978919545323705661634647751;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n (s0, s1, s2, s3) = _expAlphaInv4(\n alphaInvScratch,\n s0 + 14555572526833606349832007897859411042036463045080050783981107823326880950231,\n s1 + 15234942318869557310939446038663331226792664588406507247341043508129993934298,\n s2 + 19560004467494472556570844694553210033340577742756929194362924850760034377042,\n s3 + 21851693551359717578445799046408060941161959589978077352548456186528047792150\n );\n }\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n uint256 tmp = s0 +\n 19076469206110044175016166349949136119962165667268661130584159239385341119621;\n s0 = mulmod(tmp, tmp, _PRIME);\n s0 = mulmod(s0, s0, _PRIME);\n s0 = mulmod(s0, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s1 +\n 19132104531774396501521959463346904008488403861940301898725725957519076019017;\n s1 = mulmod(tmp, tmp, _PRIME);\n s1 = mulmod(s1, s1, _PRIME);\n s1 = mulmod(s1, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s2 +\n 6606159937109409334959297158878571243749055026127553188405933692223704734040;\n s2 = mulmod(tmp, tmp, _PRIME);\n s2 = mulmod(s2, s2, _PRIME);\n s2 = mulmod(s2, tmp, _PRIME);\n }\n unchecked {\n uint256 tmp = s3 +\n 13442678592538344046772867528443594004918096722084104155946229264098946917042;\n s3 = mulmod(tmp, tmp, _PRIME);\n s3 = mulmod(s3, s3, _PRIME);\n s3 = mulmod(s3, tmp, _PRIME);\n }\n\n (s0, s1, s2, s3) = _linearOp(s0, s1, s2, s3);\n\n unchecked {\n return (\n s0 + 11975757366382164299373991853632416786161357061467425182041988114491638264212,\n s1 + 10571372363668414752587603575617060708758897046929321941050113299303675014148,\n s2 + 5405426474713644587066466463343175633538103521677501186003868914920014287031,\n s3 + 18665277628144856329335676361545218245401014824195451740181902217370165017984\n );\n }\n }\n\n // Computes the hash of three field elements and returns a single element\n // In our case the rate is 3 and the capacity is 1\n // This hash function the one used in the Records Merkle tree.\n // @param a first element\n // @param b second element\n // @param c third element\n // @return the first element of the Rescue state\n function hash(\n uint256 a,\n uint256 b,\n uint256 c\n ) public view returns (uint256 o) {\n (o, a, b, c) = perm(a % _PRIME, b % _PRIME, c % _PRIME, 0);\n o %= _PRIME;\n }\n\n function checkBounded(uint256[15] memory inputs) internal pure {\n for (uint256 i = 0; i < inputs.length; ++i) {\n require(inputs[i] < _PRIME, \"inputs must be below _PRIME\");\n }\n }\n\n // This function is external to ensure that the solidity compiler generates\n // a separate library contract. This is required to reduce the size of the\n // CAPE contract.\n function commit(uint256[15] memory inputs) external view returns (uint256) {\n checkBounded(inputs);\n\n uint256 a;\n uint256 b;\n uint256 c;\n uint256 d;\n\n for (uint256 i = 0; i < 5; i++) {\n unchecked {\n (a, b, c, d) = perm(\n (a + inputs[3 * i + 0]) % _PRIME,\n (b + inputs[3 * i + 1]) % _PRIME,\n (c + inputs[3 * i + 2]) % _PRIME,\n d\n );\n\n (a, b, c, d) = (a % _PRIME, b % _PRIME, c % _PRIME, d % _PRIME);\n }\n }\n\n return a;\n }\n}\n" + }, + "contracts/libraries/VerifyingKeys.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport \"./Transfer1In2Out24DepthVk.sol\";\nimport \"./Transfer2In2Out24DepthVk.sol\";\nimport \"./Transfer2In3Out24DepthVk.sol\";\nimport \"./Transfer3In3Out24DepthVk.sol\";\nimport \"./Mint1In2Out24DepthVk.sol\";\nimport \"./Freeze2In2Out24DepthVk.sol\";\nimport \"./Freeze3In3Out24DepthVk.sol\";\n\nlibrary VerifyingKeys {\n function getVkById(uint256 encodedId)\n external\n pure\n returns (IPlonkVerifier.VerifyingKey memory)\n {\n if (encodedId == getEncodedId(0, 1, 2, 24)) {\n // transfer/burn-1-input-2-output-24-depth\n return Transfer1In2Out24DepthVk.getVk();\n } else if (encodedId == getEncodedId(0, 2, 2, 24)) {\n // transfer/burn-2-input-2-output-24-depth\n return Transfer2In2Out24DepthVk.getVk();\n } else if (encodedId == getEncodedId(0, 2, 3, 24)) {\n // transfer/burn-2-input-3-output-24-depth\n return Transfer2In3Out24DepthVk.getVk();\n } else if (encodedId == getEncodedId(0, 3, 3, 24)) {\n // transfer/burn-3-input-3-output-24-depth\n return Transfer3In3Out24DepthVk.getVk();\n } else if (encodedId == getEncodedId(1, 1, 2, 24)) {\n // mint-1-input-2-output-24-depth\n return Mint1In2Out24DepthVk.getVk();\n } else if (encodedId == getEncodedId(2, 2, 2, 24)) {\n // freeze-2-input-2-output-24-depth\n return Freeze2In2Out24DepthVk.getVk();\n } else if (encodedId == getEncodedId(2, 3, 3, 24)) {\n // freeze-3-input-3-output-24-depth\n return Freeze3In3Out24DepthVk.getVk();\n } else {\n revert(\"Unknown vk ID\");\n }\n }\n\n // returns (noteType, numInput, numOutput, treeDepth) as a 4*8 = 32 byte = uint256\n // as the encoded ID.\n function getEncodedId(\n uint8 noteType,\n uint8 numInput,\n uint8 numOutput,\n uint8 treeDepth\n ) public pure returns (uint256 encodedId) {\n assembly {\n encodedId := add(\n shl(24, noteType),\n add(shl(16, numInput), add(shl(8, numOutput), treeDepth))\n )\n }\n }\n}\n" + }, + "contracts/interfaces/IPlonkVerifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"../libraries/BN254.sol\";\n\ninterface IPlonkVerifier {\n // Flatten out TurboPlonk proof\n struct PlonkProof {\n // the first 5 are 4 inputs and 1 output wire poly commmitments\n // i.e., batch_proof.wires_poly_comms_vec.iter()\n // wire0 is 32 bytes which is a pointer to BN254.G1Point\n BN254.G1Point wire0; // 0x00\n BN254.G1Point wire1; // 0x20\n BN254.G1Point wire2; // 0x40\n BN254.G1Point wire3; // 0x60\n BN254.G1Point wire4; // 0x80\n // the next one is the product permutation poly commitment\n // i.e., batch_proof.prod_perm_poly_comms_vec.iter()\n BN254.G1Point prodPerm; // 0xA0\n // the next 5 are split quotient poly commmitments\n // i.e., batch_proof.split_quot_poly_comms\n BN254.G1Point split0; // 0xC0\n BN254.G1Point split1; // 0xE0\n BN254.G1Point split2; // 0x100\n BN254.G1Point split3; // 0x120\n BN254.G1Point split4; // 0x140\n // witness poly com for aggregated opening at `zeta`\n // i.e., batch_proof.opening_proof\n BN254.G1Point zeta; // 0x160\n // witness poly com for shifted opening at `zeta * \\omega`\n // i.e., batch_proof.shifted_opening_proof\n BN254.G1Point zetaOmega; // 0x180\n // wire poly eval at `zeta`\n uint256 wireEval0; // 0x1A0\n uint256 wireEval1; // 0x1C0\n uint256 wireEval2; // 0x1E0\n uint256 wireEval3; // 0x200\n uint256 wireEval4; // 0x220\n // extended permutation (sigma) poly eval at `zeta`\n // last (sigmaEval4) is saved by Maller Optimization\n uint256 sigmaEval0; // 0x240\n uint256 sigmaEval1; // 0x260\n uint256 sigmaEval2; // 0x280\n uint256 sigmaEval3; // 0x2A0\n // product permutation poly eval at `zeta * \\omega`\n uint256 prodPermZetaOmegaEval; // 0x2C0\n }\n\n // The verifying key for Plonk proofs.\n struct VerifyingKey {\n uint256 domainSize; // 0x00\n uint256 numInputs; // 0x20\n // commitment to extended perm (sigma) poly\n BN254.G1Point sigma0; // 0x40\n BN254.G1Point sigma1; // 0x60\n BN254.G1Point sigma2; // 0x80\n BN254.G1Point sigma3; // 0xA0\n BN254.G1Point sigma4; // 0xC0\n // commitment to selector poly\n // first 4 are linear combination selector\n BN254.G1Point q1; // 0xE0\n BN254.G1Point q2; // 0x100\n BN254.G1Point q3; // 0x120\n BN254.G1Point q4; // 0x140\n // multiplication selector for 1st, 2nd wire\n BN254.G1Point qM12; // 0x160\n // multiplication selector for 3rd, 4th wire\n BN254.G1Point qM34; // 0x180\n // output selector\n BN254.G1Point qO; // 0x1A0\n // constant term selector\n BN254.G1Point qC; // 0x1C0\n // rescue selector qH1 * w_ai^5\n BN254.G1Point qH1; // 0x1E0\n // rescue selector qH2 * w_bi^5\n BN254.G1Point qH2; // 0x200\n // rescue selector qH3 * w_ci^5\n BN254.G1Point qH3; // 0x220\n // rescue selector qH4 * w_di^5\n BN254.G1Point qH4; // 0x240\n // elliptic curve selector\n BN254.G1Point qEcc; // 0x260\n }\n\n /// @dev Batch verify multiple TurboPlonk proofs.\n /// @param verifyingKeys An array of verifying keys\n /// @param publicInputs A two-dimensional array of public inputs.\n /// @param proofs An array of Plonk proofs\n /// @param extraTranscriptInitMsgs An array of bytes from\n /// transcript initialization messages\n /// @return _ A boolean that is true for successful verification, false otherwise\n function batchVerify(\n VerifyingKey[] memory verifyingKeys,\n uint256[][] memory publicInputs,\n PlonkProof[] memory proofs,\n bytes[] memory extraTranscriptInitMsgs\n ) external view returns (bool);\n}\n" + }, + "contracts/interfaces/IRecordsMerkleTree.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\ninterface IRecordsMerkleTree {\n /// @param elements The list of elements to be appended to the current merkle tree described by the frontier.\n function updateRecordsMerkleTree(uint256[] memory elements) external;\n\n /// @notice Returns the root value of the Merkle tree.\n function getRootValue() external view returns (uint256);\n\n /// @notice Returns the height of the Merkle tree.\n function getHeight() external view returns (uint8);\n\n /// @notice Returns the number of leaves of the Merkle tree.\n function getNumLeaves() external view returns (uint64);\n}\n" + }, + "contracts/RootStore.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\ncontract RootStore {\n uint256[] internal _roots;\n mapping(uint256 => bool) internal _rootsMap;\n uint64 internal _writeHead;\n\n /// @dev Create a root store.\n /// @param nRoots The maximum number of roots to store\n constructor(uint64 nRoots) {\n // Set up the circular buffer for handling the last N roots\n require(nRoots > 1, \"A least 2 roots required\");\n\n _roots = new uint256[](nRoots);\n\n // Initially all roots are set to zero.\n // This value is such that no adversary can extend a branch from this root node.\n // See proposition 2, page 48 of the AT-Spec document EspressoSystems/AT-spec@01f71ce\n }\n\n /// @dev Add a root value. Only keep the latest nRoots ones.\n /// @param newRoot The value of the new root\n function _addRoot(uint256 newRoot) internal {\n require(!_rootsMap[newRoot], \"Root already exists\");\n\n // Ensure the root we will \"overwrite\" is removed.\n _rootsMap[_roots[_writeHead]] = false;\n\n _roots[_writeHead] = newRoot;\n _rootsMap[newRoot] = true;\n\n _writeHead = (_writeHead + 1) % uint64(_roots.length);\n }\n\n /// @dev Is the root value contained in the store?\n /// @param root The root value to find\n /// @return _ True if the root value is in the store, false otherwise\n function _containsRoot(uint256 root) internal view returns (bool) {\n return _rootsMap[root];\n }\n\n /// @dev Raise an exception if the root is not present in the store.\n /// @param root The required root value\n function _checkContainsRoot(uint256 root) internal view {\n require(_containsRoot(root), \"Root not found\");\n }\n}\n" + }, + "@rari-capital/solmate/src/tokens/ERC20.sol": { + "content": "// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0;\n\n/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)\n/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\nabstract contract ERC20 {\n /*///////////////////////////////////////////////////////////////\n EVENTS\n //////////////////////////////////////////////////////////////*/\n\n event Transfer(address indexed from, address indexed to, uint256 amount);\n\n event Approval(address indexed owner, address indexed spender, uint256 amount);\n\n /*///////////////////////////////////////////////////////////////\n METADATA STORAGE\n //////////////////////////////////////////////////////////////*/\n\n string public name;\n\n string public symbol;\n\n uint8 public immutable decimals;\n\n /*///////////////////////////////////////////////////////////////\n ERC20 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n uint256 public totalSupply;\n\n mapping(address => uint256) public balanceOf;\n\n mapping(address => mapping(address => uint256)) public allowance;\n\n /*///////////////////////////////////////////////////////////////\n EIP-2612 STORAGE\n //////////////////////////////////////////////////////////////*/\n\n bytes32 public constant PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n\n uint256 internal immutable INITIAL_CHAIN_ID;\n\n bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;\n\n mapping(address => uint256) public nonces;\n\n /*///////////////////////////////////////////////////////////////\n CONSTRUCTOR\n //////////////////////////////////////////////////////////////*/\n\n constructor(\n string memory _name,\n string memory _symbol,\n uint8 _decimals\n ) {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n\n INITIAL_CHAIN_ID = block.chainid;\n INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();\n }\n\n /*///////////////////////////////////////////////////////////////\n ERC20 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function approve(address spender, uint256 amount) public virtual returns (bool) {\n allowance[msg.sender][spender] = amount;\n\n emit Approval(msg.sender, spender, amount);\n\n return true;\n }\n\n function transfer(address to, uint256 amount) public virtual returns (bool) {\n balanceOf[msg.sender] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(msg.sender, to, amount);\n\n return true;\n }\n\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual returns (bool) {\n uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.\n\n if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;\n\n balanceOf[from] -= amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n return true;\n }\n\n /*///////////////////////////////////////////////////////////////\n EIP-2612 LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual {\n require(deadline >= block.timestamp, \"PERMIT_DEADLINE_EXPIRED\");\n\n // Unchecked because the only math done is incrementing\n // the owner's nonce which cannot realistically overflow.\n unchecked {\n bytes32 digest = keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n DOMAIN_SEPARATOR(),\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))\n )\n );\n\n address recoveredAddress = ecrecover(digest, v, r, s);\n\n require(recoveredAddress != address(0) && recoveredAddress == owner, \"INVALID_SIGNER\");\n\n allowance[recoveredAddress][spender] = value;\n }\n\n emit Approval(owner, spender, value);\n }\n\n function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {\n return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();\n }\n\n function computeDomainSeparator() internal view virtual returns (bytes32) {\n return\n keccak256(\n abi.encode(\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n keccak256(bytes(name)),\n keccak256(\"1\"),\n block.chainid,\n address(this)\n )\n );\n }\n\n /*///////////////////////////////////////////////////////////////\n INTERNAL MINT/BURN LOGIC\n //////////////////////////////////////////////////////////////*/\n\n function _mint(address to, uint256 amount) internal virtual {\n totalSupply += amount;\n\n // Cannot overflow because the sum of all user\n // balances can't exceed the max uint256 value.\n unchecked {\n balanceOf[to] += amount;\n }\n\n emit Transfer(address(0), to, amount);\n }\n\n function _burn(address from, uint256 amount) internal virtual {\n balanceOf[from] -= amount;\n\n // Cannot underflow because a user's balance\n // will never be larger than the total supply.\n unchecked {\n totalSupply -= amount;\n }\n\n emit Transfer(from, address(0), amount);\n }\n}\n" + }, + "contracts/libraries/Transfer1In2Out24DepthVk.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\npragma solidity ^0.8.0;\n\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport \"./BN254.sol\";\n\nlibrary Transfer1In2Out24DepthVk {\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\n assembly {\n // domain size\n mstore(vk, 32768)\n // num of public inputs\n mstore(add(vk, 0x20), 14)\n\n // sigma0\n mstore(\n mload(add(vk, 0x40)),\n 6451930258054036397165544866644311272180786776693649154889113517935138989324\n )\n mstore(\n add(mload(add(vk, 0x40)), 0x20),\n 15824498031290932840309269587075035510403426361110328301862825820425402064333\n )\n // sigma1\n mstore(\n mload(add(vk, 0x60)),\n 16567945706248183214406921539823721483157024902030706018155219832331943151521\n )\n mstore(\n add(mload(add(vk, 0x60)), 0x20),\n 14506648136467119081958160505454685757895812203258866143116417397069305366174\n )\n // sigma2\n mstore(\n mload(add(vk, 0x80)),\n 16908805137848644970538829805684573945187052776129406508429516788865993229946\n )\n mstore(\n add(mload(add(vk, 0x80)), 0x20),\n 13370902069114408370627021011309095482019563080650295231694581484651030202227\n )\n // sigma3\n mstore(\n mload(add(vk, 0xa0)),\n 11385428061273012554614867838291301202096376350855764984558871671579621291507\n )\n mstore(\n add(mload(add(vk, 0xa0)), 0x20),\n 18938480909096008246537758317235530495583632544865390355616243879170108311037\n )\n // sigma4\n mstore(\n mload(add(vk, 0xc0)),\n 7250836052061444170671162428779548720754588271620290284029438087321333136859\n )\n mstore(\n add(mload(add(vk, 0xc0)), 0x20),\n 9774478170511284714380468511107372909275276960243638784016266344709965751507\n )\n\n // q1\n mstore(\n mload(add(vk, 0xe0)),\n 2164661706057106993702119971892524764909406587180616475316536801798272746351\n )\n mstore(\n add(mload(add(vk, 0xe0)), 0x20),\n 7993083931046493938644389635874939373576598203553188654440768055247347522377\n )\n // q2\n mstore(\n mload(add(vk, 0x100)),\n 17875027092910639802264620931724329796279457509298747494670931666396434012177\n )\n mstore(\n add(mload(add(vk, 0x100)), 0x20),\n 12276180841132702377773827582398158204508221552359644390751974783173207949116\n )\n // q3\n mstore(\n mload(add(vk, 0x120)),\n 6923045257159434019788850173231395134054684072354814328515094196682490129996\n )\n mstore(\n add(mload(add(vk, 0x120)), 0x20),\n 10297389981574891432841377306749459633586002482842974197875786670892058142179\n )\n // q4\n mstore(\n mload(add(vk, 0x140)),\n 13566140293342467207563198706820126266175769850278450464476746689910443370750\n )\n mstore(\n add(mload(add(vk, 0x140)), 0x20),\n 4337013617009771491102950113766314929630396941539697665107262932887431611820\n )\n\n // qM12\n mstore(\n mload(add(vk, 0x160)),\n 19545356440018631139549838928930231615194677294299230322568967706100221743452\n )\n mstore(\n add(mload(add(vk, 0x160)), 0x20),\n 3905268653568739552774781017975590296651581349403516285498718251384231803637\n )\n // qM34\n mstore(\n mload(add(vk, 0x180)),\n 3633513776458243190609011598510312470369153119749343878250857605063953894824\n )\n mstore(\n add(mload(add(vk, 0x180)), 0x20),\n 10348854780537633653024803962077925757963724802390956695225993897601858375068\n )\n\n // qO\n mstore(\n mload(add(vk, 0x1a0)),\n 10515123958235902109894586452633863486298290064878690665500349352367945576213\n )\n mstore(\n add(mload(add(vk, 0x1a0)), 0x20),\n 20835963785046732330293306231553834880816750576829504030205004088050809531737\n )\n // qC\n mstore(\n mload(add(vk, 0x1c0)),\n 10349250837084111252673833558497412287345352572732754388450385078539897036072\n )\n mstore(\n add(mload(add(vk, 0x1c0)), 0x20),\n 1295954576893766564415821998145161393110346678014886452040838119568563355556\n )\n // qH1\n mstore(\n mload(add(vk, 0x1e0)),\n 18595738613642013642528283665640490180800278502934355301953048187579782737773\n )\n mstore(\n add(mload(add(vk, 0x1e0)), 0x20),\n 5708601727819525671780050950771464619626673626810479676243974296923430650735\n )\n // qH2\n mstore(\n mload(add(vk, 0x200)),\n 8105844768413379370590866345497514518639783589779028631263566798017351944465\n )\n mstore(\n add(mload(add(vk, 0x200)), 0x20),\n 13767799708582015119198203890136804463714948257729839866946279972890684141171\n )\n // qH3\n mstore(\n mload(add(vk, 0x220)),\n 13976995316216184532948677497270469464100744949177652840098916826286666391978\n )\n mstore(\n add(mload(add(vk, 0x220)), 0x20),\n 8782060747227562892357029272916715317651514559557103332761644499318601665300\n )\n // qH4\n mstore(\n mload(add(vk, 0x240)),\n 10423258206189675762927713311069351374538317153673220039972782365668263479097\n )\n mstore(\n add(mload(add(vk, 0x240)), 0x20),\n 12712089727236847935392559371166622501626155101609755726562266635070650647609\n )\n // qEcc\n mstore(\n mload(add(vk, 0x260)),\n 3447947975392962233948092031223758925923495365282112464857270024948603045088\n )\n mstore(\n add(mload(add(vk, 0x260)), 0x20),\n 4655198050073279486560411245172865913095816956325221266986314415391129730949\n )\n }\n }\n}\n" + }, + "contracts/libraries/Transfer2In2Out24DepthVk.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\npragma solidity ^0.8.0;\n\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport \"./BN254.sol\";\n\nlibrary Transfer2In2Out24DepthVk {\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\n assembly {\n // domain size\n mstore(vk, 32768)\n // num of public inputs\n mstore(add(vk, 0x20), 27)\n\n // sigma0\n mstore(\n mload(add(vk, 0x40)),\n 2353344940323935826134936223947938042521909475033774928828281661731550798722\n )\n mstore(\n add(mload(add(vk, 0x40)), 0x20),\n 9746655158250922067275109215926891774244956160343543537816404835253168644024\n )\n // sigma1\n mstore(\n mload(add(vk, 0x60)),\n 15455409296542685326830249024223724266624290984578410657713086954481835262616\n )\n mstore(\n add(mload(add(vk, 0x60)), 0x20),\n 18311379816054123251097409624258299432408683566103718315014121691958807960547\n )\n // sigma2\n mstore(\n mload(add(vk, 0x80)),\n 3595102568308999621710931895728700858137670894580826466196432246884451756647\n )\n mstore(\n add(mload(add(vk, 0x80)), 0x20),\n 5971868016111020985417776938700261612639243638290968867440360355753182506016\n )\n // sigma3\n mstore(\n mload(add(vk, 0xa0)),\n 12443289603239702012200478229424802817855243081906319312702825218898138895946\n )\n mstore(\n add(mload(add(vk, 0xa0)), 0x20),\n 14108881420049829870828878537593066975275378607590487898362908473190089969939\n )\n // sigma4\n mstore(\n mload(add(vk, 0xc0)),\n 19679657199741651524390089978450662678686454680964744364368691879627016432652\n )\n mstore(\n add(mload(add(vk, 0xc0)), 0x20),\n 17114067594856558864780849616452660298251042000563020846487894545389438664806\n )\n\n // q1\n mstore(\n mload(add(vk, 0xe0)),\n 4521205613646422234630873762189179209607994647697100090154823061235920789353\n )\n mstore(\n add(mload(add(vk, 0xe0)), 0x20),\n 16106449496625400183304424755719536524421029289605758534728292280016648447637\n )\n // q2\n mstore(\n mload(add(vk, 0x100)),\n 15558337488326969806891656016031810341177100586194811207644366322955582958290\n )\n mstore(\n add(mload(add(vk, 0x100)), 0x20),\n 154404024660163916069895563430486111291743096749375581648108814279740019496\n )\n // q3\n mstore(\n mload(add(vk, 0x120)),\n 10968315091130697826739702003431871061194509005508422925553623050382577326217\n )\n mstore(\n add(mload(add(vk, 0x120)), 0x20),\n 15427520064071248215056685014173235486104450904391795026852773491856938894709\n )\n // q4\n mstore(\n mload(add(vk, 0x140)),\n 18552120566932429867086353275996329695634259700395564758868503989836119743976\n )\n mstore(\n add(mload(add(vk, 0x140)), 0x20),\n 3758067104786429430903075307629079520236919298153864746942709833835554967358\n )\n\n // qM12\n mstore(\n mload(add(vk, 0x160)),\n 15572105585408879365916525794377657194208962207139936775774251314043834098564\n )\n mstore(\n add(mload(add(vk, 0x160)), 0x20),\n 6020958592977720912767721649577520866900127639444801108025166566775601659967\n )\n // qM34\n mstore(\n mload(add(vk, 0x180)),\n 7222736374399006211510699304087942059126683193629769887877014686905908945806\n )\n mstore(\n add(mload(add(vk, 0x180)), 0x20),\n 3206829195840321731462512861208486643839466222481973961857037286401683735687\n )\n\n // qO\n mstore(\n mload(add(vk, 0x1a0)),\n 3354591448826521438380040598853232839565248677422944332090180952953080366288\n )\n mstore(\n add(mload(add(vk, 0x1a0)), 0x20),\n 19963668090281374431317017250026510351550118984869870738585126468447913244591\n )\n // qC\n mstore(\n mload(add(vk, 0x1c0)),\n 17974807300702948996049252322259229942746003444136224778640009295566243156501\n )\n mstore(\n add(mload(add(vk, 0x1c0)), 0x20),\n 12052046477897583522878740699736101759681160588792932192885758224246430725626\n )\n // qH1\n mstore(\n mload(add(vk, 0x1e0)),\n 4921034593166626300651198249205635549101612701433540517476055976860959484949\n )\n mstore(\n add(mload(add(vk, 0x1e0)), 0x20),\n 10185405862489710856496932329182422458788356942668474473592359869600739434412\n )\n // qH2\n mstore(\n mload(add(vk, 0x200)),\n 5878093886505576171449048465070377785955067968838740459103515014923390639639\n )\n mstore(\n add(mload(add(vk, 0x200)), 0x20),\n 15259888626953734049577795735967576333281508824947666542918638019623811781546\n )\n // qH3\n mstore(\n mload(add(vk, 0x220)),\n 19643669610230135658961129468905806322162637394453939877922249528939594418232\n )\n mstore(\n add(mload(add(vk, 0x220)), 0x20),\n 12224852444220822793589818921506014057813793178254991680570188956045824616826\n )\n // qH4\n mstore(\n mload(add(vk, 0x240)),\n 6641963433101155753834035944397107424954075034582038862756599997819459513127\n )\n mstore(\n add(mload(add(vk, 0x240)), 0x20),\n 3589782713125700501109156506560851754947305163593203470270968608024453926281\n )\n // qEcc\n mstore(\n mload(add(vk, 0x260)),\n 12330486534063835148740124350008103247243211222952306312071501975705307117092\n )\n mstore(\n add(mload(add(vk, 0x260)), 0x20),\n 20509504091296584456523257770792088853619865130173628006197630419037120651742\n )\n }\n }\n}\n" + }, + "contracts/libraries/Transfer2In3Out24DepthVk.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\npragma solidity ^0.8.0;\n\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport \"./BN254.sol\";\n\nlibrary Transfer2In3Out24DepthVk {\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\n assembly {\n // domain size\n mstore(vk, 32768)\n // num of public inputs\n mstore(add(vk, 0x20), 32)\n\n // sigma0\n mstore(\n mload(add(vk, 0x40)),\n 11238918059962060895836660665905685183821438171673788872298187887301460117949\n )\n mstore(\n add(mload(add(vk, 0x40)), 0x20),\n 10312536098428436059770058647883007948230826032311055958980103002216444398029\n )\n // sigma1\n mstore(\n mload(add(vk, 0x60)),\n 3069296210454062532812049058888182398466997742713116483712055777740542557095\n )\n mstore(\n add(mload(add(vk, 0x60)), 0x20),\n 10585452901889142818220136732592206035573929406563129602198941778025261934559\n )\n // sigma2\n mstore(\n mload(add(vk, 0x80)),\n 49796010413150322443747223871067686918728570624660232645490911700120682624\n )\n mstore(\n add(mload(add(vk, 0x80)), 0x20),\n 19418979289570937603858876101332413214999751685423780259104815571219376501897\n )\n // sigma3\n mstore(\n mload(add(vk, 0xa0)),\n 5017549683124968830897329522528615084825569869584518140023215913256996665369\n )\n mstore(\n add(mload(add(vk, 0xa0)), 0x20),\n 6904459746270415738591583761210331008369254540754508554401155557939093240173\n )\n // sigma4\n mstore(\n mload(add(vk, 0xc0)),\n 15294346261666962115813163162624127728984137808463913539428567756274357657589\n )\n mstore(\n add(mload(add(vk, 0xc0)), 0x20),\n 6335459220235140110171052568798094575702073047123843498885605762024671566976\n )\n\n // q1\n mstore(\n mload(add(vk, 0xe0)),\n 3447729854865352811909348476580581256116229886577313169808953699321178547567\n )\n mstore(\n add(mload(add(vk, 0xe0)), 0x20),\n 10391923178665150678480226437763860904879593811452327022884721625331046561649\n )\n // q2\n mstore(\n mload(add(vk, 0x100)),\n 21331037483834702908326522885638199264097608653827628146912836859219217391521\n )\n mstore(\n add(mload(add(vk, 0x100)), 0x20),\n 17700979571500030343918100715185217716266526246917146097813330984808052588149\n )\n // q3\n mstore(\n mload(add(vk, 0x120)),\n 19231315187566819499805706567670055518295048760424962411545826184537652443122\n )\n mstore(\n add(mload(add(vk, 0x120)), 0x20),\n 1786951957014031658307434161704132339929023647859863721152324287915947831283\n )\n // q4\n mstore(\n mload(add(vk, 0x140)),\n 891318259297166657950777135402426115367536796891436125685210585889035809375\n )\n mstore(\n add(mload(add(vk, 0x140)), 0x20),\n 19080042747384460176894767057995469942920956949014313980914237214240134307208\n )\n\n // qM12\n mstore(\n mload(add(vk, 0x160)),\n 8600864573298799022763786653218006387353791810267845686055695121259061041328\n )\n mstore(\n add(mload(add(vk, 0x160)), 0x20),\n 16693779427169671344028720673356223282089909563990595319572224701304611776922\n )\n // qM34\n mstore(\n mload(add(vk, 0x180)),\n 9157681660736307225301034938839156685740016704526090406950858434609030225480\n )\n mstore(\n add(mload(add(vk, 0x180)), 0x20),\n 8030757918449598333025173041225419314601924784825356372892442933863889091921\n )\n\n // qO\n mstore(\n mload(add(vk, 0x1a0)),\n 13640927194155719878577037989318164230713264172921393074620679102349279698839\n )\n mstore(\n add(mload(add(vk, 0x1a0)), 0x20),\n 6900604409783116559678606532527525488965021296050678826316410961047810748517\n )\n // qC\n mstore(\n mload(add(vk, 0x1c0)),\n 5252746067177671060986834545182465389119363624955154280966570801582394785840\n )\n mstore(\n add(mload(add(vk, 0x1c0)), 0x20),\n 9195131821976884258765963928166452788332100806625752840914173681395711439614\n )\n // qH1\n mstore(\n mload(add(vk, 0x1e0)),\n 14977645969508065057243931947507598769856801213808952261859994787935726005589\n )\n mstore(\n add(mload(add(vk, 0x1e0)), 0x20),\n 5096294777527669951530261927053173270421982090354495165464932330992574194565\n )\n // qH2\n mstore(\n mload(add(vk, 0x200)),\n 3545567189598828405425832938456307851398759232755240447556204001745014820301\n )\n mstore(\n add(mload(add(vk, 0x200)), 0x20),\n 1941523779920680020402590579224743136261147114116204389037553310789640138016\n )\n // qH3\n mstore(\n mload(add(vk, 0x220)),\n 18752226702425153987309996103585848095327330331398325134534482624274124156372\n )\n mstore(\n add(mload(add(vk, 0x220)), 0x20),\n 11041340585339071070596363521057299677913989755036511157364732122494432877984\n )\n // qH4\n mstore(\n mload(add(vk, 0x240)),\n 14590850366538565268612154711126247437677807588903705071677135475079401886274\n )\n mstore(\n add(mload(add(vk, 0x240)), 0x20),\n 18590050088847501728340953044790139366495591524471631048198965975345765148219\n )\n // qEcc\n mstore(\n mload(add(vk, 0x260)),\n 21704590671982347430816904792389667189857927953663414983186296915645026530922\n )\n mstore(\n add(mload(add(vk, 0x260)), 0x20),\n 20891693206558394293557033642999941159043782671912221870570329299710569824990\n )\n }\n }\n}\n" + }, + "contracts/libraries/Transfer3In3Out24DepthVk.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\npragma solidity ^0.8.0;\n\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport \"./BN254.sol\";\n\nlibrary Transfer3In3Out24DepthVk {\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\n assembly {\n // domain size\n mstore(vk, 65536)\n // num of public inputs\n mstore(add(vk, 0x20), 45)\n\n // sigma0\n mstore(\n mload(add(vk, 0x40)),\n 6745569324574292840123998773726184666805725845966057344477780763812378175216\n )\n mstore(\n add(mload(add(vk, 0x40)), 0x20),\n 15674359264100532117390420549335759541287602785521062799291583384533749901741\n )\n // sigma1\n mstore(\n mload(add(vk, 0x60)),\n 3882047939060472482494153851462770573213675187290765799393847015027127043523\n )\n mstore(\n add(mload(add(vk, 0x60)), 0x20),\n 7630821036627726874781987389422412327209162597154025595018731571961516169947\n )\n // sigma2\n mstore(\n mload(add(vk, 0x80)),\n 21225224708013383300469954369858606000505504678178518510917526718672976749965\n )\n mstore(\n add(mload(add(vk, 0x80)), 0x20),\n 16365929799382131762072204211493784381011606251973921052275294268694891754790\n )\n // sigma3\n mstore(\n mload(add(vk, 0xa0)),\n 18816028553810513067728270242942259651783354986329945635353859047149476279687\n )\n mstore(\n add(mload(add(vk, 0xa0)), 0x20),\n 11882680851945303658063593837716037756293837416752296611477056121789431777064\n )\n // sigma4\n mstore(\n mload(add(vk, 0xc0)),\n 21510097154791711734296287821852281209791416779989865544015434367940075374914\n )\n mstore(\n add(mload(add(vk, 0xc0)), 0x20),\n 3430102751397774877173034066414871678821827985103146314887340992082993984329\n )\n\n // q1\n mstore(\n mload(add(vk, 0xe0)),\n 19869597504326919094166107694290620558808748604476313005465666228287903414344\n )\n mstore(\n add(mload(add(vk, 0xe0)), 0x20),\n 7150111322568846997819037419437132637225578315562663408823282538527304893394\n )\n // q2\n mstore(\n mload(add(vk, 0x100)),\n 15160992848460929858090744745540508270198264712727437471403260552347088002356\n )\n mstore(\n add(mload(add(vk, 0x100)), 0x20),\n 14658479685250391207452586531545916785099257310771621120220342224985727703397\n )\n // q3\n mstore(\n mload(add(vk, 0x120)),\n 8235204123369855002620633544318875073465201482729570929826842086900101734240\n )\n mstore(\n add(mload(add(vk, 0x120)), 0x20),\n 1315782571791013709741742522230010040948540142932666264718230624795003912658\n )\n // q4\n mstore(\n mload(add(vk, 0x140)),\n 7021080634443416008459948952678027962506306501245829421538884411847588184010\n )\n mstore(\n add(mload(add(vk, 0x140)), 0x20),\n 6584493294015254847476792897094566004873857428175399671267891995703671301938\n )\n\n // qM12\n mstore(\n mload(add(vk, 0x160)),\n 19199743165408884046745846028664619315169170959180153012829728401858950581623\n )\n mstore(\n add(mload(add(vk, 0x160)), 0x20),\n 14838749009602762930836652487207610572239367359059811743491751753845995666312\n )\n // qM34\n mstore(\n mload(add(vk, 0x180)),\n 10248259393969855960972127876087560001222739594880062140977367664638629457979\n )\n mstore(\n add(mload(add(vk, 0x180)), 0x20),\n 3405469462517204071666729973707416410254082166076974198995581327928518673875\n )\n\n // qO\n mstore(\n mload(add(vk, 0x1a0)),\n 9259807925511910228709408577417518144465439748546649497440413244416264053909\n )\n mstore(\n add(mload(add(vk, 0x1a0)), 0x20),\n 4349742126987923639436565898601499377373071260693932114899380098788981806520\n )\n // qC\n mstore(\n mload(add(vk, 0x1c0)),\n 195924708408078159303893377539882303047203274957430754688974876101940076523\n )\n mstore(\n add(mload(add(vk, 0x1c0)), 0x20),\n 2730242103617344574903225508726280194241425124842703262405260488972083367491\n )\n // qH1\n mstore(\n mload(add(vk, 0x1e0)),\n 20219387287202350426068670038890996732790822982376234641416083193417653609683\n )\n mstore(\n add(mload(add(vk, 0x1e0)), 0x20),\n 4712902992473903996354956065401616044154872569903741964754702810524685939510\n )\n // qH2\n mstore(\n mload(add(vk, 0x200)),\n 20606018511516306199576247848201856706631620007530428100607004704631466340548\n )\n mstore(\n add(mload(add(vk, 0x200)), 0x20),\n 3431535724436156106895017518971445784357440465218022981124980111332355382620\n )\n // qH3\n mstore(\n mload(add(vk, 0x220)),\n 16926802729258759088538388518776752987858809292908095720269836387951179849328\n )\n mstore(\n add(mload(add(vk, 0x220)), 0x20),\n 17982233223518308144739071673627895392237126231063756253762501987899411496611\n )\n // qH4\n mstore(\n mload(add(vk, 0x240)),\n 2769108222659962988853179530681878069454558991374977224908414446449310780711\n )\n mstore(\n add(mload(add(vk, 0x240)), 0x20),\n 1229799452453481995415811771099188864368739763357472273935665649735041438448\n )\n // qEcc\n mstore(\n mload(add(vk, 0x260)),\n 4813470345909172814186147928188285492437945113396806975178500704379725081570\n )\n mstore(\n add(mload(add(vk, 0x260)), 0x20),\n 5911983361843136694947821727682990071782684402361679071602671084421707986423\n )\n }\n }\n}\n" + }, + "contracts/libraries/Mint1In2Out24DepthVk.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\npragma solidity ^0.8.0;\n\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport \"./BN254.sol\";\n\nlibrary Mint1In2Out24DepthVk {\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\n assembly {\n // domain size\n mstore(vk, 16384)\n // num of public inputs\n mstore(add(vk, 0x20), 22)\n\n // sigma0\n mstore(\n mload(add(vk, 0x40)),\n 18715857233450097233566665862469612667705408112918632327151254517366615510853\n )\n mstore(\n add(mload(add(vk, 0x40)), 0x20),\n 12056659507165533739511169991607046566607546589228993432633519678105063191994\n )\n // sigma1\n mstore(\n mload(add(vk, 0x60)),\n 14824195002671574468331715635494727121571793218927771429557442195822888294112\n )\n mstore(\n add(mload(add(vk, 0x60)), 0x20),\n 15545363005844852395434066542267547241977074468438704526560481952507920680442\n )\n // sigma2\n mstore(\n mload(add(vk, 0x80)),\n 12730937992652390663908670084945912580250489721157445258662047611384656062589\n )\n mstore(\n add(mload(add(vk, 0x80)), 0x20),\n 13922972325643955705903067190275250069235823502347080251607855678412413832655\n )\n // sigma3\n mstore(\n mload(add(vk, 0xa0)),\n 11205515283341717493374802581094446196264159623530455592177314841729924213298\n )\n mstore(\n add(mload(add(vk, 0xa0)), 0x20),\n 21626228139140341994554265888140425084500331880890693761295353772893134873176\n )\n // sigma4\n mstore(\n mload(add(vk, 0xc0)),\n 1297892505212470170669591175924901147071008882331974691087297632739019966869\n )\n mstore(\n add(mload(add(vk, 0xc0)), 0x20),\n 5046998337256619649328073625306172605427225136111531257681027197976756517579\n )\n\n // q1\n mstore(\n mload(add(vk, 0xe0)),\n 3416126502361838053757816729968531801453964981226124461039874315717193603949\n )\n mstore(\n add(mload(add(vk, 0xe0)), 0x20),\n 13457539169423794765649307630863376252412201646715715024708233511728175887361\n )\n // q2\n mstore(\n mload(add(vk, 0x100)),\n 14560725448400229197269899568322480538530865768296597131421754928016376186765\n )\n mstore(\n add(mload(add(vk, 0x100)), 0x20),\n 948706310326485520368947730671484733882983133515374382612890953953178516965\n )\n // q3\n mstore(\n mload(add(vk, 0x120)),\n 3629576662585230443325226017156907801568659344982452092584030101519414013585\n )\n mstore(\n add(mload(add(vk, 0x120)), 0x20),\n 11755059153403672321764085695058203755528587063932979109812536973510125660021\n )\n // q4\n mstore(\n mload(add(vk, 0x140)),\n 11004655709419206490244680738164512138236779409731663166100876015592834374329\n )\n mstore(\n add(mload(add(vk, 0x140)), 0x20),\n 3075086625849477481019461602494583874758896233088021555313650923393327170396\n )\n\n // qM12\n mstore(\n mload(add(vk, 0x160)),\n 5116214943488395672472205024247672892505731883467355177124324350502474270399\n )\n mstore(\n add(mload(add(vk, 0x160)), 0x20),\n 5862627121952215177093377764664762757373132220173512585597211838016077936314\n )\n // qM34\n mstore(\n mload(add(vk, 0x180)),\n 17591159830764396623974345916017368127032492198578190405514161605820133619635\n )\n mstore(\n add(mload(add(vk, 0x180)), 0x20),\n 21823861194811124564815272373053730365073236057851878678286985577859771922838\n )\n\n // qO\n mstore(\n mload(add(vk, 0x1a0)),\n 4270340305067371269951830198578603793146745643909898988425564374444309637164\n )\n mstore(\n add(mload(add(vk, 0x1a0)), 0x20),\n 3429516859933338020020014748205944416226065682096817012737681215798779959358\n )\n // qC\n mstore(\n mload(add(vk, 0x1c0)),\n 18140449432973717159678873762584078749849242918610972566667541337332136871548\n )\n mstore(\n add(mload(add(vk, 0x1c0)), 0x20),\n 9496973080403650076452512345486781056144944295333639818676842964799046293494\n )\n // qH1\n mstore(\n mload(add(vk, 0x1e0)),\n 2679601553769052076036509170798838073426403353317218807312666276919478214029\n )\n mstore(\n add(mload(add(vk, 0x1e0)), 0x20),\n 8104020893469546307958011379600482565107943832349081304458473817724197756534\n )\n // qH2\n mstore(\n mload(add(vk, 0x200)),\n 15359849857211682094089890949757251089555853826462724721381029431330976452771\n )\n mstore(\n add(mload(add(vk, 0x200)), 0x20),\n 16491566299722544741678927866350154870498939946959249271831955257228312538659\n )\n // qH3\n mstore(\n mload(add(vk, 0x220)),\n 12100931690223724084472313998885551549102209045806672061992493151022394323721\n )\n mstore(\n add(mload(add(vk, 0x220)), 0x20),\n 789632069622495739311692844331711309820973570859008137449744966665497183364\n )\n // qH4\n mstore(\n mload(add(vk, 0x240)),\n 9372499437356245507830218065264333778849228240985893278867565670067559001476\n )\n mstore(\n add(mload(add(vk, 0x240)), 0x20),\n 5071314442263159884139201702429590502916613589463313571011317767821015131114\n )\n // qEcc\n mstore(\n mload(add(vk, 0x260)),\n 13714688610643446356217590887080562811494820054657712165894734861828853586333\n )\n mstore(\n add(mload(add(vk, 0x260)), 0x20),\n 1823119861575201921550763026703044012616621870847156108104965194178825195245\n )\n }\n }\n}\n" + }, + "contracts/libraries/Freeze2In2Out24DepthVk.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\npragma solidity ^0.8.0;\n\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport \"./BN254.sol\";\n\nlibrary Freeze2In2Out24DepthVk {\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\n assembly {\n // domain size\n mstore(vk, 32768)\n // num of public inputs\n mstore(add(vk, 0x20), 7)\n\n // sigma0\n mstore(\n mload(add(vk, 0x40)),\n 5118137774697846205332813764527928981094534629179826197661885163309718792664\n )\n mstore(\n add(mload(add(vk, 0x40)), 0x20),\n 21444510867008360096097791654924066970628086592132286765149218644570218218958\n )\n // sigma1\n mstore(\n mload(add(vk, 0x60)),\n 8803078987858664729272498900762799875194584982758288268215987493230494163132\n )\n mstore(\n add(mload(add(vk, 0x60)), 0x20),\n 2433303804972293717223914306424233027859258355453999879123493306111951897773\n )\n // sigma2\n mstore(\n mload(add(vk, 0x80)),\n 3260803333275595200572169884988811547059839215101652317716205725226978273005\n )\n mstore(\n add(mload(add(vk, 0x80)), 0x20),\n 3613466037895382109608881276133312019690204476510004381563636709063308697093\n )\n // sigma3\n mstore(\n mload(add(vk, 0xa0)),\n 2899439069156777615431510251772750434873724497570948892914993632800602868003\n )\n mstore(\n add(mload(add(vk, 0xa0)), 0x20),\n 8379069052308825781842073463279139505822176676050290986587894691217284563176\n )\n // sigma4\n mstore(\n mload(add(vk, 0xc0)),\n 11732815069861807091165298838511758216456754114248634732985660813617441774658\n )\n mstore(\n add(mload(add(vk, 0xc0)), 0x20),\n 13166648630773672378735632573860809427570624939066078822309995911184719468349\n )\n\n // q1\n mstore(\n mload(add(vk, 0xe0)),\n 3491113372305405096734724369052497193940883294098266073462122391919346338715\n )\n mstore(\n add(mload(add(vk, 0xe0)), 0x20),\n 9827940866231584614489847721346069816554104560301469101889136447541239075558\n )\n // q2\n mstore(\n mload(add(vk, 0x100)),\n 13435736629650136340196094187820825115318808951343660439499146542480924445056\n )\n mstore(\n add(mload(add(vk, 0x100)), 0x20),\n 17982003639419860944219119425071532203644939147988825284644182004036282633420\n )\n // q3\n mstore(\n mload(add(vk, 0x120)),\n 9420441314344923881108805693844267870391289724837370305813596950535269618889\n )\n mstore(\n add(mload(add(vk, 0x120)), 0x20),\n 14052028114719021167053334693322209909986772869796949309216011765205181071250\n )\n // q4\n mstore(\n mload(add(vk, 0x140)),\n 5993794253539477186956400554691260472169114800994727061541419240125118730670\n )\n mstore(\n add(mload(add(vk, 0x140)), 0x20),\n 7932960467420473760327919608797843731121974235494949218022535850994096308221\n )\n\n // qM12\n mstore(\n mload(add(vk, 0x160)),\n 20429406452243707916630058273965650451352739230543746812138739882954609124362\n )\n mstore(\n add(mload(add(vk, 0x160)), 0x20),\n 19692763177526054221606086118119451355223254880919552106296824049356634107628\n )\n // qM34\n mstore(\n mload(add(vk, 0x180)),\n 5116116081275540865026368436909879211124168610156815899416152073819842308833\n )\n mstore(\n add(mload(add(vk, 0x180)), 0x20),\n 19842614482623746480218449373220727139999815807703100436601033251034509288020\n )\n\n // qO\n mstore(\n mload(add(vk, 0x1a0)),\n 3222495709067365879961349438698872943831082393186134710609177690951286365439\n )\n mstore(\n add(mload(add(vk, 0x1a0)), 0x20),\n 3703532585269560394637679600890000571417416525562741673639173852507841008896\n )\n // qC\n mstore(\n mload(add(vk, 0x1c0)),\n 14390471925844384916287376853753782482889671388409569687933776522892272411453\n )\n mstore(\n add(mload(add(vk, 0x1c0)), 0x20),\n 12261059506574689542871751331715340905672203590996080541963527436628201655551\n )\n // qH1\n mstore(\n mload(add(vk, 0x1e0)),\n 212133813390818941086614328570019936880884093617125797928913969643819686094\n )\n mstore(\n add(mload(add(vk, 0x1e0)), 0x20),\n 2058275687345409085609950154451527352761528547310163982911053914079075244754\n )\n // qH2\n mstore(\n mload(add(vk, 0x200)),\n 7507728187668840967683000771945777493711131652056583548804845913578647015848\n )\n mstore(\n add(mload(add(vk, 0x200)), 0x20),\n 15764897865018924692970368330703479768257677759902236501992745661340099646248\n )\n // qH3\n mstore(\n mload(add(vk, 0x220)),\n 18302496468173370667823199324779836313672317342261283918121073083547306893947\n )\n mstore(\n add(mload(add(vk, 0x220)), 0x20),\n 8286815911028648157724790867291052312955947067988434001008620797971639607610\n )\n // qH4\n mstore(\n mload(add(vk, 0x240)),\n 3470304694844212768511296992238419575123994956442939632524758781128057967608\n )\n mstore(\n add(mload(add(vk, 0x240)), 0x20),\n 9660892985889164184033149081062412611630238705975373538019042544308335432760\n )\n // qEcc\n mstore(\n mload(add(vk, 0x260)),\n 2964316839877400858567376484261923751031240259689039666960763176068018735519\n )\n mstore(\n add(mload(add(vk, 0x260)), 0x20),\n 12811532772714855857084788747474913882317963037829729036129619334772557515102\n )\n }\n }\n}\n" + }, + "contracts/libraries/Freeze3In3Out24DepthVk.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\n// NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-libraries --release`.\npragma solidity ^0.8.0;\n\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport \"./BN254.sol\";\n\nlibrary Freeze3In3Out24DepthVk {\n function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) {\n assembly {\n // domain size\n mstore(vk, 32768)\n // num of public inputs\n mstore(add(vk, 0x20), 9)\n\n // sigma0\n mstore(\n mload(add(vk, 0x40)),\n 13960731824189571867091334541157339805012676983241098249236778497915465352053\n )\n mstore(\n add(mload(add(vk, 0x40)), 0x20),\n 15957967148909612161116218663566087497068811688498797226467515095325657152045\n )\n // sigma1\n mstore(\n mload(add(vk, 0x60)),\n 10072587287838607559866316765624459623039578259829899225485734337870604479821\n )\n mstore(\n add(mload(add(vk, 0x60)), 0x20),\n 15609102652788964903340031795269302405421393375766454476378251576322947285858\n )\n // sigma2\n mstore(\n mload(add(vk, 0x80)),\n 6565707169634610873662073730120423414251877113110818166564470784428289496576\n )\n mstore(\n add(mload(add(vk, 0x80)), 0x20),\n 9611712776953584296612678707999788907754017999002246476393974258810867124564\n )\n // sigma3\n mstore(\n mload(add(vk, 0xa0)),\n 19122400063214294010991425447556532201595762243736666161415050184531098654161\n )\n mstore(\n add(mload(add(vk, 0xa0)), 0x20),\n 8531074110951311734071734321378003618052738734286317677359289798683215129985\n )\n // sigma4\n mstore(\n mload(add(vk, 0xc0)),\n 18914674706112982859579196036464470962561796494057486369943014188445892675591\n )\n mstore(\n add(mload(add(vk, 0xc0)), 0x20),\n 8521550178820292984099911306615540388090622911114862049753515592863829430736\n )\n\n // q1\n mstore(\n mload(add(vk, 0xe0)),\n 14630335835391046544786473024276900306274085179180854494149987003151236405693\n )\n mstore(\n add(mload(add(vk, 0xe0)), 0x20),\n 11927636740621831793456799535735389934490350641107279163802406976389995490906\n )\n // q2\n mstore(\n mload(add(vk, 0x100)),\n 12724914112829888521503996001370933887413324349676112061904353298191125761834\n )\n mstore(\n add(mload(add(vk, 0x100)), 0x20),\n 3433370683786676509006167821257247081483834358490691629467376279251656650897\n )\n // q3\n mstore(\n mload(add(vk, 0x120)),\n 9566744544381523978155846140753126684369534823789897373672815695046810310988\n )\n mstore(\n add(mload(add(vk, 0x120)), 0x20),\n 260017699035964770662690666115311602214922546306804012310168827438556483441\n )\n // q4\n mstore(\n mload(add(vk, 0x140)),\n 18742890127040989288898023133652949889864689947035150783791742574000686319400\n )\n mstore(\n add(mload(add(vk, 0x140)), 0x20),\n 18749161983189150319356152659011703669863797011859087161475368338926038180308\n )\n\n // qM12\n mstore(\n mload(add(vk, 0x160)),\n 20773233313791930222139945008080890514898946888819625041024291924369611870607\n )\n mstore(\n add(mload(add(vk, 0x160)), 0x20),\n 13521724424975535658347353167027580945107539483287924982357298371687877483981\n )\n // qM34\n mstore(\n mload(add(vk, 0x180)),\n 10660982607928179139814177842882617778440401746692506684983260589289268170379\n )\n mstore(\n add(mload(add(vk, 0x180)), 0x20),\n 15139413484465466645149010003574654339361200137557967877891360282092282891685\n )\n\n // qO\n mstore(\n mload(add(vk, 0x1a0)),\n 17250558007005834955604250406579207360748810924758511953913092810009135851470\n )\n mstore(\n add(mload(add(vk, 0x1a0)), 0x20),\n 11258418978437321501318046240697776859180107275977030400553604411488978149668\n )\n // qC\n mstore(\n mload(add(vk, 0x1c0)),\n 18952078950487788846193130112459018587473354670050028821020889375362878213321\n )\n mstore(\n add(mload(add(vk, 0x1c0)), 0x20),\n 17193026626593699161155564126784943150078109362562131961513990003707313130311\n )\n // qH1\n mstore(\n mload(add(vk, 0x1e0)),\n 14543481681504505345294846715453463092188884601462120536722150134676588633429\n )\n mstore(\n add(mload(add(vk, 0x1e0)), 0x20),\n 18051927297986484527611703191585266713528321784715802343699150271856051244721\n )\n // qH2\n mstore(\n mload(add(vk, 0x200)),\n 17183091890960203175777065490726876011944304977299231686457191186480347944964\n )\n mstore(\n add(mload(add(vk, 0x200)), 0x20),\n 4490401529426574565331238171714181866458606184922225399124187058005801778892\n )\n // qH3\n mstore(\n mload(add(vk, 0x220)),\n 1221754396433704762941109064372027557900417150628742839724350141274324105531\n )\n mstore(\n add(mload(add(vk, 0x220)), 0x20),\n 5852202975250895807153833762470523277935452126865915206223172229093142057204\n )\n // qH4\n mstore(\n mload(add(vk, 0x240)),\n 15942219407079940317108327336758085920828255563342347502490598820248118460133\n )\n mstore(\n add(mload(add(vk, 0x240)), 0x20),\n 13932908789216121516788648116401360726086794781411868046768741292235436938527\n )\n // qEcc\n mstore(\n mload(add(vk, 0x260)),\n 11253921189643581015308547816247612243572238063440388125238308675751100437670\n )\n mstore(\n add(mload(add(vk, 0x260)), 0x20),\n 21538818198962061056994656088458979220103547193654086011201760604068846580076\n )\n }\n }\n}\n" + }, + "contracts/mocks/TestCapeTypes.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"../CAPE.sol\";\nimport \"../interfaces/IPlonkVerifier.sol\";\n\ncontract TestCapeTypes {\n function checkNullifier(uint256 nf) public pure returns (uint256) {\n return nf;\n }\n\n function checkRecordCommitment(uint256 rc) public pure returns (uint256) {\n return rc;\n }\n\n function checkMerkleRoot(uint256 root) public pure returns (uint256) {\n return root;\n }\n\n function checkForeignAssetCode(uint256 code) public pure returns (uint256) {\n return code;\n }\n\n function checkAssetPolicy(CAPE.AssetPolicy memory policy)\n public\n pure\n returns (CAPE.AssetPolicy memory)\n {\n return policy;\n }\n\n function checkAssetDefinition(CAPE.AssetDefinition memory def)\n public\n pure\n returns (CAPE.AssetDefinition memory)\n {\n return def;\n }\n\n function checkRecordOpening(CAPE.RecordOpening memory ro)\n public\n pure\n returns (CAPE.RecordOpening memory)\n {\n return ro;\n }\n\n function checkPlonkProof(IPlonkVerifier.PlonkProof memory proof)\n public\n pure\n returns (IPlonkVerifier.PlonkProof memory)\n {\n return proof;\n }\n\n function checkAuditMemo(CAPE.AuditMemo memory memo)\n public\n pure\n returns (CAPE.AuditMemo memory)\n {\n return memo;\n }\n\n function checkNoteType(CAPE.NoteType t) public pure returns (CAPE.NoteType) {\n return t;\n }\n\n function checkMintNote(CAPE.MintNote memory note) public pure returns (CAPE.MintNote memory) {\n return note;\n }\n\n function checkFreezeNote(CAPE.FreezeNote memory note)\n public\n pure\n returns (CAPE.FreezeNote memory)\n {\n return note;\n }\n\n function checkBurnNote(CAPE.BurnNote memory note) public pure returns (CAPE.BurnNote memory) {\n return note;\n }\n\n function checkTransferNote(CAPE.TransferNote memory note)\n public\n pure\n returns (CAPE.TransferNote memory)\n {\n return note;\n }\n\n function checkCapeBlock(CAPE.CapeBlock memory b) public pure returns (CAPE.CapeBlock memory) {\n return b;\n }\n}\n" + }, + "contracts/mocks/TestVerifyingKeys.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {VerifyingKeys as Vk} from \"../libraries/VerifyingKeys.sol\";\nimport \"../interfaces/IPlonkVerifier.sol\";\n\ncontract TestVerifyingKeys {\n function getVkById(uint256 encodedId)\n public\n pure\n returns (IPlonkVerifier.VerifyingKey memory)\n {\n return Vk.getVkById(encodedId);\n }\n\n function getEncodedId(\n uint8 noteType,\n uint8 numInput,\n uint8 numOutput,\n uint8 treeDepth\n ) public pure returns (uint256 encodedId) {\n return Vk.getEncodedId(noteType, numInput, numOutput, treeDepth);\n }\n}\n" + }, + "contracts/mocks/TestTranscript.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"hardhat/console.sol\";\n\nimport {BN254} from \"../libraries/BN254.sol\";\nimport {Transcript} from \"../verifier/Transcript.sol\";\nimport {IPlonkVerifier} from \"../interfaces/IPlonkVerifier.sol\";\n\ncontract TestTranscript {\n using Transcript for Transcript.TranscriptData;\n\n function appendMessage(Transcript.TranscriptData memory transcript, bytes memory message)\n public\n pure\n returns (Transcript.TranscriptData memory)\n {\n transcript.appendMessage(message);\n return transcript;\n }\n\n function appendChallenge(Transcript.TranscriptData memory transcript, uint256 challenge)\n public\n pure\n returns (Transcript.TranscriptData memory)\n {\n transcript.appendChallenge(challenge);\n return transcript;\n }\n\n function getAndAppendChallenge(Transcript.TranscriptData memory transcript)\n public\n pure\n returns (uint256)\n {\n return transcript.getAndAppendChallenge();\n }\n\n function testAppendMessageAndGet(\n Transcript.TranscriptData memory transcript,\n bytes memory message\n ) public pure returns (uint256) {\n transcript.appendMessage(message);\n return transcript.getAndAppendChallenge();\n }\n\n function testAppendChallengeAndGet(\n Transcript.TranscriptData memory transcript,\n uint256 challenge\n ) public pure returns (uint256) {\n transcript.appendChallenge(challenge);\n return transcript.getAndAppendChallenge();\n }\n\n function testAppendCommitmentAndGet(\n Transcript.TranscriptData memory transcript,\n BN254.G1Point memory comm\n ) public pure returns (uint256) {\n transcript.appendCommitment(comm);\n return transcript.getAndAppendChallenge();\n }\n\n function testAppendCommitmentsAndGet(\n Transcript.TranscriptData memory transcript,\n BN254.G1Point[] memory comms\n ) public pure returns (uint256) {\n transcript.appendCommitments(comms);\n return transcript.getAndAppendChallenge();\n }\n\n function testGetAndAppendChallengeMultipleTimes(\n Transcript.TranscriptData memory transcript,\n uint256 times\n ) public pure returns (uint256 challenge) {\n for (uint256 i = 0; i < times; i++) {\n challenge = transcript.getAndAppendChallenge();\n }\n }\n\n function testAppendVkAndPubInput(\n Transcript.TranscriptData memory transcript,\n IPlonkVerifier.VerifyingKey memory verifyingKey,\n uint256[] memory pubInputs\n ) public pure returns (Transcript.TranscriptData memory) {\n transcript.appendVkAndPubInput(verifyingKey, pubInputs);\n return transcript;\n }\n\n function testAppendProofEvaluations(\n Transcript.TranscriptData memory transcript,\n IPlonkVerifier.PlonkProof memory proof\n ) public pure returns (Transcript.TranscriptData memory) {\n transcript.appendProofEvaluations(proof);\n return transcript;\n }\n}\n" + }, + "hardhat/console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.22 <0.9.0;\n\nlibrary console {\n\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n\tfunction _sendLogPayload(bytes memory payload) private view {\n\t\tuint256 payloadLength = payload.length;\n\t\taddress consoleAddress = CONSOLE_ADDRESS;\n\t\tassembly {\n\t\t\tlet payloadStart := add(payload, 32)\n\t\t\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n\t\t}\n\t}\n\n\tfunction log() internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log()\"));\n\t}\n\n\tfunction logInt(int p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(int)\", p0));\n\t}\n\n\tfunction logUint(uint p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n\t}\n\n\tfunction logString(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction logBool(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction logAddress(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction logBytes(bytes memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n\t}\n\n\tfunction logBytes1(bytes1 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n\t}\n\n\tfunction logBytes2(bytes2 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n\t}\n\n\tfunction logBytes3(bytes3 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n\t}\n\n\tfunction logBytes4(bytes4 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n\t}\n\n\tfunction logBytes5(bytes5 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n\t}\n\n\tfunction logBytes6(bytes6 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n\t}\n\n\tfunction logBytes7(bytes7 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n\t}\n\n\tfunction logBytes8(bytes8 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n\t}\n\n\tfunction logBytes9(bytes9 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n\t}\n\n\tfunction logBytes10(bytes10 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n\t}\n\n\tfunction logBytes11(bytes11 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n\t}\n\n\tfunction logBytes12(bytes12 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n\t}\n\n\tfunction logBytes13(bytes13 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n\t}\n\n\tfunction logBytes14(bytes14 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n\t}\n\n\tfunction logBytes15(bytes15 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n\t}\n\n\tfunction logBytes16(bytes16 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n\t}\n\n\tfunction logBytes17(bytes17 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n\t}\n\n\tfunction logBytes18(bytes18 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n\t}\n\n\tfunction logBytes19(bytes19 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n\t}\n\n\tfunction logBytes20(bytes20 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n\t}\n\n\tfunction logBytes21(bytes21 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n\t}\n\n\tfunction logBytes22(bytes22 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n\t}\n\n\tfunction logBytes23(bytes23 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n\t}\n\n\tfunction logBytes24(bytes24 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n\t}\n\n\tfunction logBytes25(bytes25 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n\t}\n\n\tfunction logBytes26(bytes26 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n\t}\n\n\tfunction logBytes27(bytes27 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n\t}\n\n\tfunction logBytes28(bytes28 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n\t}\n\n\tfunction logBytes29(bytes29 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n\t}\n\n\tfunction logBytes30(bytes30 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n\t}\n\n\tfunction logBytes31(bytes31 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n\t}\n\n\tfunction logBytes32(bytes32 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n\t}\n\n\tfunction log(uint p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n\t}\n\n\tfunction log(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction log(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction log(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction log(uint p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n\t}\n\n\tfunction log(address p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint)\", p0, p1));\n\t}\n\n\tfunction log(address p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n\t}\n\n\tfunction log(address p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n\t}\n\n\tfunction log(address p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n}\n" + }, + "contracts/verifier/Transcript.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n//\n// There is currently a bug in solidity that may affect the security of the contract.\n// An patch is available for Jellyfish https://github.com/EspressoSystems/jellyfish/pull/70\n// Corresponding changes are to be made to the solidity code here.\n\npragma solidity ^0.8.0;\n\nimport \"solidity-bytes-utils/contracts/BytesLib.sol\";\nimport \"../libraries/Utils.sol\";\nimport {BN254} from \"../libraries/BN254.sol\";\nimport {IPlonkVerifier} from \"../interfaces/IPlonkVerifier.sol\";\n\nlibrary Transcript {\n struct TranscriptData {\n bytes transcript;\n bytes32[2] state;\n }\n\n // ================================\n // Primitive functions\n // ================================\n function appendMessage(TranscriptData memory self, bytes memory message) internal pure {\n self.transcript = abi.encodePacked(self.transcript, message);\n }\n\n function appendFieldElement(TranscriptData memory self, uint256 fieldElement) internal pure {\n appendMessage(self, abi.encodePacked(Utils.reverseEndianness(fieldElement)));\n }\n\n function appendGroupElement(TranscriptData memory self, BN254.G1Point memory comm)\n internal\n pure\n {\n bytes memory commBytes = BN254.g1Serialize(comm);\n appendMessage(self, commBytes);\n }\n\n // ================================\n // Transcript APIs\n // ================================\n function appendChallenge(TranscriptData memory self, uint256 challenge) internal pure {\n appendFieldElement(self, challenge);\n }\n\n function appendCommitments(TranscriptData memory self, BN254.G1Point[] memory comms)\n internal\n pure\n {\n for (uint256 i = 0; i < comms.length; i++) {\n appendCommitment(self, comms[i]);\n }\n }\n\n function appendCommitment(TranscriptData memory self, BN254.G1Point memory comm)\n internal\n pure\n {\n appendGroupElement(self, comm);\n }\n\n function getAndAppendChallenge(TranscriptData memory self) internal pure returns (uint256) {\n bytes32 h1 = keccak256(\n abi.encodePacked(self.state[0], self.state[1], self.transcript, uint8(0))\n );\n bytes32 h2 = keccak256(\n abi.encodePacked(self.state[0], self.state[1], self.transcript, uint8(1))\n );\n\n self.state[0] = h1;\n self.state[1] = h2;\n\n return BN254.fromLeBytesModOrder(BytesLib.slice(abi.encodePacked(h1, h2), 0, 48));\n }\n\n /// @dev Append the verifying key and the public inputs to the transcript.\n /// @param verifyingKey verifiying key\n /// @param publicInput a list of field elements\n function appendVkAndPubInput(\n TranscriptData memory self,\n IPlonkVerifier.VerifyingKey memory verifyingKey,\n uint256[] memory publicInput\n ) internal pure {\n uint64 sizeInBits = 254;\n\n // Fr field size in bits\n appendMessage(\n self,\n BytesLib.slice(abi.encodePacked(Utils.reverseEndianness(sizeInBits)), 0, 8)\n );\n\n // domain size\n appendMessage(\n self,\n BytesLib.slice(\n abi.encodePacked(Utils.reverseEndianness(verifyingKey.domainSize)),\n 0,\n 8\n )\n );\n\n // number of inputs\n appendMessage(\n self,\n BytesLib.slice(abi.encodePacked(Utils.reverseEndianness(verifyingKey.numInputs)), 0, 8)\n );\n\n // =====================\n // k: coset representatives\n // =====================\n // Currently, K is hardcoded, and there are 5 of them since\n // # wire types == 5\n appendFieldElement(self, 0x1); // k0 = 1\n appendFieldElement(\n self,\n 0x2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a\n ); // k1\n appendFieldElement(\n self,\n 0x1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025\n ); // k2\n appendFieldElement(\n self,\n 0x2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a\n ); // k3\n appendFieldElement(\n self,\n 0x2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881\n ); // k4\n\n // selectors\n appendGroupElement(self, verifyingKey.q1);\n appendGroupElement(self, verifyingKey.q2);\n appendGroupElement(self, verifyingKey.q3);\n appendGroupElement(self, verifyingKey.q4);\n appendGroupElement(self, verifyingKey.qM12);\n appendGroupElement(self, verifyingKey.qM34);\n appendGroupElement(self, verifyingKey.qH1);\n appendGroupElement(self, verifyingKey.qH2);\n appendGroupElement(self, verifyingKey.qH3);\n appendGroupElement(self, verifyingKey.qH4);\n appendGroupElement(self, verifyingKey.qO);\n appendGroupElement(self, verifyingKey.qC);\n appendGroupElement(self, verifyingKey.qEcc);\n\n // sigmas\n appendGroupElement(self, verifyingKey.sigma0);\n appendGroupElement(self, verifyingKey.sigma1);\n appendGroupElement(self, verifyingKey.sigma2);\n appendGroupElement(self, verifyingKey.sigma3);\n appendGroupElement(self, verifyingKey.sigma4);\n\n // public inputs\n for (uint256 i = 0; i < publicInput.length; i++) {\n appendFieldElement(self, publicInput[i]);\n }\n }\n\n /// @dev Append the proof to the transcript.\n function appendProofEvaluations(\n TranscriptData memory self,\n IPlonkVerifier.PlonkProof memory proof\n ) internal pure {\n appendFieldElement(self, proof.wireEval0);\n appendFieldElement(self, proof.wireEval1);\n appendFieldElement(self, proof.wireEval2);\n appendFieldElement(self, proof.wireEval3);\n appendFieldElement(self, proof.wireEval4);\n\n appendFieldElement(self, proof.sigmaEval0);\n appendFieldElement(self, proof.sigmaEval1);\n appendFieldElement(self, proof.sigmaEval2);\n appendFieldElement(self, proof.sigmaEval3);\n\n appendFieldElement(self, proof.prodPermZetaOmegaEval);\n }\n}\n" + }, + "contracts/mocks/TestEdOnBN254.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {EdOnBN254 as C} from \"../libraries/EdOnBN254.sol\";\n\ncontract TestEdOnBN254 {\n constructor() {}\n\n function serialize(C.EdOnBN254Point memory p) public pure returns (bytes memory res) {\n return C.serialize(p);\n }\n\n function checkEdOnBn254Point(C.EdOnBN254Point memory p)\n public\n pure\n returns (C.EdOnBN254Point memory)\n {\n return p;\n }\n}\n" + }, + "contracts/verifier/PlonkVerifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {BN254} from \"../libraries/BN254.sol\";\nimport \"../interfaces/IPlonkVerifier.sol\";\nimport {PolynomialEval as Poly} from \"../libraries/PolynomialEval.sol\";\nimport \"./Transcript.sol\";\n\ncontract PlonkVerifier is IPlonkVerifier {\n using Transcript for Transcript.TranscriptData;\n\n // _COSET_K0 = 1, has no effect during multiplication, thus avoid declaring it here.\n uint256 private constant _COSET_K1 =\n 0x2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a;\n uint256 private constant _COSET_K2 =\n 0x1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025;\n uint256 private constant _COSET_K3 =\n 0x2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a;\n uint256 private constant _COSET_K4 =\n 0x2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881;\n\n // Parsed from Aztec's Ignition CRS,\n // `beta_h` \\in G2 where \\beta is the trapdoor, h is G2 generator `BN254.P2()`\n // See parsing code: https://github.com/alxiong/crs\n BN254.G2Point private _betaH =\n BN254.G2Point({\n x0: 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1,\n x1: 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0,\n y0: 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4,\n y1: 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55\n });\n\n /// The number of wire types of the circuit, TurboPlonk has 5.\n uint256 private constant _NUM_WIRE_TYPES = 5;\n\n /// @dev polynomial commitment evaluation info.\n struct PcsInfo {\n // a random combiner that was used to combine evaluations at point\n uint256 u; // 0x00\n // the point to be evaluated at\n uint256 evalPoint; // 0x20\n // the shifted point to be evaluated at\n uint256 nextEvalPoint; // 0x40\n // the polynomial evaluation value\n uint256 eval; // 0x60\n // scalars of poly comm for MSM\n uint256[] commScalars; // 0x80\n // bases of poly comm for MSM\n BN254.G1Point[] commBases; // 0xa0\n // proof of evaluations at point `eval_point`\n BN254.G1Point openingProof; // 0xc0\n // proof of evaluations at point `next_eval_point`\n BN254.G1Point shiftedOpeningProof; // 0xe0\n }\n\n /// @dev Plonk IOP verifier challenges.\n struct Challenges {\n uint256 alpha; // 0x00\n uint256 alpha2; // 0x20\n uint256 alpha3; // 0x40\n uint256 beta; // 0x60\n uint256 gamma; // 0x80\n uint256 zeta; // 0xA0\n uint256 v; // 0xC0\n uint256 u; // 0xE0\n }\n\n /// @dev Batch verify multiple TurboPlonk proofs.\n /// @param verifyingKeys An array of verifier keys\n /// @param publicInputs A two-dimensional array of public inputs.\n /// @param proofs An array of Plonk proofs\n /// @param extraTranscriptInitMsgs An array of bytes from\n /// transcript initialization messages\n function batchVerify(\n VerifyingKey[] memory verifyingKeys,\n uint256[][] memory publicInputs,\n PlonkProof[] memory proofs,\n bytes[] memory extraTranscriptInitMsgs\n ) external view returns (bool) {\n require(\n verifyingKeys.length == proofs.length &&\n publicInputs.length == proofs.length &&\n extraTranscriptInitMsgs.length == proofs.length,\n \"Plonk: invalid input param\"\n );\n require(proofs.length > 0, \"Plonk: need at least 1 proof\");\n\n PcsInfo[] memory pcsInfos = new PcsInfo[](proofs.length);\n for (uint256 i = 0; i < proofs.length; i++) {\n // validate proofs are proper group/field elements\n _validateProof(proofs[i]);\n // validate public input are all proper scalar fields\n for (uint256 j = 0; j < publicInputs[i].length; j++) {\n BN254.validateScalarField(publicInputs[i][j]);\n }\n // prepare pcs info\n pcsInfos[i] = _preparePcsInfo(\n verifyingKeys[i],\n publicInputs[i],\n proofs[i],\n extraTranscriptInitMsgs[i]\n );\n }\n\n return _batchVerifyOpeningProofs(pcsInfos);\n }\n\n /// @dev Validate all group points and scalar fields. Revert if\n /// any are invalid.\n /// @param proof A Plonk proof\n function _validateProof(PlonkProof memory proof) internal pure {\n BN254.validateG1Point(proof.wire0);\n BN254.validateG1Point(proof.wire1);\n BN254.validateG1Point(proof.wire2);\n BN254.validateG1Point(proof.wire3);\n BN254.validateG1Point(proof.wire4);\n BN254.validateG1Point(proof.prodPerm);\n BN254.validateG1Point(proof.split0);\n BN254.validateG1Point(proof.split1);\n BN254.validateG1Point(proof.split2);\n BN254.validateG1Point(proof.split3);\n BN254.validateG1Point(proof.split4);\n BN254.validateG1Point(proof.zeta);\n BN254.validateScalarField(proof.wireEval0);\n BN254.validateScalarField(proof.wireEval1);\n BN254.validateScalarField(proof.wireEval2);\n BN254.validateScalarField(proof.wireEval3);\n BN254.validateScalarField(proof.wireEval4);\n BN254.validateScalarField(proof.sigmaEval0);\n BN254.validateScalarField(proof.sigmaEval1);\n BN254.validateScalarField(proof.sigmaEval2);\n BN254.validateScalarField(proof.sigmaEval3);\n BN254.validateScalarField(proof.prodPermZetaOmegaEval);\n }\n\n function _preparePcsInfo(\n VerifyingKey memory verifyingKey,\n uint256[] memory publicInput,\n PlonkProof memory proof,\n bytes memory extraTranscriptInitMsg\n ) internal view returns (PcsInfo memory res) {\n require(publicInput.length == verifyingKey.numInputs, \"Plonk: wrong verifying key\");\n\n Challenges memory chal = _computeChallenges(\n verifyingKey,\n publicInput,\n proof,\n extraTranscriptInitMsg\n );\n\n Poly.EvalDomain memory domain = Poly.newEvalDomain(verifyingKey.domainSize);\n // pre-compute evaluation data\n Poly.EvalData memory evalData = Poly.evalDataGen(domain, chal.zeta, publicInput);\n\n // compute opening proof in poly comm.\n uint256[] memory commScalars = new uint256[](30);\n BN254.G1Point[] memory commBases = new BN254.G1Point[](30);\n\n uint256 eval = _prepareOpeningProof(\n verifyingKey,\n evalData,\n proof,\n chal,\n commScalars,\n commBases\n );\n\n uint256 zeta = chal.zeta;\n uint256 omega = domain.groupGen;\n uint256 p = BN254.R_MOD;\n uint256 zetaOmega;\n assembly {\n zetaOmega := mulmod(zeta, omega, p)\n }\n\n res = PcsInfo(\n chal.u,\n zeta,\n zetaOmega,\n eval,\n commScalars,\n commBases,\n proof.zeta,\n proof.zetaOmega\n );\n }\n\n function _computeChallenges(\n VerifyingKey memory verifyingKey,\n uint256[] memory publicInput,\n PlonkProof memory proof,\n bytes memory extraTranscriptInitMsg\n ) internal pure returns (Challenges memory res) {\n Transcript.TranscriptData memory transcript;\n uint256 p = BN254.R_MOD;\n\n transcript.appendMessage(extraTranscriptInitMsg);\n transcript.appendVkAndPubInput(verifyingKey, publicInput);\n transcript.appendGroupElement(proof.wire0);\n transcript.appendGroupElement(proof.wire1);\n transcript.appendGroupElement(proof.wire2);\n transcript.appendGroupElement(proof.wire3);\n transcript.appendGroupElement(proof.wire4);\n\n // have to compute tau, but not really used anywhere\n // slither-disable-next-line unused-return\n transcript.getAndAppendChallenge();\n res.beta = transcript.getAndAppendChallenge();\n res.gamma = transcript.getAndAppendChallenge();\n\n transcript.appendGroupElement(proof.prodPerm);\n\n res.alpha = transcript.getAndAppendChallenge();\n\n transcript.appendGroupElement(proof.split0);\n transcript.appendGroupElement(proof.split1);\n transcript.appendGroupElement(proof.split2);\n transcript.appendGroupElement(proof.split3);\n transcript.appendGroupElement(proof.split4);\n\n res.zeta = transcript.getAndAppendChallenge();\n\n transcript.appendProofEvaluations(proof);\n res.v = transcript.getAndAppendChallenge();\n\n transcript.appendGroupElement(proof.zeta);\n transcript.appendGroupElement(proof.zetaOmega);\n res.u = transcript.getAndAppendChallenge();\n\n assembly {\n let alpha := mload(res)\n let alpha2 := mulmod(alpha, alpha, p)\n let alpha3 := mulmod(alpha2, alpha, p)\n mstore(add(res, 0x20), alpha2)\n mstore(add(res, 0x40), alpha3)\n }\n }\n\n /// @dev Compute the constant term of the linearization polynomial.\n /// ```\n /// r_plonk = PI - L1(x) * alpha^2 - alpha * \\prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * (w_m + gamma) * z(xw)\n /// ```\n /// where m is the number of wire types.\n function _computeLinPolyConstantTerm(\n Challenges memory chal,\n PlonkProof memory proof,\n Poly.EvalData memory evalData\n ) internal pure returns (uint256 res) {\n uint256 p = BN254.R_MOD;\n uint256 lagrangeOneEval = evalData.lagrangeOne;\n uint256 piEval = evalData.piEval;\n uint256 perm = 1;\n\n assembly {\n let beta := mload(add(chal, 0x60))\n let gamma := mload(add(chal, 0x80))\n\n // \\prod_i=1..m-1 (w_i + beta * sigma_i + gamma)\n {\n let w0 := mload(add(proof, 0x1a0))\n let sigma0 := mload(add(proof, 0x240))\n perm := mulmod(perm, addmod(add(w0, gamma), mulmod(beta, sigma0, p), p), p)\n }\n {\n let w1 := mload(add(proof, 0x1c0))\n let sigma1 := mload(add(proof, 0x260))\n perm := mulmod(perm, addmod(add(w1, gamma), mulmod(beta, sigma1, p), p), p)\n }\n {\n let w2 := mload(add(proof, 0x1e0))\n let sigma2 := mload(add(proof, 0x280))\n perm := mulmod(perm, addmod(add(w2, gamma), mulmod(beta, sigma2, p), p), p)\n }\n {\n let w3 := mload(add(proof, 0x200))\n let sigma3 := mload(add(proof, 0x2a0))\n perm := mulmod(perm, addmod(add(w3, gamma), mulmod(beta, sigma3, p), p), p)\n }\n\n // \\prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * (w_m + gamma) * z(xw)\n {\n let w4 := mload(add(proof, 0x220))\n let permNextEval := mload(add(proof, 0x2c0))\n perm := mulmod(perm, mulmod(addmod(w4, gamma, p), permNextEval, p), p)\n }\n\n let alpha := mload(chal)\n let alpha2 := mload(add(chal, 0x20))\n // PI - L1(x) * alpha^2 - alpha * \\prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * (w_m + gamma) * z(xw)\n res := addmod(piEval, sub(p, mulmod(alpha2, lagrangeOneEval, p)), p)\n res := addmod(res, sub(p, mulmod(alpha, perm, p)), p)\n }\n }\n\n /// @dev Compute components in [E]1 and [F]1 used for PolyComm opening verification\n /// equivalent of JF's https://github.com/EspressoSystems/jellyfish/blob/main/plonk/src/proof_system/verifier.rs#L154-L170\n /// caller allocates the memory fr commScalars and commBases\n /// requires Arrays of size 30.\n /// @param verifyingKey A verifier key\n /// @param evalData A polynomial evaluation\n /// @param proof A Plonk proof\n /// @param chal A set of challenges\n /// @param commScalars Common scalars\n /// @param commBases Common bases\n // The returned commitment is a generalization of\n // `[F]1` described in Sec 8.4, step 10 of https://eprint.iacr.org/2019/953.pdf\n // Returned evaluation is the scalar in `[E]1` described in Sec 8.4, step 11 of https://eprint.iacr.org/2019/953.pdf\n function _prepareOpeningProof(\n VerifyingKey memory verifyingKey,\n Poly.EvalData memory evalData,\n PlonkProof memory proof,\n Challenges memory chal,\n uint256[] memory commScalars,\n BN254.G1Point[] memory commBases\n ) internal pure returns (uint256 eval) {\n // compute the constant term of the linearization polynomial\n uint256 linPolyConstant = _computeLinPolyConstantTerm(chal, proof, evalData);\n\n _preparePolyCommitments(verifyingKey, chal, evalData, proof, commScalars, commBases);\n\n eval = _prepareEvaluations(linPolyConstant, proof, commScalars);\n }\n\n /// @dev Similar to `aggregate_poly_commitments()` in Jellyfish, but we are not aggregating multiple,\n /// but rather preparing for `[F]1` from a single proof.\n /// The caller allocates the memory fr commScalars and commBases.\n /// Requires Arrays of size 30.\n function _preparePolyCommitments(\n VerifyingKey memory verifyingKey,\n Challenges memory chal,\n Poly.EvalData memory evalData,\n PlonkProof memory proof,\n uint256[] memory commScalars,\n BN254.G1Point[] memory commBases\n ) internal pure {\n _linearizationScalarsAndBases(verifyingKey, chal, evalData, proof, commBases, commScalars);\n\n uint256 p = BN254.R_MOD;\n uint256 v = chal.v;\n uint256 vBase = v;\n\n // Add wire witness polynomial commitments.\n commScalars[20] = vBase;\n commBases[20] = proof.wire0;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n commScalars[21] = vBase;\n commBases[21] = proof.wire1;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n commScalars[22] = vBase;\n commBases[22] = proof.wire2;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n commScalars[23] = vBase;\n commBases[23] = proof.wire3;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n commScalars[24] = vBase;\n commBases[24] = proof.wire4;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n // Add wire sigma polynomial commitments. The last sigma commitment is excluded.\n commScalars[25] = vBase;\n commBases[25] = verifyingKey.sigma0;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n commScalars[26] = vBase;\n commBases[26] = verifyingKey.sigma1;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n commScalars[27] = vBase;\n commBases[27] = verifyingKey.sigma2;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n commScalars[28] = vBase;\n commBases[28] = verifyingKey.sigma3;\n assembly {\n vBase := mulmod(vBase, v, p)\n }\n\n // Add poly commitments to be evaluated at point `zeta * g`.\n commScalars[29] = chal.u;\n commBases[29] = proof.prodPerm;\n }\n\n /// @dev `aggregate_evaluations()` in Jellyfish, but since we are not aggregating multiple, but rather preparing `[E]1` from a single proof.\n /// @dev caller allocates the memory fr commScalars\n /// requires Arrays of size 30.\n /// @param linPolyConstant A linear polynomial constant\n /// @param proof A Plonk proof\n /// @param commScalars An array of common scalars\n /// The returned value is the scalar in `[E]1` described in Sec 8.4, step 11 of https://eprint.iacr.org/2019/953.pdf\n function _prepareEvaluations(\n uint256 linPolyConstant,\n PlonkProof memory proof,\n uint256[] memory commScalars\n ) internal pure returns (uint256 eval) {\n uint256 p = BN254.R_MOD;\n assembly {\n eval := sub(p, linPolyConstant)\n for {\n let i := 0\n } lt(i, 10) {\n i := add(i, 1)\n } {\n // the first u256 stores the length of this array;\n // the next 20 elements are used to store the linearization of the scalars\n // the first free space starts from 21\n let combiner := mload(add(commScalars, mul(add(i, 21), 0x20)))\n let termEval := mload(add(proof, add(0x1a0, mul(i, 0x20))))\n eval := addmod(eval, mulmod(combiner, termEval, p), p)\n }\n }\n }\n\n /// @dev Batchly verify multiple PCS opening proofs.\n /// `open_key` has been assembled from BN254.P1(), BN254.P2() and contract variable _betaH\n /// @param pcsInfos An array of PcsInfo\n /// @dev Returns true if the entire batch verifiies and false otherwise.\n function _batchVerifyOpeningProofs(PcsInfo[] memory pcsInfos) internal view returns (bool) {\n uint256 pcsLen = pcsInfos.length;\n uint256 p = BN254.R_MOD;\n // Compute a pseudorandom challenge from the instances\n uint256 r = 1; // for a single proof, no need to use `r` (`r=1` has no effect)\n if (pcsLen > 1) {\n Transcript.TranscriptData memory transcript;\n for (uint256 i = 0; i < pcsLen; i++) {\n transcript.appendChallenge(pcsInfos[i].u);\n }\n r = transcript.getAndAppendChallenge();\n }\n\n BN254.G1Point memory a1;\n BN254.G1Point memory b1;\n\n // Compute A := A0 + r * A1 + ... + r^{m-1} * Am\n {\n uint256[] memory scalars = new uint256[](2 * pcsLen);\n BN254.G1Point[] memory bases = new BN254.G1Point[](2 * pcsLen);\n uint256 rBase = 1;\n for (uint256 i = 0; i < pcsLen; i++) {\n scalars[2 * i] = rBase;\n bases[2 * i] = pcsInfos[i].openingProof;\n\n {\n // slither-disable-next-line write-after-write\n uint256 tmp;\n uint256 u = pcsInfos[i].u;\n assembly {\n tmp := mulmod(rBase, u, p)\n }\n scalars[2 * i + 1] = tmp;\n }\n bases[2 * i + 1] = pcsInfos[i].shiftedOpeningProof;\n\n assembly {\n rBase := mulmod(rBase, r, p)\n }\n }\n a1 = BN254.multiScalarMul(bases, scalars);\n }\n\n // Compute B := B0 + r * B1 + ... + r^{m-1} * Bm\n {\n uint256[] memory scalars;\n BN254.G1Point[] memory bases;\n {\n // variable scoping to avoid \"Stack too deep\"\n uint256 scalarsLenPerInfo = pcsInfos[0].commScalars.length;\n uint256 totalScalarsLen = (2 + scalarsLenPerInfo) * pcsInfos.length + 1;\n scalars = new uint256[](totalScalarsLen);\n bases = new BN254.G1Point[](totalScalarsLen);\n }\n uint256 sumEvals = 0;\n uint256 idx = 0;\n uint256 rBase = 1;\n for (uint256 i = 0; i < pcsInfos.length; i++) {\n for (uint256 j = 0; j < pcsInfos[0].commScalars.length; j++) {\n {\n // scalars[idx] = (rBase * pcsInfos[i].commScalars[j]) % BN254.R_MOD;\n uint256 s = pcsInfos[i].commScalars[j];\n uint256 tmp;\n assembly {\n // slither-disable-next-line variable-scope\n tmp := mulmod(rBase, s, p)\n }\n scalars[idx] = tmp;\n }\n bases[idx] = pcsInfos[i].commBases[j];\n idx += 1;\n }\n\n {\n // scalars[idx] = (rBase * pcsInfos[i].evalPoint) % BN254.R_MOD;\n uint256 evalPoint = pcsInfos[i].evalPoint;\n uint256 tmp;\n assembly {\n // slither-disable-next-line variable-scope\n tmp := mulmod(rBase, evalPoint, p)\n }\n scalars[idx] = tmp;\n }\n bases[idx] = pcsInfos[i].openingProof;\n idx += 1;\n\n {\n // scalars[idx] = (rBase * pcsInfos[i].u * pcsInfos[i].nextEvalPoint) % BN254.R_MOD;\n uint256 u = pcsInfos[i].u;\n uint256 nextEvalPoint = pcsInfos[i].nextEvalPoint;\n uint256 tmp;\n assembly {\n // slither-disable-next-line variable-scope\n tmp := mulmod(rBase, mulmod(u, nextEvalPoint, p), p)\n }\n scalars[idx] = tmp;\n }\n bases[idx] = pcsInfos[i].shiftedOpeningProof;\n idx += 1;\n\n {\n // sumEvals = (sumEvals + rBase * pcsInfos[i].eval) % BN254.R_MOD;\n // rBase = (rBase * r) % BN254.R_MOD;\n uint256 eval = pcsInfos[i].eval;\n assembly {\n sumEvals := addmod(sumEvals, mulmod(rBase, eval, p), p)\n rBase := mulmod(rBase, r, p)\n }\n }\n }\n scalars[idx] = BN254.negate(sumEvals);\n bases[idx] = BN254.P1();\n b1 = BN254.negate(BN254.multiScalarMul(bases, scalars));\n }\n\n // Check e(A, [x]2) ?= e(B, [1]2)\n return BN254.pairingProd2(a1, _betaH, b1, BN254.P2());\n }\n\n /// @dev Compute the linearization of the scalars and bases.\n /// The caller allocates the memory from commScalars and commBases.\n /// Requires arrays of size 30.\n /// @param verifyingKey The verifying key\n /// @param challenge A set of challenges\n /// @param evalData Polynomial evaluation data\n /// @param proof A Plonk proof\n /// @param bases An array of BN254 G1 points\n /// @param scalars An array of scalars\n function _linearizationScalarsAndBases(\n VerifyingKey memory verifyingKey,\n Challenges memory challenge,\n Poly.EvalData memory evalData,\n PlonkProof memory proof,\n BN254.G1Point[] memory bases,\n uint256[] memory scalars\n ) internal pure {\n uint256 firstScalar;\n uint256 secondScalar;\n uint256 rhs;\n uint256 tmp;\n uint256 tmp2;\n uint256 p = BN254.R_MOD;\n\n // ============================================\n // Compute coefficient for the permutation product polynomial commitment.\n // firstScalar =\n // L1(zeta) * alpha^2\n // + alpha\n // * (beta * zeta + wireEval0 + gamma)\n // * (beta * k1 * zeta + wireEval1 + gamma)\n // * (beta * k2 * zeta + wireEval2 + gamma)\n // * ...\n // where wireEval0, wireEval1, wireEval2, ... are in w_evals\n // ============================================\n // first base and scala:\n // - proof.prodPerm\n // - firstScalar\n assembly {\n // firstScalar = alpha^2 * L1(zeta)\n firstScalar := mulmod(mload(add(challenge, 0x20)), mload(add(evalData, 0x20)), p)\n\n // rhs = alpha\n rhs := mload(challenge)\n\n // tmp = beta * zeta\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(challenge, 0xA0)), p)\n\n // =================================\n // k0 (which is 1) component\n // (beta * zeta + wireEval0 + gamma)\n // =================================\n tmp2 := addmod(tmp, mload(add(proof, 0x1A0)), p)\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\n\n rhs := mulmod(tmp2, rhs, p)\n\n // =================================\n // k1 component\n // (beta * zeta * k1 + wireEval1 + gamma)\n // =================================\n tmp2 := mulmod(tmp, _COSET_K1, p)\n tmp2 := addmod(tmp2, mload(add(proof, 0x1C0)), p)\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\n\n rhs := mulmod(tmp2, rhs, p)\n\n // =================================\n // k2 component\n // (beta * zeta * k2 + wireEval2 + gamma)\n // =================================\n tmp2 := mulmod(tmp, _COSET_K2, p)\n tmp2 := addmod(tmp2, mload(add(proof, 0x1E0)), p)\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\n rhs := mulmod(tmp2, rhs, p)\n\n // =================================\n // k3 component\n // (beta * zeta * k3 + wireEval3 + gamma)\n // =================================\n tmp2 := mulmod(tmp, _COSET_K3, p)\n tmp2 := addmod(tmp2, mload(add(proof, 0x200)), p)\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\n rhs := mulmod(tmp2, rhs, p)\n\n // =================================\n // k4 component\n // (beta * zeta * k4 + wireEval4 + gamma)\n // =================================\n tmp2 := mulmod(tmp, _COSET_K4, p)\n tmp2 := addmod(tmp2, mload(add(proof, 0x220)), p)\n tmp2 := addmod(tmp2, mload(add(challenge, 0x80)), p)\n rhs := mulmod(tmp2, rhs, p)\n\n firstScalar := addmod(firstScalar, rhs, p)\n }\n bases[0] = proof.prodPerm;\n scalars[0] = firstScalar;\n\n // ============================================\n // Compute coefficient for the last wire sigma polynomial commitment.\n // secondScalar = alpha * beta * z_w * [s_sigma_3]_1\n // * (wireEval0 + gamma + beta * sigmaEval0)\n // * (wireEval1 + gamma + beta * sigmaEval1)\n // * ...\n // ============================================\n // second base and scala:\n // - verifyingKey.sigma4\n // - secondScalar\n assembly {\n // secondScalar = alpha * beta * z_w\n secondScalar := mulmod(mload(challenge), mload(add(challenge, 0x60)), p)\n secondScalar := mulmod(secondScalar, mload(add(proof, 0x2C0)), p)\n\n // (wireEval0 + gamma + beta * sigmaEval0)\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(proof, 0x240)), p)\n tmp := addmod(tmp, mload(add(proof, 0x1A0)), p)\n tmp := addmod(tmp, mload(add(challenge, 0x80)), p)\n\n secondScalar := mulmod(secondScalar, tmp, p)\n\n // (wireEval1 + gamma + beta * sigmaEval1)\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(proof, 0x260)), p)\n tmp := addmod(tmp, mload(add(proof, 0x1C0)), p)\n tmp := addmod(tmp, mload(add(challenge, 0x80)), p)\n\n secondScalar := mulmod(secondScalar, tmp, p)\n\n // (wireEval2 + gamma + beta * sigmaEval2)\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(proof, 0x280)), p)\n tmp := addmod(tmp, mload(add(proof, 0x1E0)), p)\n tmp := addmod(tmp, mload(add(challenge, 0x80)), p)\n\n secondScalar := mulmod(secondScalar, tmp, p)\n\n // (wireEval3 + gamma + beta * sigmaEval3)\n tmp := mulmod(mload(add(challenge, 0x60)), mload(add(proof, 0x2A0)), p)\n tmp := addmod(tmp, mload(add(proof, 0x200)), p)\n tmp := addmod(tmp, mload(add(challenge, 0x80)), p)\n\n secondScalar := mulmod(secondScalar, tmp, p)\n }\n bases[1] = verifyingKey.sigma4;\n scalars[1] = p - secondScalar;\n\n // ============================================\n // next 13 are for selectors:\n //\n // the selectors are organized as\n // - q_lc\n // - q_mul\n // - q_hash\n // - q_o\n // - q_c\n // - q_ecc\n // ============================================\n\n // ============\n // q_lc\n // ============\n // q_1...q_4\n scalars[2] = proof.wireEval0;\n scalars[3] = proof.wireEval1;\n scalars[4] = proof.wireEval2;\n scalars[5] = proof.wireEval3;\n bases[2] = verifyingKey.q1;\n bases[3] = verifyingKey.q2;\n bases[4] = verifyingKey.q3;\n bases[5] = verifyingKey.q4;\n\n // ============\n // q_M\n // ============\n // q_M12 and q_M34\n // q_M12 = w_evals[0] * w_evals[1];\n assembly {\n tmp := mulmod(mload(add(proof, 0x1A0)), mload(add(proof, 0x1C0)), p)\n }\n scalars[6] = tmp;\n bases[6] = verifyingKey.qM12;\n\n assembly {\n tmp := mulmod(mload(add(proof, 0x1E0)), mload(add(proof, 0x200)), p)\n }\n scalars[7] = tmp;\n bases[7] = verifyingKey.qM34;\n\n // ============\n // q_H\n // ============\n // w_evals[0].pow([5]);\n assembly {\n tmp := mload(add(proof, 0x1A0))\n tmp2 := mulmod(tmp, tmp, p)\n tmp2 := mulmod(tmp2, tmp2, p)\n tmp := mulmod(tmp, tmp2, p)\n }\n scalars[8] = tmp;\n bases[8] = verifyingKey.qH1;\n\n // w_evals[1].pow([5]);\n assembly {\n tmp := mload(add(proof, 0x1C0))\n tmp2 := mulmod(tmp, tmp, p)\n tmp2 := mulmod(tmp2, tmp2, p)\n tmp := mulmod(tmp, tmp2, p)\n }\n scalars[9] = tmp;\n bases[9] = verifyingKey.qH2;\n\n // w_evals[2].pow([5]);\n assembly {\n tmp := mload(add(proof, 0x1E0))\n tmp2 := mulmod(tmp, tmp, p)\n tmp2 := mulmod(tmp2, tmp2, p)\n tmp := mulmod(tmp, tmp2, p)\n }\n scalars[10] = tmp;\n bases[10] = verifyingKey.qH3;\n\n // w_evals[3].pow([5]);\n assembly {\n tmp := mload(add(proof, 0x200))\n tmp2 := mulmod(tmp, tmp, p)\n tmp2 := mulmod(tmp2, tmp2, p)\n tmp := mulmod(tmp, tmp2, p)\n }\n scalars[11] = tmp;\n bases[11] = verifyingKey.qH4;\n\n // ============\n // q_o and q_c\n // ============\n // q_o\n scalars[12] = p - proof.wireEval4;\n bases[12] = verifyingKey.qO;\n // q_c\n scalars[13] = 1;\n bases[13] = verifyingKey.qC;\n\n // ============\n // q_Ecc\n // ============\n // q_Ecc = w_evals[0] * w_evals[1] * w_evals[2] * w_evals[3] * w_evals[4];\n assembly {\n tmp := mulmod(mload(add(proof, 0x1A0)), mload(add(proof, 0x1C0)), p)\n tmp := mulmod(tmp, mload(add(proof, 0x1E0)), p)\n tmp := mulmod(tmp, mload(add(proof, 0x200)), p)\n tmp := mulmod(tmp, mload(add(proof, 0x220)), p)\n }\n scalars[14] = tmp;\n bases[14] = verifyingKey.qEcc;\n\n // ============================================\n // the last 5 are for splitting quotient commitments\n // ============================================\n\n // first one is 1-zeta^n\n scalars[15] = p - evalData.vanishEval;\n bases[15] = proof.split0;\n assembly {\n // tmp = zeta^{n+2}\n tmp := addmod(mload(evalData), 1, p)\n // todo: use pre-computed zeta^2\n tmp2 := mulmod(mload(add(challenge, 0xA0)), mload(add(challenge, 0xA0)), p)\n tmp := mulmod(tmp, tmp2, p)\n }\n\n // second one is (1-zeta^n) zeta^(n+2)\n assembly {\n tmp2 := mulmod(mload(add(scalars, mul(16, 0x20))), tmp, p)\n }\n scalars[16] = tmp2;\n bases[16] = proof.split1;\n\n // third one is (1-zeta^n) zeta^2(n+2)\n assembly {\n tmp2 := mulmod(mload(add(scalars, mul(17, 0x20))), tmp, p)\n }\n scalars[17] = tmp2;\n bases[17] = proof.split2;\n\n // forth one is (1-zeta^n) zeta^3(n+2)\n assembly {\n tmp2 := mulmod(mload(add(scalars, mul(18, 0x20))), tmp, p)\n }\n scalars[18] = tmp2;\n bases[18] = proof.split3;\n\n // fifth one is (1-zeta^n) zeta^4(n+2)\n assembly {\n tmp2 := mulmod(mload(add(scalars, mul(19, 0x20))), tmp, p)\n }\n scalars[19] = tmp2;\n bases[19] = proof.split4;\n }\n}\n" + }, + "contracts/libraries/PolynomialEval.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {BN254} from \"../libraries/BN254.sol\";\n\nlibrary PolynomialEval {\n /// @dev a Radix 2 Evaluation Domain\n struct EvalDomain {\n uint256 logSize; // log_2(self.size)\n uint256 size; // Size of the domain as a field element\n uint256 sizeInv; // Inverse of the size in the field\n uint256 groupGen; // A generator of the subgroup\n uint256 groupGenInv; // Inverse of the generator of the subgroup\n }\n\n /// @dev stores vanishing poly, lagrange at 1, and Public input poly\n struct EvalData {\n uint256 vanishEval;\n uint256 lagrangeOne;\n uint256 piEval;\n }\n\n /// @dev compute the EvalData for a given domain and a challenge zeta\n function evalDataGen(\n EvalDomain memory self,\n uint256 zeta,\n uint256[] memory publicInput\n ) internal view returns (EvalData memory evalData) {\n evalData.vanishEval = evaluateVanishingPoly(self, zeta);\n evalData.lagrangeOne = evaluateLagrangeOne(self, zeta, evalData.vanishEval);\n evalData.piEval = evaluatePiPoly(self, publicInput, zeta, evalData.vanishEval);\n }\n\n /// @dev Create a new Radix2EvalDomain with `domainSize` which should be power of 2.\n /// @dev Will revert if domainSize is not among {2^14, 2^15, 2^16, 2^17}\n function newEvalDomain(uint256 domainSize) internal pure returns (EvalDomain memory) {\n if (domainSize == 16384) {\n return\n EvalDomain(\n 14,\n domainSize,\n 0x30638CE1A7661B6337A964756AA75257C6BF4778D89789AB819CE60C19B04001,\n 0x2D965651CDD9E4811F4E51B80DDCA8A8B4A93EE17420AAE6ADAA01C2617C6E85,\n 0x281C036F06E7E9E911680D42558E6E8CF40976B0677771C0F8EEE934641C8410\n );\n } else if (domainSize == 32768) {\n return\n EvalDomain(\n 15,\n domainSize,\n 0x3063edaa444bddc677fcd515f614555a777997e0a9287d1e62bf6dd004d82001,\n 0x2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb,\n 0x05d33766e4590b3722701b6f2fa43d0dc3f028424d384e68c92a742fb2dbc0b4\n );\n } else if (domainSize == 65536) {\n return\n EvalDomain(\n 16,\n domainSize,\n 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001,\n 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7,\n 0x0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4\n );\n } else if (domainSize == 131072) {\n return\n EvalDomain(\n 17,\n domainSize,\n 0x30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801,\n 0x1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e5,\n 0x244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22\n );\n } else {\n revert(\"Poly: size must in 2^{14~17}\");\n }\n }\n\n // This evaluates the vanishing polynomial for this domain at zeta.\n // For multiplicative subgroups, this polynomial is\n // `z(X) = X^self.size - 1`.\n function evaluateVanishingPoly(EvalDomain memory self, uint256 zeta)\n internal\n pure\n returns (uint256 res)\n {\n uint256 p = BN254.R_MOD;\n uint256 logSize = self.logSize;\n\n assembly {\n switch zeta\n case 0 {\n res := sub(p, 1)\n }\n default {\n res := zeta\n for {\n let i := 0\n } lt(i, logSize) {\n i := add(i, 1)\n } {\n res := mulmod(res, res, p)\n }\n // since zeta != 0 we know that res is not 0\n // so we can safely do a subtraction\n res := sub(res, 1)\n }\n }\n }\n\n /// @dev Evaluate the lagrange polynomial at point `zeta` given the vanishing polynomial evaluation `vanish_eval`.\n function evaluateLagrangeOne(\n EvalDomain memory self,\n uint256 zeta,\n uint256 vanishEval\n ) internal view returns (uint256 res) {\n if (vanishEval == 0) {\n return 0;\n }\n\n uint256 p = BN254.R_MOD;\n uint256 divisor;\n uint256 vanishEvalMulSizeInv = self.sizeInv;\n\n // =========================\n // lagrange_1_eval = vanish_eval / self.size / (zeta - 1)\n // =========================\n assembly {\n vanishEvalMulSizeInv := mulmod(vanishEval, vanishEvalMulSizeInv, p)\n\n switch zeta\n case 0 {\n divisor := sub(p, 1)\n }\n default {\n divisor := sub(zeta, 1)\n }\n }\n divisor = BN254.invert(divisor);\n assembly {\n res := mulmod(vanishEvalMulSizeInv, divisor, p)\n }\n }\n\n /// @dev Evaluate public input polynomial at point `zeta`.\n function evaluatePiPoly(\n EvalDomain memory self,\n uint256[] memory pi,\n uint256 zeta,\n uint256 vanishEval\n ) internal view returns (uint256 res) {\n if (vanishEval == 0) {\n return 0;\n }\n\n uint256 p = BN254.R_MOD;\n uint256 length = pi.length;\n uint256 ithLagrange;\n uint256 ithDivisor;\n uint256 tmp;\n uint256 vanishEvalDivN = self.sizeInv;\n uint256 divisorProd;\n uint256[] memory localDomainElements = domainElements(self, length);\n uint256[] memory divisors = new uint256[](length);\n\n assembly {\n // vanish_eval_div_n = (zeta^n-1)/n\n vanishEvalDivN := mulmod(vanishEvalDivN, vanishEval, p)\n\n // Now we need to compute\n // \\sum_{i=0..l} L_{i,H}(zeta) * pub_input[i]\n // where\n // - L_{i,H}(zeta)\n // = Z_H(zeta) * v_i / (zeta - g^i)\n // = vanish_eval_div_n * g^i / (zeta - g^i)\n // - v_i = g^i / n\n //\n // we want to use batch inversion method where we compute\n //\n // divisorProd = 1 / \\prod (zeta - g^i)\n //\n // and then each 1 / (zeta - g^i) can be computed via (length - 1)\n // multiplications:\n //\n // 1 / (zeta - g^i) = divisorProd * \\prod_{j!=i} (zeta - g^j)\n //\n // In total this takes n(n-1) multiplications and 1 inversion,\n // instead of doing n inversions.\n divisorProd := 1\n\n for {\n let i := 0\n } lt(i, length) {\n i := add(i, 1)\n } {\n // tmp points to g^i\n // first 32 bytes of reference is the length of an array\n tmp := mload(add(add(localDomainElements, 0x20), mul(i, 0x20)))\n // compute (zeta - g^i)\n ithDivisor := addmod(sub(p, tmp), zeta, p)\n // accumulate (zeta - g^i) to the divisorProd\n divisorProd := mulmod(divisorProd, ithDivisor, p)\n // store ithDivisor in the array\n mstore(add(add(divisors, 0x20), mul(i, 0x20)), ithDivisor)\n }\n }\n\n // compute 1 / \\prod_{i=0}^length (zeta - g^i)\n divisorProd = BN254.invert(divisorProd);\n\n assembly {\n for {\n let i := 0\n } lt(i, length) {\n i := add(i, 1)\n } {\n // tmp points to g^i\n // first 32 bytes of reference is the length of an array\n tmp := mload(add(add(localDomainElements, 0x20), mul(i, 0x20)))\n // vanish_eval_div_n * g^i\n ithLagrange := mulmod(vanishEvalDivN, tmp, p)\n\n // now we compute vanish_eval_div_n * g^i / (zeta - g^i) via\n // vanish_eval_div_n * g^i * divisorProd * \\prod_{j!=i} (zeta - g^j)\n ithLagrange := mulmod(ithLagrange, divisorProd, p)\n for {\n let j := 0\n } lt(j, length) {\n j := add(j, 1)\n } {\n if iszero(eq(i, j)) {\n ithDivisor := mload(add(add(divisors, 0x20), mul(j, 0x20)))\n ithLagrange := mulmod(ithLagrange, ithDivisor, p)\n }\n }\n\n // multiply by pub_input[i] and update res\n // tmp points to public input\n tmp := mload(add(add(pi, 0x20), mul(i, 0x20)))\n ithLagrange := mulmod(ithLagrange, tmp, p)\n res := addmod(res, ithLagrange, p)\n }\n }\n }\n\n /// @dev Generate the domain elements for indexes 0..length\n /// which are essentially g^0, g^1, ..., g^{length-1}\n function domainElements(EvalDomain memory self, uint256 length)\n internal\n pure\n returns (uint256[] memory elements)\n {\n uint256 groupGen = self.groupGen;\n uint256 tmp = 1;\n uint256 p = BN254.R_MOD;\n elements = new uint256[](length);\n assembly {\n if not(iszero(length)) {\n let ptr := add(elements, 0x20)\n let end := add(ptr, mul(0x20, length))\n mstore(ptr, 1)\n ptr := add(ptr, 0x20)\n // for (; ptr < end; ptr += 32) loop through the memory of `elements`\n for {\n\n } lt(ptr, end) {\n ptr := add(ptr, 0x20)\n } {\n tmp := mulmod(tmp, groupGen, p)\n mstore(ptr, tmp)\n }\n }\n }\n }\n}\n" + }, + "contracts/mocks/TestPolynomialEval.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {PolynomialEval} from \"../libraries/PolynomialEval.sol\";\n\ncontract TestPolynomialEval {\n function evaluateVanishingPoly(PolynomialEval.EvalDomain memory self, uint256 zeta)\n public\n pure\n returns (uint256)\n {\n return PolynomialEval.evaluateVanishingPoly(self, zeta);\n }\n\n function evaluateLagrange(\n PolynomialEval.EvalDomain memory self,\n uint256 zeta,\n uint256 vanishEval\n ) public view returns (uint256) {\n return PolynomialEval.evaluateLagrangeOne(self, zeta, vanishEval);\n }\n\n function evaluatePiPoly(\n PolynomialEval.EvalDomain memory self,\n uint256[] memory pi,\n uint256 zeta,\n uint256 vanishEval\n ) public view returns (uint256) {\n return PolynomialEval.evaluatePiPoly(self, pi, zeta, vanishEval);\n }\n\n function newEvalDomain(uint256 domainSize)\n public\n pure\n returns (PolynomialEval.EvalDomain memory)\n {\n if (domainSize >= 32768) {\n return PolynomialEval.newEvalDomain(domainSize);\n } else if (domainSize == 32) {\n // support smaller domains for testing\n return\n PolynomialEval.EvalDomain(\n 5,\n domainSize,\n 0x2EE12BFF4A2813286A8DC388CD754D9A3EF2490635EBA50CB9C2E5E750800001,\n 0x09C532C6306B93D29678200D47C0B2A99C18D51B838EEB1D3EED4C533BB512D0,\n 0x2724713603BFBD790AEAF3E7DF25D8E7EF8F311334905B4D8C99980CF210979D\n );\n } else {\n revert(\"domain size not supported\");\n }\n }\n}\n" + }, + "contracts/mocks/TestPlonkVerifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {BN254} from \"../libraries/BN254.sol\";\nimport {PlonkVerifier as V} from \"../verifier/PlonkVerifier.sol\";\nimport {PolynomialEval as Poly} from \"../libraries/PolynomialEval.sol\";\nimport {TestPolynomialEval as TestPoly} from \"../mocks/TestPolynomialEval.sol\";\nimport \"hardhat/console.sol\";\n\ncontract TestPlonkVerifier is V, TestPoly {\n function computeLinPolyConstantTerm(\n Challenges memory chal,\n PlonkProof memory proof,\n Poly.EvalData memory evalData\n ) public pure returns (uint256 res) {\n return V._computeLinPolyConstantTerm(chal, proof, evalData);\n }\n\n function prepareEvaluations(\n uint256 linPolyConstant,\n PlonkProof memory proof,\n uint256[] memory scalars\n ) public pure returns (uint256 eval) {\n return V._prepareEvaluations(linPolyConstant, proof, scalars);\n }\n\n function batchVerifyOpeningProofs(PcsInfo[] memory pcsInfos) public view returns (bool) {\n return V._batchVerifyOpeningProofs(pcsInfos);\n }\n\n function computeChallenges(\n V.VerifyingKey memory verifyingKey,\n uint256[] memory publicInput,\n V.PlonkProof memory proof,\n bytes memory extraTranscriptInitMsg\n ) public pure returns (V.Challenges memory) {\n return V._computeChallenges(verifyingKey, publicInput, proof, extraTranscriptInitMsg);\n }\n\n function linearizationScalarsAndBases(\n V.VerifyingKey memory verifyingKey,\n V.Challenges memory challenge,\n Poly.EvalData memory evalData,\n V.PlonkProof memory proof\n ) public pure returns (BN254.G1Point[] memory bases, uint256[] memory scalars) {\n bases = new BN254.G1Point[](30);\n scalars = new uint256[](30);\n\n V._linearizationScalarsAndBases(verifyingKey, challenge, evalData, proof, bases, scalars);\n }\n\n function preparePolyCommitments(\n VerifyingKey memory verifyingKey,\n Challenges memory chal,\n Poly.EvalData memory evalData,\n PlonkProof memory proof\n ) public pure returns (uint256[] memory commScalars, BN254.G1Point[] memory commBases) {\n commBases = new BN254.G1Point[](30);\n commScalars = new uint256[](30);\n V._preparePolyCommitments(verifyingKey, chal, evalData, proof, commScalars, commBases);\n }\n\n // helper so that test code doesn't have to deploy both PlonkVerifier.sol and BN254.sol\n function multiScalarMul(BN254.G1Point[] memory bases, uint256[] memory scalars)\n public\n view\n returns (BN254.G1Point memory)\n {\n return BN254.multiScalarMul(bases, scalars);\n }\n\n function preparePcsInfo(\n VerifyingKey memory verifyingKey,\n uint256[] memory publicInput,\n PlonkProof memory proof,\n bytes memory extraTranscriptInitMsg\n ) public view returns (PcsInfo memory res) {\n require(publicInput.length == verifyingKey.numInputs, \"Plonk: wrong verifying key\");\n\n Challenges memory chal = V._computeChallenges(\n verifyingKey,\n publicInput,\n proof,\n extraTranscriptInitMsg\n );\n\n // NOTE: the only difference with actual code\n Poly.EvalDomain memory domain = newEvalDomain(verifyingKey.domainSize);\n // pre-compute evaluation data\n Poly.EvalData memory evalData = Poly.evalDataGen(domain, chal.zeta, publicInput);\n\n // compute opening proof in poly comm.\n uint256[] memory commScalars = new uint256[](30);\n BN254.G1Point[] memory commBases = new BN254.G1Point[](30);\n\n uint256 eval = _prepareOpeningProof(\n verifyingKey,\n evalData,\n proof,\n chal,\n commScalars,\n commBases\n );\n\n uint256 zeta = chal.zeta;\n uint256 omega = domain.groupGen;\n uint256 p = BN254.R_MOD;\n uint256 zetaOmega;\n assembly {\n zetaOmega := mulmod(zeta, omega, p)\n }\n\n res = PcsInfo(\n chal.u,\n zeta,\n zetaOmega,\n eval,\n commScalars,\n commBases,\n proof.zeta,\n proof.zetaOmega\n );\n }\n\n function testBatchVerify(\n VerifyingKey[] memory verifyingKeys,\n uint256[][] memory publicInputs,\n PlonkProof[] memory proofs,\n bytes[] memory extraTranscriptInitMsgs\n ) public view returns (bool) {\n require(\n verifyingKeys.length == proofs.length &&\n publicInputs.length == proofs.length &&\n extraTranscriptInitMsgs.length == proofs.length,\n \"Plonk: invalid input param\"\n );\n require(proofs.length > 0, \"Plonk: need at least 1 proof\");\n\n PcsInfo[] memory pcsInfos = new PcsInfo[](proofs.length);\n for (uint256 i = 0; i < proofs.length; i++) {\n // validate proofs are proper group/field elements\n V._validateProof(proofs[i]);\n\n // validate public input are all proper scalar fields\n for (uint256 j = 0; j < publicInputs[i].length; j++) {\n BN254.validateScalarField(publicInputs[i][j]);\n }\n\n // NOTE: only difference with actual code\n pcsInfos[i] = preparePcsInfo(\n verifyingKeys[i],\n publicInputs[i],\n proofs[i],\n extraTranscriptInitMsgs[i]\n );\n }\n\n return _batchVerifyOpeningProofs(pcsInfos);\n }\n}\n" + }, + "contracts/RescueNonOptimized.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"hardhat/console.sol\";\n\ncontract RescueNonOptimized {\n /// The constants are obtained from the Sage script\n /// https://github.com/EspressoSystems/Marvellous/blob/fcd4c41672f485ac2f62526bc87a16789d4d0459/rescue254.sage\n\n uint256 internal constant _N_ROUNDS = 12;\n uint256 internal constant _STATE_SIZE = 4;\n uint256 internal constant _SCHEDULED_KEY_SIZE = (2 * _N_ROUNDS + 1) * _STATE_SIZE;\n uint256 internal constant _MDS_SIZE = _STATE_SIZE * _STATE_SIZE;\n\n // Obtained by running KeyScheduling([0,0,0,0]). See Algorithm 2 of AT specification document.\n // solhint-disable-next-line var-name-mixedcase\n uint256[_SCHEDULED_KEY_SIZE] internal _SCHEDULED_KEY = [\n // Init key injection\n 14613516837064033601098425266946467918409544647446217386229959902054563533267,\n 376600575581954944138907282479272751264978206975465380433764825531344567663,\n 7549886658634274343394883631367643327196152481472281919735617268044202589860,\n 3682071510138521345600424597536598375718773365536872232193107639375194756918,\n // i = 0\n 18657517374128716281071590782771170166993445602755371021955596036781411817786,\n 7833794394096838639430144230563403530989402760602204539559270044687522640191,\n 21303828694647266539931030987057572024333442749881970102454081226349775826204,\n 10601447988834057856019990466870413629636256450824419416829818546423193802418,\n // i = 1\n 3394657260998945409283098835682964352503279447198495330506177586645995289229,\n 18437084083724939316390841967750487133622937044030373241106776324730657101302,\n 9281739916935170266925270432337475828741505406943764438550188362765269530037,\n 7363758719535652813463843693256839865026387361836644774317493432208443086206,\n // i = 2\n 307094088106440279963968943984309088038734274328527845883669678290790702381,\n 20802277384865839022876847241719852837518994021170013346790603773477912819001,\n 19754579269464973651593381036132218829220609572271224048608091445854164824042,\n 3618840933841571232310395486452077846249117988789467996234635426899783130819,\n // i = 3\n 2604166168648013711791424714498680546427073388134923208733633668316805639713,\n 21355705619901626246699129842094174300693414345856149669339147704587730744579,\n 492957643799044929042114590851019953669919577182050726596188173945730031352,\n 8495959434717951575638107349559891417392372124707619959558593515759091841138,\n // i = 4\n 15608173629791582453867933160400609222904457931922627396107815347244961625587,\n 16346164988481725869223011419855264063160651334419415042919928342589111681923,\n 21085652277104054699752179865196164165969290053517659864117475352262716334100,\n 20640310021063232205677193759981403045043444605175178332133134865746039279935,\n // i = 5\n 6015589261538006311719125697023069952804098656652050863009463360598997670240,\n 12498423882721726012743791752811798719201859023192663855805526312393108407357,\n 10785527781711732350693172404486938622378708235957779975342240483505724965040,\n 5563181134859229953817163002660048854420912281911747312557025480927280392569,\n // i = 6\n 4585980485870975597083581718044393941512074846925247225127276913719050121968,\n 8135760428078872176830812746579993820254685977237403304445687861806698035222,\n 4525715538433244696411192727226186804883202134636681498489663161593606654720,\n 2537497100749435007113677475828631400227339157221711397900070636998427379023,\n // i = 7\n 6957758175844522415482704083077249782181516476067074624906502033584870962925,\n 17134288156316028142861248367413235848595762718317063354217292516610545487813,\n 20912428573104312239411321877435657586184425249645076131891636094671938892815,\n 16000236205755938926858829908701623009580043315308207671921283074116709575629,\n // i = 8\n 10226182617544046880850643054874064693998595520540061157646952229134207239372,\n 18584346134948015676264599354709457865255277240606855245909703396343731224626,\n 9263628039314899758000383385773954136696958567872461042004915206775147151562,\n 21095966719856094705113273596585696209808876361583941931684481364905087347856,\n // i = 9\n 2671157351815122058649197205531097090514563992249109660044882868649840700911,\n 19371695134219415702961622134896564229962454573253508904477489696588594622079,\n 5458968308231210904289987830881528056037123818964633914555287871152343390175,\n 7336332584551233792026746889434554547883125466404119632794862500961953384162,\n // i = 10\n 10351436748086126474964482623536554036637945319698748519226181145454116702488,\n 10588209357420186457766745724579739104572139534486480334142455690083813419064,\n 14330277147584936710957102218096795520430543834717433464500965846826655802131,\n 20752197679372238381408962682213349118865256502118746003818603260257076802028,\n // i = 11\n 19390446529582160674621825412345750405397926216690583196542690617266028463414,\n 4169994013656329171830126793466321040216273832271989491631696813297571003664,\n 3014817248268674641565961681956715664833306954478820029563459099892548946802,\n 14285412497877984113655094566695921704826935980354186365694472961163628072901,\n // i = 12\n 16224484149774307577146165975762490690838415946665379067259822320752729067513,\n 5404416528124718330316441408560295270695591369912905197499507811036327404407,\n 20127204244332635127213425090893250761286848618448128307344971109698523903374,\n 14939477686176063572999014162186372798386193194442661892600584389296609365740,\n // i = 13\n 183740587182448242823071506013879595265109215202349952517434740768878294134,\n 15366166801397358994305040367078329374182896694582870542425225835844885654667,\n 10066796014802701613007252979619633540090232697942390802486559078446300507813,\n 4824035239925904398047276123907644574421550988870123756876333092498925242854,\n // i = 14\n 5526416022516734657935645023952329824887761902324086126076396040056459740202,\n 18157816292703983306114736850721419851645159304249709756659476015594698876611,\n 767446206481623130855439732549764381286210118638028499466788453347759203223,\n 16303412231051555792435190427637047658258796056382698277687500021321460387129,\n // i = 15\n 15475465085113677237835653765189267963435264152924949727326000496982746660612,\n 14574823710073720047190393602502575509282844662732045439760066078137662816054,\n 13746490178929963947720756220409862158443939172096620003896874772477437733602,\n 13804898145881881347835367366352189037341704254740510664318597456840481739975,\n // i = 16\n 3523599105403569319090449327691358425990456728660349400211678603795116364226,\n 8632053982708637954870974502506145434219829622278773822242070316888003350278,\n 20293222318844554840191640739970825558851264905959070636369796127300969629060,\n 7583204376683983181255811699503668584283525661852773339144064901897953897564,\n // i = 17\n 7562572155566079175343789986900217168516831778275127159068657756836798778249,\n 12689811910161401007144285031988539999455902164332232460061366402869461973371,\n 21878400680687418538050108788381481970431106443696421074205107984690362920637,\n 3428721187625124675258692786364137915132424621324969246210899039774126165479,\n // i = 18\n 2552744099402346352193097862110515290335034445517764751557635302899937367219,\n 13706727374402840004346872704605212996406886221231239230397976011930486183550,\n 19786308443934570499119114884492461847023732197118902978413499381102456961966,\n 11767081169862697956461405434786280425108140215784390008330611807075539962898,\n // i = 19\n 1273319740931699377003430019539548781935202579355152343831464213279794249000,\n 20225620070386241931202098463018472034137960205721651875253423327929063224115,\n 13107884970924459680133954992354588464904218518440707039430314610799573960437,\n 10574066469653966216567896842413898230152427846140046825523989742590727910280,\n // i = 20\n 21386271527766270535632132320974945129946865648321206442664310421414128279311,\n 15743262855527118149527268525857865250723531109306484598629175225221686341453,\n 16251140915157602891864152518526119259367827194524273940185283798897653655734,\n 5420158299017134702074915284768041702367316125403978919545323705661634647751,\n // i = 21\n 14555572526833606349832007897859411042036463045080050783981107823326880950231,\n 15234942318869557310939446038663331226792664588406507247341043508129993934298,\n 19560004467494472556570844694553210033340577742756929194362924850760034377042,\n 21851693551359717578445799046408060941161959589978077352548456186528047792150,\n // i = 22\n 19076469206110044175016166349949136119962165667268661130584159239385341119621,\n 19132104531774396501521959463346904008488403861940301898725725957519076019017,\n 6606159937109409334959297158878571243749055026127553188405933692223704734040,\n 13442678592538344046772867528443594004918096722084104155946229264098946917042,\n // i = 23\n 11975757366382164299373991853632416786161357061467425182041988114491638264212,\n 10571372363668414752587603575617060708758897046929321941050113299303675014148,\n 5405426474713644587066466463343175633538103521677501186003868914920014287031,\n 18665277628144856329335676361545218245401014824195451740181902217370165017984\n ];\n\n // solhint-disable-next-line var-name-mixedcase\n uint256[_MDS_SIZE] internal _MDS = [\n 21888242871839275222246405745257275088548364400416034343698204186575808479992,\n 21888242871839275222246405745257275088548364400416034343698204186575806058117,\n 21888242871839275222246405745257275088548364400416034343698204186575491214367,\n 21888242871839275222246405745257275088548364400416034343698204186535831058117,\n 19500,\n 3026375,\n 393529500,\n 49574560750,\n 21888242871839275222246405745257275088548364400416034343698204186575808491587,\n 21888242871839275222246405745257275088548364400416034343698204186575807886437,\n 21888242871839275222246405745257275088548364400416034343698204186575729688812,\n 21888242871839275222246405745257275088548364400416034343698204186565891044437,\n 156,\n 20306,\n 2558556,\n 320327931\n ];\n\n uint256 internal constant _PRIME =\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n\n uint256 internal constant _ALPHA = 5;\n\n uint256 internal constant _ALPHA_INV =\n 17510594297471420177797124596205820070838691520332827474958563349260646796493;\n\n function expMod(\n uint256 base,\n uint256 e,\n uint256 m\n ) public view returns (uint256 o) {\n assembly {\n // define pointer\n let p := mload(0x40)\n // store data assembly-favouring ways\n mstore(p, 0x20) // Length of Base\n mstore(add(p, 0x20), 0x20) // Length of Exponent\n mstore(add(p, 0x40), 0x20) // Length of Modulus\n mstore(add(p, 0x60), base) // Base\n mstore(add(p, 0x80), e) // Exponent\n mstore(add(p, 0xa0), m) // Modulus\n if iszero(staticcall(sub(gas(), 2000), 0x05, p, 0xc0, p, 0x20)) {\n revert(0, 0)\n }\n // data\n o := mload(p)\n }\n }\n\n function _addVectors(uint256[_STATE_SIZE] memory v1, uint256[_STATE_SIZE] memory v2)\n internal\n pure\n returns (uint256[_STATE_SIZE] memory)\n {\n uint256[_STATE_SIZE] memory v;\n\n for (uint256 j = 0; j < _STATE_SIZE; j++) {\n v[j] = addmod(v1[j], v2[j], _PRIME);\n }\n\n return v;\n }\n\n // _MDS is hardcoded\n function _linearOp(uint256[_STATE_SIZE] memory state, uint256[_STATE_SIZE] memory key)\n private\n view\n returns (uint256[_STATE_SIZE] memory)\n {\n uint256[_STATE_SIZE] memory newState = [uint256(0), 0, 0, 0];\n\n // Matrix multiplication\n for (uint256 i = 0; i < _STATE_SIZE; i++) {\n uint256 sum = uint256(0);\n for (uint256 j = 0; j < _STATE_SIZE; j++) {\n sum = addmod(sum, mulmod(_MDS[i * _STATE_SIZE + j], state[j], _PRIME), _PRIME);\n }\n newState[i] = sum;\n }\n\n // Add constant\n newState = _addVectors(newState, key);\n\n return newState;\n }\n\n // Computes the Rescue permutation on some input\n // Recall that the scheduled key is precomputed in our case\n // @param input input for the permutation\n // @return permutation output\n function _perm(uint256[_STATE_SIZE] memory input)\n internal\n view\n returns (uint256[_STATE_SIZE] memory)\n {\n uint256[_STATE_SIZE] memory key0 = [\n _SCHEDULED_KEY[0],\n _SCHEDULED_KEY[1],\n _SCHEDULED_KEY[2],\n _SCHEDULED_KEY[3]\n ];\n\n // S = m + k[0]\n uint256[_STATE_SIZE] memory S = _addVectors(input, key0); // solhint-disable-line var-name-mixedcase\n\n // Main loop\n for (uint256 i = 1; i < 2 * _N_ROUNDS + 1; i++) {\n if ((i - 1) % 2 == 0) {\n S[0] = expMod(S[0], _ALPHA_INV, _PRIME);\n S[1] = expMod(S[1], _ALPHA_INV, _PRIME);\n S[2] = expMod(S[2], _ALPHA_INV, _PRIME);\n S[3] = expMod(S[3], _ALPHA_INV, _PRIME);\n } else {\n S[0] = expMod(S[0], _ALPHA, _PRIME);\n S[1] = expMod(S[1], _ALPHA, _PRIME);\n S[2] = expMod(S[2], _ALPHA, _PRIME);\n S[3] = expMod(S[3], _ALPHA, _PRIME);\n }\n\n uint256[_STATE_SIZE] memory keyI = [\n _SCHEDULED_KEY[i * _STATE_SIZE],\n _SCHEDULED_KEY[i * _STATE_SIZE + 1],\n _SCHEDULED_KEY[i * _STATE_SIZE + 2],\n _SCHEDULED_KEY[i * _STATE_SIZE + 3]\n ];\n S = _linearOp(S, keyI);\n }\n return S;\n }\n\n // Computes the hash of three field elements and returns a single element\n // In our case the rate is 3 and the capacity is 1\n // This hash function the one used in the Records Merkle tree.\n // @param a first element\n // @param b second element\n // @param c third element\n // @return the first element of the Rescue state\n function hash(\n uint256 a,\n uint256 b,\n uint256 c\n ) public view returns (uint256) {\n uint256[_STATE_SIZE] memory input;\n uint256[_STATE_SIZE] memory state;\n\n input[0] = a;\n input[1] = b;\n input[2] = c;\n input[3] = 0;\n\n state = _perm(input);\n\n return state[0];\n }\n\n function commit(uint256[15] memory inputs) public view returns (uint256) {\n uint256 a = inputs[0];\n uint256 b = inputs[1];\n uint256 c = inputs[2];\n uint256 d;\n require(a < _PRIME, \"inputs must be below _PRIME\");\n require(b < _PRIME, \"inputs must be below _PRIME\");\n require(c < _PRIME, \"inputs must be below _PRIME\");\n\n for (uint256 i = 0; i < 5; i++) {\n require(inputs[3 * i + 0] < _PRIME, \"inputs must be below _PRIME\");\n require(inputs[3 * i + 1] < _PRIME, \"inputs must be below _PRIME\");\n require(inputs[3 * i + 2] < _PRIME, \"inputs must be below _PRIME\");\n a += inputs[3 * i + 0];\n b += inputs[3 * i + 1];\n c += inputs[3 * i + 2];\n uint256[4] memory state = [a % _PRIME, b % _PRIME, c % _PRIME, d % _PRIME];\n state = _perm(state);\n (a, b, c, d) = (state[0], state[1], state[2], state[3]);\n }\n\n return a % _PRIME;\n }\n}\n" + }, + "contracts/mocks/TestRescueNonOptimized.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"hardhat/console.sol\";\nimport \"../RescueNonOptimized.sol\";\n\ncontract TestRescueNonOptimized is RescueNonOptimized {\n function doNothing() public {}\n}\n" + }, + "contracts/mocks/TestRescue.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"hardhat/console.sol\";\nimport \"../libraries/RescueLib.sol\";\n\ncontract TestRescue {\n function doNothing() public {}\n\n function hash(\n uint256 a,\n uint256 b,\n uint256 c\n ) public view returns (uint256) {\n return RescueLib.hash(a, b, c);\n }\n\n function commit(uint256[15] memory inputs) public view returns (uint256) {\n return RescueLib.commit(inputs);\n }\n}\n" + }, + "contracts/RecordsMerkleTree.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"./libraries/RescueLib.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract RecordsMerkleTree is Ownable {\n enum Position {\n LEFT,\n MIDDLE,\n RIGHT\n }\n\n // Representation of a (tree) node\n // A node contains a value and pointers (which are index in an array of other nodes).\n // By convention a node that has no (left,middle,right) children will point to index 0.\n struct Node {\n uint256 val;\n uint64 left; // Pointer (index) to the left child\n uint64 middle; // Pointer (index) to the middle child\n uint64 right; // Pointer (index) to the right child\n }\n\n uint256 internal _rootValue;\n uint64 internal _numLeaves;\n uint8 internal _merkleTreeHeight;\n\n mapping(uint256 => uint256) internal _flattenedFrontier;\n\n /// @dev Create a records Merkle tree of the given height.\n /// @param merkleTreeHeight The height\n constructor(uint8 merkleTreeHeight) {\n _rootValue = 0;\n _numLeaves = 0;\n _merkleTreeHeight = merkleTreeHeight;\n }\n\n /// @dev Is the given node a terminal node?\n /// @param node A node\n /// @return _ True if the node is terminal, false otherwise.\n function _isTerminal(Node memory node) private pure returns (bool) {\n return (node.left == 0) && (node.middle == 0) && (node.right == 0);\n }\n\n /// @dev Is the given node null?\n /// @param node A node\n /// @return _ True if the node is NULL, false otherwise\n function _isNull(Node memory node) private pure returns (bool) {\n return (node.val == 0 && _isTerminal(node));\n }\n\n /// @dev Create a new \"hole node\" at the given position in the\n /// tree. A cursor position can be obtained from an extant node or\n /// from a function that returns a position such as _buildTreeFromFrontier.\n /// @param cursor The index of the node in the array of nodes\n /// @param posSibling The position of the sibling i.e. (LEFT, MIDDLE or RIGHT)\n /// @return _ The new created node\n function _createHoleNode(uint64 cursor, Position posSibling)\n private\n pure\n returns (Node memory)\n {\n // Copy pasting these values to save gas\n // indexHoleNode = cursor - 3;\n // indexFirstSibling = cursor - 2;\n // indexSecondSibling = cursor - 1;\n\n if (posSibling == Position.LEFT) {\n return Node(0, cursor - 3, cursor - 2, cursor - 1);\n } else if (posSibling == Position.MIDDLE) {\n return Node(0, cursor - 2, cursor - 3, cursor - 1);\n } else if (posSibling == Position.RIGHT) {\n return Node(0, cursor - 2, cursor - 1, cursor - 3);\n } else {\n revert(\"unreachable\");\n }\n }\n\n /// @dev Create a Merkle tree from the given frontier.\n /// @param nodes The list of nodes to be filled or updated\n /// @return A cursor to the root node of the create tree\n function _buildTreeFromFrontier(Node[] memory nodes) internal view returns (uint64) {\n // Tree is empty\n if (_numLeaves == 0) {\n nodes[0] = Node(0, 0, 0, 0); // Empty node\n nodes[1] = Node(0, 0, 0, 0); // Root node\n return 1;\n }\n\n // Tree is not empty\n\n // Set the first node to the NULL node\n nodes[0] = Node(0, 0, 0, 0);\n\n // Insert the leaf\n nodes[1] = Node(_flattenedFrontier[0], 0, 0, 0);\n\n // Insert the siblings\n nodes[2] = Node(_flattenedFrontier[1], 0, 0, 0);\n nodes[3] = Node(_flattenedFrontier[2], 0, 0, 0);\n\n // Compute the position of each node\n uint64 absolutePosition = _numLeaves - 1;\n uint8 localPosition = uint8(absolutePosition % 3);\n\n // We process the nodes of the Merkle path\n uint64 cursor = 4;\n uint64 cursorFrontier = 3;\n\n // Build the tree expect the root node\n while (cursor < 3 * _merkleTreeHeight + 1) {\n nodes[cursor] = _createHoleNode(cursor, Position(localPosition));\n\n // Create the siblings of the \"hole node\". These siblings have no children\n nodes[cursor + 1] = Node(_flattenedFrontier[cursorFrontier], 0, 0, 0);\n nodes[cursor + 2] = Node(_flattenedFrontier[cursorFrontier + 1], 0, 0, 0);\n\n // Move forward\n absolutePosition /= 3;\n localPosition = uint8(absolutePosition % 3);\n\n cursor += 3;\n cursorFrontier += 2;\n }\n\n // Add the root node\n nodes[cursor] = _createHoleNode(cursor, Position(localPosition));\n return cursor;\n }\n\n /// @dev Compute the index of the next node when going down in the tree.\n /// @param nodes The list of nodes of the tree\n /// @param nodeIndex The index of the starting node\n /// @param pos The position for going down, i.e. LEFT, MIDDLE or RIGHT.\n /// @return The index of the next node\n function _nextNodeIndex(\n Node[] memory nodes,\n uint64 nodeIndex,\n Position pos\n ) private pure returns (uint64) {\n if (pos == Position.LEFT) {\n return nodes[nodeIndex].left;\n } else if (pos == Position.MIDDLE) {\n return nodes[nodeIndex].middle;\n } else if (pos == Position.RIGHT) {\n return nodes[nodeIndex].right;\n } else {\n revert(\"unreachable\");\n }\n }\n\n /// @dev Update the child of a node based on the position (which child to select) and an index to the new child.\n /// @param node node for which we want to update the child\n /// @param newChildIndex index of the new child\n /// @param pos position of the child node relative to the node (i.e. LEFT, MIDDLE or RIGHT)\n function _updateChildNode(\n Node memory node,\n uint64 newChildIndex,\n Position pos\n ) private pure {\n // Update the node\n if (pos == Position.LEFT) {\n node.left = newChildIndex;\n } else if (pos == Position.MIDDLE) {\n node.middle = newChildIndex;\n } else if (pos == Position.RIGHT) {\n node.right = newChildIndex;\n }\n }\n\n function _computeNodePos(uint64 absolutePos, uint64 branchIndex)\n private\n view\n returns (uint64, uint64)\n {\n uint64 localPos;\n uint64 divisor = uint64(3**(_merkleTreeHeight - branchIndex - 1));\n\n localPos = absolutePos / divisor;\n absolutePos = absolutePos % divisor;\n\n return (absolutePos, localPos);\n }\n\n /// @notice Insert an element into the tree in the position num_leaves.\n /// @param nodes The array of nodes\n /// @param rootIndex The index of the root node\n /// @param maxIndex The index of the latest element inserted in the nodes array\n /// @param element The value of the element to insert into the tree\n /// @return updated the value of maxIndex\n function _pushElement(\n Node[] memory nodes,\n uint64 rootIndex,\n uint64 maxIndex,\n uint256 element\n ) private returns (uint64) {\n require(_numLeaves < 3**_merkleTreeHeight, \"The tree is full.\");\n\n // Get the position of the leaf from the smart contract state\n uint64 leafPos = _numLeaves;\n uint64 branchIndex = 0;\n uint64 currentNodeIndex = rootIndex;\n uint64 previousNodeIndex = rootIndex;\n\n // Go down inside the tree until finding the first terminal node.\n uint64 absolutePos = leafPos;\n uint64 localPos = 0;\n while (!_isNull(nodes[currentNodeIndex])) {\n (absolutePos, localPos) = _computeNodePos(absolutePos, branchIndex);\n\n previousNodeIndex = currentNodeIndex;\n currentNodeIndex = _nextNodeIndex(nodes, currentNodeIndex, Position(localPos));\n\n branchIndex += 1;\n }\n\n // maxIndex tracks the index of the last element inserted in the tree\n uint64 newNodeIndex = maxIndex + 1;\n\n // Create new nodes until completing the path one level above the leaf level\n // Always inserting to the left\n\n // To compensate the extra increment at the end of the previous loop ,\n // except if the tree is reduced to a single root node.\n if (branchIndex > 0) {\n branchIndex -= 1;\n }\n\n while (branchIndex < _merkleTreeHeight - 1) {\n nodes[newNodeIndex] = Node(0, 0, 0, 0);\n _updateChildNode(nodes[previousNodeIndex], newNodeIndex, Position(localPos));\n\n // Prepare the next iteration of the loop\n previousNodeIndex = newNodeIndex;\n newNodeIndex += 1;\n branchIndex += 1;\n (absolutePos, localPos) = _computeNodePos(absolutePos, branchIndex);\n }\n\n // The last node contains the leaf value (compute the hash)\n // Remember position is computed with the remainder\n\n // Leaf node where the value is hash(0,_numLeaves,element)\n uint256 val = RescueLib.hash(0, _numLeaves, element);\n nodes[newNodeIndex] = Node(val, 0, 0, 0);\n _updateChildNode(nodes[previousNodeIndex], newNodeIndex, Position(localPos));\n\n // Increment the number of leaves\n //\n // This operation is costly and happens in a loop. However, for now the\n // merkle tree is usually updated with a single new element. In this\n // case we would not save gas by moving the update of _numLeaves. The\n // gas cost is also likely negligible compared to the whole operation of\n // inserting an element.\n //\n // slither-disable-next-line costly-loop\n _numLeaves += 1;\n\n // Return the new value of maxIndex\n return newNodeIndex;\n }\n\n /// @dev Store the frontier.\n /// @param nodes The list of node of the tree\n /// @param rootIndex The index of the root node\n function _storeFrontier(Node[] memory nodes, uint64 rootIndex) private {\n uint64 frontierSize = 2 * _merkleTreeHeight + 1;\n\n /// Collect the values from the root to the leaf but in reverse order\n uint64 currentNodeIndex = rootIndex;\n uint64 firstSiblingIndex = 0;\n uint64 secondSiblingIndex = 0;\n // Go down until the leaf\n for (uint256 i = 0; i < _merkleTreeHeight; i++) {\n // Pick the non-empty node that is most right\n Node memory currentNode = nodes[currentNodeIndex];\n if (!_isNull(nodes[currentNode.right])) {\n // Keep to the right\n currentNodeIndex = currentNode.right;\n firstSiblingIndex = currentNode.left;\n secondSiblingIndex = currentNode.middle;\n } else if (!_isNull(nodes[currentNode.middle])) {\n // Keep to the middle\n currentNodeIndex = currentNode.middle;\n firstSiblingIndex = currentNode.left;\n secondSiblingIndex = currentNode.right;\n } else {\n // Keep to the left\n currentNodeIndex = currentNode.left;\n firstSiblingIndex = currentNode.middle;\n secondSiblingIndex = currentNode.right;\n }\n uint256 secondSiblingPos = frontierSize - 1 - (2 * i);\n uint256 firstSiblingPos = secondSiblingPos - 1;\n _flattenedFrontier[secondSiblingPos] = nodes[secondSiblingIndex].val;\n _flattenedFrontier[firstSiblingPos] = nodes[firstSiblingIndex].val;\n }\n // currentNodeIndex points to the leaf\n _flattenedFrontier[0] = nodes[currentNodeIndex].val;\n }\n\n /// @dev Update the state of the record merkle tree by inserting new elements.\n /// @param elements The list of elements to be appended to the current merkle tree described by the frontier.\n function updateRecordsMerkleTree(uint256[] memory elements) external onlyOwner {\n // The total number of nodes is bounded by 3*height+1 + 3*N*height = 3*(N+1)*height + 1\n // where N is the number of new records\n uint256 numElements = elements.length;\n Node[] memory nodes = new Node[](3 * (numElements + 1) * _merkleTreeHeight + 2);\n\n /// Insert the new elements ///\n\n // maxIndex tracks the index of the last element inserted in the tree\n uint64 rootIndex = _buildTreeFromFrontier(nodes);\n uint64 maxIndex = rootIndex;\n for (uint32 i = 0; i < elements.length; i++) {\n maxIndex = _pushElement(nodes, rootIndex, maxIndex, elements[i]);\n }\n //// Compute the root hash value ////\n _rootValue = _computeRootValueAndUpdateTree(nodes, rootIndex);\n\n //// Store the frontier\n _storeFrontier(nodes, rootIndex);\n }\n\n /// @notice Returns the root value of the Merkle tree.\n function getRootValue() external view returns (uint256) {\n return _rootValue;\n }\n\n /// @notice Returns the height of the Merkle tree.\n function getHeight() external view returns (uint8) {\n return _merkleTreeHeight;\n }\n\n /// @notice Returns the number of leaves of the Merkle tree.\n function getNumLeaves() external view returns (uint64) {\n return _numLeaves;\n }\n\n /// @dev Update the tree by hashing the children of each node.\n /// @param nodes The tree. Note that the nodes are updated by this function.\n /// @param rootNodePos The index of the root node in the list of nodes.\n /// @return The value obtained at the root.\n function _computeRootValueAndUpdateTree(Node[] memory nodes, uint256 rootNodePos)\n private\n returns (uint256)\n {\n // If the root node has no children return its value\n Node memory rootNode = nodes[rootNodePos];\n if (_isTerminal(rootNode)) {\n return rootNode.val;\n } else {\n uint256 valLeft = _computeRootValueAndUpdateTree(nodes, rootNode.left);\n uint256 valMiddle = _computeRootValueAndUpdateTree(nodes, rootNode.middle);\n uint256 valRight = _computeRootValueAndUpdateTree(nodes, rootNode.right);\n\n nodes[rootNode.left].val = valLeft;\n nodes[rootNode.middle].val = valMiddle;\n nodes[rootNode.right].val = valRight;\n\n return RescueLib.hash(valLeft, valMiddle, valRight);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _setOwner(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _setOwner(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _setOwner(newOwner);\n }\n\n function _setOwner(address newOwner) private {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * Requirements:\n *\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n * - the caller must have allowance for ``sender``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n\n uint256 currentAllowance = _allowances[sender][_msgSender()];\n require(currentAllowance >= amount, \"ERC20: transfer amount exceeds allowance\");\n unchecked {\n _approve(sender, _msgSender(), currentAllowance - amount);\n }\n\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[_msgSender()][spender];\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(\n address sender,\n address recipient,\n uint256 amount\n ) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(sender, recipient, amount);\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[sender] = senderBalance - amount;\n }\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n\n _afterTokenTransfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address sender,\n address recipient,\n uint256 amount\n ) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "contracts/MaliciousToken.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {TestCAPE} from \"./mocks/TestCAPE.sol\";\n\n// Learn more about the ERC20 implementation\n// on OpenZeppelin docs: https://docs.openzeppelin.com/contracts/4.x/erc20\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract MaliciousToken is ERC20 {\n address private _targetContractAddress;\n bool private _runDeposit;\n bool private _runSubmitBlock;\n\n /// @notice MaliciousToken contract constructor.\n constructor() ERC20(\"Malicious Token\", \"MAT\") {\n _runDeposit = false;\n _runSubmitBlock = false;\n }\n\n /**\n * /// @dev Sets the address for performing the reentrancy attack.\n */\n function setTargetContractAddress(address targetContractAddress) public {\n _targetContractAddress = targetContractAddress;\n }\n\n /**\n * /// @dev pick the depositErc20 function when calling back the CAPE contract\n */\n function selectDepositAttack() public {\n _runDeposit = true;\n _runSubmitBlock = false;\n }\n\n /**\n * /// @dev pick the submitBlock function when calling back the CAPE contract\n */\n function selectSubmitBlockAttack() public {\n _runDeposit = false;\n _runSubmitBlock = true;\n }\n\n /**\n * /// @notice Malicious implementation of transferFrom\n */\n function transferFrom(\n address,\n address,\n uint256\n ) public virtual override returns (bool) {\n TestCAPE cape = TestCAPE(_targetContractAddress);\n\n if (_runDeposit) {\n TestCAPE.RecordOpening memory dummyRo;\n address dummyAddress;\n cape.depositErc20(dummyRo, dummyAddress);\n }\n\n if (_runSubmitBlock) {\n TestCAPE.CapeBlock memory dummyBlock;\n cape.submitCapeBlock(dummyBlock);\n }\n\n return true;\n }\n}\n" + }, + "contracts/mocks/TestCAPE.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"../CAPE.sol\";\n\ncontract TestCAPE is CAPE {\n constructor(\n uint64 nRoots,\n address verifierAddr,\n address recordsMerkleTreeAddr\n ) CAPE(nRoots, verifierAddr, recordsMerkleTreeAddr) {}\n\n function getNumLeaves() public view returns (uint256) {\n return _recordsMerkleTree.getNumLeaves();\n }\n\n function setInitialRecordCommitments(uint256[] memory elements) public {\n require(_recordsMerkleTree.getRootValue() == 0, \"Merkle tree is nonempty\");\n _recordsMerkleTree.updateRecordsMerkleTree(elements);\n addRoot(_recordsMerkleTree.getRootValue());\n }\n\n function publish(uint256 nullifier) public {\n return _publish(nullifier);\n }\n\n function checkTransfer(TransferNote memory note) public pure {\n return _checkTransfer(note);\n }\n\n function checkBurn(BurnNote memory note) public view {\n return _checkBurn(note);\n }\n\n function containsRoot(uint256 root) public view returns (bool) {\n return _containsRoot(root);\n }\n\n function containsBurnPrefix(bytes memory extraProofBoundData) public pure returns (bool) {\n return _containsBurnPrefix(extraProofBoundData);\n }\n\n function containsBurnRecord(BurnNote memory note) public view returns (bool) {\n return _containsBurnRecord(note);\n }\n\n function deriveRecordCommitment(RecordOpening memory ro) public view returns (uint256) {\n return _deriveRecordCommitment(ro);\n }\n\n function addRoot(uint256 root) public {\n return _addRoot(root);\n }\n\n function setHeight(uint64 newHeight) public {\n blockHeight = newHeight;\n }\n\n function computeNumCommitments(CapeBlock memory newBlock) public pure returns (uint256) {\n return _computeNumCommitments(newBlock);\n }\n\n function checkForeignAssetCode(\n uint256 assetDefinitionCode,\n address erc20Address,\n address sponsor,\n AssetPolicy memory policy\n ) public pure {\n _checkForeignAssetCode(assetDefinitionCode, erc20Address, sponsor, policy);\n }\n\n function checkDomesticAssetCode(uint256 assetDefinitionCode, uint256 internalAssetCode)\n public\n pure\n {\n _checkDomesticAssetCode(assetDefinitionCode, internalAssetCode);\n }\n\n function computeAssetDescription(\n address erc20Address,\n address sponsor,\n AssetPolicy memory policy\n ) public pure returns (bytes memory) {\n return _computeAssetDescription(erc20Address, sponsor, policy);\n }\n\n function pendingDepositsLength() public view returns (uint256) {\n return pendingDeposits.length;\n }\n\n function fillUpPendingDepositsQueue() public {\n for (uint256 i = pendingDeposits.length; i < MAX_NUM_PENDING_DEPOSIT; i++) {\n pendingDeposits.push(100 + i);\n }\n }\n}\n" + }, + "contracts/WrapToken.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\n// Learn more about the ERC20 implementation\n// on OpenZeppelin docs: https://docs.openzeppelin.com/contracts/4.x/erc20\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\n/// @notice This token is only intended to be used for testing.\ncontract WrapToken is ERC20 {\n /// @notice The caller of this method receives 1000*10**6 units.\n constructor(string memory name, string memory symbol) ERC20(name, symbol) {\n _mint(msg.sender, 1000 * 10**6);\n }\n\n /// @notice Allows minting tokens by sending Ether to it.\n receive() external payable {\n _mint(msg.sender, 10**6 * msg.value);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return 6;\n }\n\n function withdraw() external payable {\n uint256 balance = balanceOf(msg.sender);\n address payable sender = payable(msg.sender);\n _burn(sender, balance);\n sender.transfer(balance / 10**6);\n }\n}\n" + }, + "contracts/WethToken.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"./WrapToken.sol\";\n\ncontract WETH is WrapToken {\n constructor() WrapToken(\"Wrapped Ether\", \"WETH\") {}\n}\n" + }, + "contracts/USDC.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"./WrapToken.sol\";\n\ncontract USDC is WrapToken {\n constructor() WrapToken(\"USD Coin\", \"USDC\") {}\n}\n" + }, + "contracts/SimpleToken.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"./WrapToken.sol\";\n\ncontract SimpleToken is WrapToken {\n constructor() WrapToken(\"Simple Token\", \"SIT\") {}\n}\n" + }, + "contracts/DaiToken.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"./WrapToken.sol\";\n\ncontract DAI is WrapToken {\n constructor() WrapToken(\"DAI Token\", \"DAI\") {}\n}\n" + }, + "contracts/mocks/TestRecordsMerkleTree.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"hardhat/console.sol\";\nimport {RecordsMerkleTree as R} from \"../RecordsMerkleTree.sol\";\nimport \"../libraries/RescueLib.sol\";\n\n// This contract is only used in a javascript benchmark and\n// could be removed.\ncontract TestRecordsMerkleTree is R {\n constructor(uint8 height) R(height) {}\n\n function doNothing() public {}\n}\n" + }, + "contracts/mocks/TestBN254.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {BN254 as C} from \"../libraries/BN254.sol\";\n\ncontract TestBN254 {\n constructor() {}\n\n // solhint-disable-next-line func-name-mixedcase\n function P1() public pure returns (C.G1Point memory) {\n return C.P1();\n }\n\n // solhint-disable-next-line func-name-mixedcase\n function P2() public pure returns (C.G2Point memory) {\n return C.P2();\n }\n\n function isInfinity(C.G1Point memory point) public pure returns (bool) {\n return C.isInfinity(point);\n }\n\n function negateG1(C.G1Point memory p) public pure returns (C.G1Point memory r) {\n return C.negate(p);\n }\n\n function negateFr(uint256 fr) public pure returns (uint256 res) {\n return C.negate(fr);\n }\n\n function add(C.G1Point memory p1, C.G1Point memory p2) public view returns (C.G1Point memory) {\n return C.add(p1, p2);\n }\n\n function scalarMul(C.G1Point memory p, uint256 s) public view returns (C.G1Point memory r) {\n return C.scalarMul(p, s);\n }\n\n function invert(uint256 fr) public view returns (uint256 output) {\n return C.invert(fr);\n }\n\n function validateG1Point(C.G1Point memory point) public pure {\n C.validateG1Point(point);\n }\n\n function validateScalarField(uint256 fr) public pure {\n C.validateScalarField(fr);\n }\n\n function pairingProd2(\n C.G1Point memory a1,\n C.G2Point memory a2,\n C.G1Point memory b1,\n C.G2Point memory b2\n ) public view returns (bool) {\n return C.pairingProd2(a1, a2, b1, b2);\n }\n\n function fromLeBytesModOrder(bytes memory leBytes) public pure returns (uint256) {\n return C.fromLeBytesModOrder(leBytes);\n }\n\n function isYNegative(C.G1Point memory p) public pure returns (bool) {\n return C.isYNegative(p);\n }\n\n function powSmall(\n uint256 base,\n uint256 exponent,\n uint256 modulus\n ) public pure returns (uint256) {\n return C.powSmall(base, exponent, modulus);\n }\n\n function testMultiScalarMul(C.G1Point[] memory bases, uint256[] memory scalars)\n public\n view\n returns (C.G1Point memory)\n {\n return C.multiScalarMul(bases, scalars);\n }\n\n function g1Serialize(C.G1Point memory point) public pure returns (bytes memory res) {\n return C.g1Serialize(point);\n }\n\n function g1Deserialize(bytes32 input) public view returns (C.G1Point memory point) {\n return C.g1Deserialize(input);\n }\n\n function quadraticResidue(uint256 x) public view returns (bool isQuadraticResidue, uint256 a) {\n return C.quadraticResidue(x);\n }\n}\n" + }, + "contracts/mocks/TestRootStore.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport \"../RootStore.sol\";\n\ncontract TestRootStore is RootStore {\n constructor(uint64 nRoots) RootStore(nRoots) {}\n\n function addRoot(uint256 lastRoot) public {\n _addRoot(lastRoot);\n }\n\n function containsRoot(uint256 root) public view returns (bool) {\n return _containsRoot(root);\n }\n\n function checkContainsRoot(uint256 root) public view {\n _checkContainsRoot(root);\n }\n}\n" + }, + "contracts/mocks/TestAccumulatingArray.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0-or-later\n//\n// Copyright (c) 2022 Espresso Systems (espressosys.com)\n// This file is part of the Configurable Asset Privacy for Ethereum (CAPE) library.\n//\n// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n// You should have received a copy of the GNU General Public License along with this program. If not, see .\n\npragma solidity ^0.8.0;\n\nimport {AccumulatingArray} from \"../libraries/AccumulatingArray.sol\";\n\ncontract TestAccumulatingArray {\n using AccumulatingArray for AccumulatingArray.Data;\n\n function accumulate(uint256[][] memory arrays, uint256 length)\n public\n pure\n returns (uint256[] memory)\n {\n AccumulatingArray.Data memory accumulated = AccumulatingArray.create(length);\n for (uint256 i = 0; i < arrays.length; i++) {\n accumulated.add(arrays[i]);\n }\n return accumulated.items;\n }\n\n // Adds single element arrays as individual items\n function accumulateWithIndividuals(uint256[][] memory arrays, uint256 length)\n public\n pure\n returns (uint256[] memory)\n {\n AccumulatingArray.Data memory accumulated = AccumulatingArray.create(length);\n for (uint256 i = 0; i < arrays.length; i++) {\n if (arrays[i].length == 1) {\n accumulated.add(arrays[i][0]);\n } else {\n accumulated.add(arrays[i]);\n }\n }\n return accumulated.items;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file