Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Loading...
Loading
Contract Name:
Verifier
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import { Pairing } from "./Pairing.sol"; import { SnarkConstants } from "./SnarkConstants.sol"; import { SnarkCommon } from "./SnarkCommon.sol"; import { IVerifier } from "../interfaces/IVerifier.sol"; /// @title Verifier /// @notice a Groth16 verifier contract contract Verifier is IVerifier, SnarkConstants, SnarkCommon { struct Proof { Pairing.G1Point a; Pairing.G2Point b; Pairing.G1Point c; } using Pairing for *; uint256 public constant PRIME_Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; /// @notice custom errors error InvalidProofQ(); error InvalidInputVal(); /// @notice Verify a zk-SNARK proof /// @param _proof The proof /// @param vk The verifying key /// @param inputs The public inputs to the circuit /// @return isValid Whether the proof is valid given the verifying key and public /// input. Note that this function only supports one public input. /// Refer to the Semaphore source code for a verifier that supports /// multiple public inputs. function verify( uint256[8] memory _proof, VerifyingKey memory vk, uint256[] calldata inputs ) public view override returns (bool isValid) { Proof memory proof; proof.a = Pairing.G1Point(_proof[0], _proof[1]); proof.b = Pairing.G2Point([_proof[2], _proof[3]], [_proof[4], _proof[5]]); proof.c = Pairing.G1Point(_proof[6], _proof[7]); // Make sure that proof.A, B, and C are each less than the prime q checkPoint(proof.a.x); checkPoint(proof.a.y); checkPoint(proof.b.x[0]); checkPoint(proof.b.y[0]); checkPoint(proof.b.x[1]); checkPoint(proof.b.y[1]); checkPoint(proof.c.x); checkPoint(proof.c.y); // Compute the linear combination vk_x Pairing.G1Point memory vkX = Pairing.G1Point(0, 0); uint256 inputsLength = inputs.length; for (uint256 i = 0; i < inputsLength; ) { uint256 input = inputs[i]; // Make sure that the input is less than the snark scalar field if (input >= SNARK_SCALAR_FIELD) { revert InvalidInputVal(); } vkX = Pairing.plus(vkX, Pairing.scalarMul(vk.ic[i + 1], input)); unchecked { i++; } } vkX = Pairing.plus(vkX, vk.ic[0]); isValid = Pairing.pairing( Pairing.negate(proof.a), proof.b, vk.alpha1, vk.beta2, vkX, vk.gamma2, proof.c, vk.delta2 ); } function checkPoint(uint256 point) internal pure { if (point >= PRIME_Q) { revert InvalidProofQ(); } } }
// SPDX-License-Identifier: MIT // Copyright 2017 Christian Reitwiessner // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // 2019 OKIMS pragma solidity ^0.8.20; /// @title Pairing /// @notice A library implementing the alt_bn128 elliptic curve operations. library Pairing { uint256 public constant PRIME_Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; struct G1Point { uint256 x; uint256 y; } // Encoding of field elements is: X[0] * z + X[1] struct G2Point { uint256[2] x; uint256[2] y; } /// @notice custom errors error PairingAddFailed(); error PairingMulFailed(); error PairingOpcodeFailed(); /// @notice The negation of p, i.e. p.plus(p.negate()) should be zero. function negate(G1Point memory p) internal pure returns (G1Point memory) { // The prime q in the base field F_q for G1 if (p.x == 0 && p.y == 0) { return G1Point(0, 0); } else { return G1Point(p.x, PRIME_Q - (p.y % PRIME_Q)); } } /// @notice r Returns the sum of two points of G1. function plus(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) { uint256[4] memory input; input[0] = p1.x; input[1] = p1.y; input[2] = p2.x; input[3] = p2.y; bool success; // solhint-disable-next-line no-inline-assembly assembly { success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60) // Use "invalid" to make gas estimation work switch success case 0 { invalid() } } if (!success) { revert PairingAddFailed(); } } /// @notice r Return the product of a point on G1 and a scalar, i.e. /// p == p.scalarMul(1) and p.plus(p) == p.scalarMul(2) for all /// points p. function scalarMul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) { uint256[3] memory input; input[0] = p.x; input[1] = p.y; input[2] = s; bool success; // solhint-disable-next-line no-inline-assembly assembly { success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60) // Use "invalid" to make gas estimation work switch success case 0 { invalid() } } if (!success) { revert PairingMulFailed(); } } /// @return isValid The result of computing the pairing check /// e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1 /// For example, /// pairing([P1(), P1().negate()], [P2(), P2()]) should return true. function pairing( G1Point memory a1, G2Point memory a2, G1Point memory b1, G2Point memory b2, G1Point memory c1, G2Point memory c2, G1Point memory d1, G2Point memory d2 ) internal view returns (bool isValid) { G1Point[4] memory p1; p1[0] = a1; p1[1] = b1; p1[2] = c1; p1[3] = d1; G2Point[4] memory p2; p2[0] = a2; p2[1] = b2; p2[2] = c2; p2[3] = d2; uint256 inputSize = 24; uint256[] memory input = new uint256[](inputSize); for (uint8 i = 0; i < 4; ) { uint8 j = i * 6; input[j + 0] = p1[i].x; input[j + 1] = p1[i].y; input[j + 2] = p2[i].x[0]; input[j + 3] = p2[i].x[1]; input[j + 4] = p2[i].y[0]; input[j + 5] = p2[i].y[1]; unchecked { i++; } } uint256[1] memory out; bool success; // solhint-disable-next-line no-inline-assembly assembly { success := staticcall(sub(gas(), 2000), 8, add(input, 0x20), mul(inputSize, 0x20), out, 0x20) // Use "invalid" to make gas estimation work switch success case 0 { invalid() } } if (!success) { revert PairingOpcodeFailed(); } isValid = out[0] != 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import { Pairing } from "./Pairing.sol"; /// @title SnarkCommon /// @notice a Contract which holds a struct /// representing a Groth16 verifying key contract SnarkCommon { /// @notice a struct representing a Groth16 verifying key struct VerifyingKey { Pairing.G1Point alpha1; Pairing.G2Point beta2; Pairing.G2Point gamma2; Pairing.G2Point delta2; Pairing.G1Point[] ic; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /// @title SnarkConstants /// @notice This contract contains constants related to the SNARK /// components of MACI. contract SnarkConstants { /// @notice The scalar field uint256 internal constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617; /// @notice The public key here is the first Pedersen base /// point from iden3's circomlib implementation of the Pedersen hash. /// Since it is generated using a hash-to-curve function, we are /// confident that no-one knows the private key associated with this /// public key. See: /// https://github.com/iden3/circomlib/blob/d5ed1c3ce4ca137a6b3ca48bec4ac12c1b38957a/src/pedersen_printbases.js /// Its hash should equal /// 6769006970205099520508948723718471724660867171122235270773600567925038008762. uint256 internal constant PAD_PUBKEY_X = 10457101036533406547632367118273992217979173478358440826365724437999023779287; uint256 internal constant PAD_PUBKEY_Y = 19824078218392094440610104313265183977899662750282163392862422243483260492317; /// @notice The Keccack256 hash of 'Maci' uint256 internal constant NOTHING_UP_MY_SLEEVE = 8370432830353022751713833565135785980866757267633941821328460903436894336785; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import { SnarkCommon } from "../crypto/SnarkCommon.sol"; /// @title IVerifier /// @notice an interface for a Groth16 verifier contract interface IVerifier { /// @notice Verify a zk-SNARK proof /// @param _proof The proof /// @param vk The verifying key /// @param inputs The public inputs to the circuit /// @return Whether the proof is valid given the verifying key and public /// input. Note that this function only supports one public input. /// Refer to the Semaphore source code for a verifier that supports /// multiple public inputs. function verify( uint256[8] memory _proof, SnarkCommon.VerifyingKey memory vk, uint256[] memory inputs ) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[],"name":"InvalidInputVal","type":"error"},{"inputs":[],"name":"InvalidProofQ","type":"error"},{"inputs":[],"name":"PairingAddFailed","type":"error"},{"inputs":[],"name":"PairingMulFailed","type":"error"},{"inputs":[],"name":"PairingOpcodeFailed","type":"error"},{"inputs":[],"name":"PRIME_Q","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"_proof","type":"uint256[8]"},{"components":[{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"alpha1","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"x","type":"uint256[2]"},{"internalType":"uint256[2]","name":"y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"beta2","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"x","type":"uint256[2]"},{"internalType":"uint256[2]","name":"y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"gamma2","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"x","type":"uint256[2]"},{"internalType":"uint256[2]","name":"y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"delta2","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Pairing.G1Point[]","name":"ic","type":"tuple[]"}],"internalType":"struct SnarkCommon.VerifyingKey","name":"vk","type":"tuple"},{"internalType":"uint256[]","name":"inputs","type":"uint256[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50610d0f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063352a4d151461003b5780638d53290814610063575b600080fd5b61004e610049366004610a89565b610086565b60405190151581526020015b60405180910390f35b610078600080516020610cba83398151915281565b60405190815260200161005a565b600061009061073e565b6040805180820182528751815260208089015181830152908352815160808082018452898401518285019081526060808c015190840152825283518085018552908a0151815260a08a01518184015281830152838201528151808301835260c0890151815260e08901519181019190915290820152805151610111906102be565b805160200151610120906102be565b6020810151516101379060005b60200201516102be565b602080820151015161014a90600061012d565b60208101515161015b90600161012d565b602080820151015161016e90600161012d565b60408101515161017d906102be565b61018e8160400151602001516102be565b6040805180820190915260008082526020820181905284905b818110156102535760008787838181106101c3576101c3610c03565b9050602002013590507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811061020c5760405163076be92360e31b815260040160405180910390fd5b610248846102438b608001518560016102259190610c2f565b8151811061023557610235610c03565b6020026020010151846102ef565b610361565b9350506001016101a7565b5061027c82886080015160008151811061026f5761026f610c03565b6020026020010151610361565b91506102b261028e84600001516103d9565b846020015189600001518a60200151868c6040015189604001518e6060015161046f565b98975050505050505050565b600080516020610cba83398151915281106102ec576040516308f69c9160e01b815260040160405180910390fd5b50565b604080518082019091526000808252602082015261030b61078f565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061033a57fe5b5080610359576040516372ffac5560e11b815260040160405180910390fd5b505092915050565b604080518082019091526000808252602082015261037d6107ad565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa905080806103b757fe5b50806103595760405160016203c15f60e01b0319815260040160405180910390fd5b604080518082019091526000808252602082015281511580156103fe57506020820151155b1561041c575050604080518082019091526000808252602082015290565b604051806040016040528083600001518152602001600080516020610cba833981519152846020015161044f9190610c48565b61046790600080516020610cba833981519152610c6a565b905292915050565b60006104796107cb565b898152602081018890526040810186905260608101849052610499610804565b898152602081018890526040808201879052606082018590528051601880825261032082019092526000908281602001602082028036833701905050905060005b60048160ff1610156106e25760006104f3826006610c7d565b9050858260ff166004811061050a5761050a610c03565b6020020151518361051c836000610ca0565b60ff168151811061052f5761052f610c03565b602002602001018181525050858260ff166004811061055057610550610c03565b602002015160200151838260016105679190610ca0565b60ff168151811061057a5761057a610c03565b602002602001018181525050848260ff166004811061059b5761059b610c03565b60200201515151836105ae836002610ca0565b60ff16815181106105c1576105c1610c03565b602002602001018181525050848260ff16600481106105e2576105e2610c03565b60200201515160016020020151836105fb836003610ca0565b60ff168151811061060e5761060e610c03565b602002602001018181525050848260ff166004811061062f5761062f610c03565b60200201516020015160006002811061064a5761064a610c03565b60200201518361065b836004610ca0565b60ff168151811061066e5761066e610c03565b602002602001018181525050848260ff166004811061068f5761068f610c03565b6020020151602001516001600281106106aa576106aa610c03565b6020020151836106bb836005610ca0565b60ff16815181106106ce576106ce610c03565b6020908102919091010152506001016104da565b506106eb610831565b6000602082602086026020860160086107d05a03fa9050808061070a57fe5b508061072957604051630143d56760e11b815260040160405180910390fd5b505115159d9c50505050505050505050505050565b6040805160a08101909152600060608201818152608083019190915281526020810161076861084f565b815260200161078a604051806040016040528060008152602001600081525090565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180608001604052806004905b60408051808201909152600080825260208201528152602001906001900390816107da5790505090565b60405180608001604052806004905b61081b61084f565b8152602001906001900390816108135790505090565b60405180602001604052806001906020820280368337509192915050565b604051806040016040528061086261086b565b815260200161078a5b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108c2576108c2610889565b60405290565b60405160a0810167ffffffffffffffff811182821017156108c2576108c2610889565b604051601f8201601f1916810167ffffffffffffffff8111828210171561091457610914610889565b604052919050565b600060405161010080820182811067ffffffffffffffff8211171561094357610943610889565b604052909150819083018481111561095a57600080fd5b835b8181101561097457803583526020928301920161095c565b50505092915050565b60006040828403121561098f57600080fd5b61099761089f565b9050813581526020820135602082015292915050565b600082601f8301126109be57600080fd5b6109c661089f565b8060408401858111156109d857600080fd5b845b818110156109f25780358452602093840193016109da565b509095945050505050565b600060808284031215610a0f57600080fd5b610a1761089f565b9050610a2383836109ad565b8152610a3283604084016109ad565b602082015292915050565b60008083601f840112610a4f57600080fd5b50813567ffffffffffffffff811115610a6757600080fd5b6020830191508360208260051b8501011115610a8257600080fd5b9250929050565b600080600080610140808688031215610aa157600080fd5b86601f870112610ab057600080fd5b610aba878761091c565b945061010086013567ffffffffffffffff80821115610ad857600080fd5b908701906101e0828a031215610aed57600080fd5b610af56108c8565b610aff8a8461097d565b81526040610b0f8b8286016109fd565b60208181850152610b238d60c088016109fd565b83850152610b338d8888016109fd565b60608501526101c0860135965084871115610b4d57600080fd5b86860196508c601f880112610b6157600080fd5b8635955084861115610b7557610b75610889565b610b83818760051b016108eb565b86815260069690961b870181019581810192508d871115610ba357600080fd5b968101965b86881015610bc957610bba8e8961097d565b83529683019691810191610ba8565b6080850152509197505050610120880135925080831115610be957600080fd5b5050610bf787828801610a3d565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610c4257610c42610c19565b92915050565b600082610c6557634e487b7160e01b600052601260045260246000fd5b500690565b81810381811115610c4257610c42610c19565b60ff8181168382160290811690818114610c9957610c99610c19565b5092915050565b60ff8181168382160190811115610c4257610c42610c1956fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a264697066735822122095a53bb7331dc696663f0f1b278d854a964e5ad665a835f55a467ae2b1badaf964736f6c63430008140033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063352a4d151461003b5780638d53290814610063575b600080fd5b61004e610049366004610a89565b610086565b60405190151581526020015b60405180910390f35b610078600080516020610cba83398151915281565b60405190815260200161005a565b600061009061073e565b6040805180820182528751815260208089015181830152908352815160808082018452898401518285019081526060808c015190840152825283518085018552908a0151815260a08a01518184015281830152838201528151808301835260c0890151815260e08901519181019190915290820152805151610111906102be565b805160200151610120906102be565b6020810151516101379060005b60200201516102be565b602080820151015161014a90600061012d565b60208101515161015b90600161012d565b602080820151015161016e90600161012d565b60408101515161017d906102be565b61018e8160400151602001516102be565b6040805180820190915260008082526020820181905284905b818110156102535760008787838181106101c3576101c3610c03565b9050602002013590507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811061020c5760405163076be92360e31b815260040160405180910390fd5b610248846102438b608001518560016102259190610c2f565b8151811061023557610235610c03565b6020026020010151846102ef565b610361565b9350506001016101a7565b5061027c82886080015160008151811061026f5761026f610c03565b6020026020010151610361565b91506102b261028e84600001516103d9565b846020015189600001518a60200151868c6040015189604001518e6060015161046f565b98975050505050505050565b600080516020610cba83398151915281106102ec576040516308f69c9160e01b815260040160405180910390fd5b50565b604080518082019091526000808252602082015261030b61078f565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808061033a57fe5b5080610359576040516372ffac5560e11b815260040160405180910390fd5b505092915050565b604080518082019091526000808252602082015261037d6107ad565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa905080806103b757fe5b50806103595760405160016203c15f60e01b0319815260040160405180910390fd5b604080518082019091526000808252602082015281511580156103fe57506020820151155b1561041c575050604080518082019091526000808252602082015290565b604051806040016040528083600001518152602001600080516020610cba833981519152846020015161044f9190610c48565b61046790600080516020610cba833981519152610c6a565b905292915050565b60006104796107cb565b898152602081018890526040810186905260608101849052610499610804565b898152602081018890526040808201879052606082018590528051601880825261032082019092526000908281602001602082028036833701905050905060005b60048160ff1610156106e25760006104f3826006610c7d565b9050858260ff166004811061050a5761050a610c03565b6020020151518361051c836000610ca0565b60ff168151811061052f5761052f610c03565b602002602001018181525050858260ff166004811061055057610550610c03565b602002015160200151838260016105679190610ca0565b60ff168151811061057a5761057a610c03565b602002602001018181525050848260ff166004811061059b5761059b610c03565b60200201515151836105ae836002610ca0565b60ff16815181106105c1576105c1610c03565b602002602001018181525050848260ff16600481106105e2576105e2610c03565b60200201515160016020020151836105fb836003610ca0565b60ff168151811061060e5761060e610c03565b602002602001018181525050848260ff166004811061062f5761062f610c03565b60200201516020015160006002811061064a5761064a610c03565b60200201518361065b836004610ca0565b60ff168151811061066e5761066e610c03565b602002602001018181525050848260ff166004811061068f5761068f610c03565b6020020151602001516001600281106106aa576106aa610c03565b6020020151836106bb836005610ca0565b60ff16815181106106ce576106ce610c03565b6020908102919091010152506001016104da565b506106eb610831565b6000602082602086026020860160086107d05a03fa9050808061070a57fe5b508061072957604051630143d56760e11b815260040160405180910390fd5b505115159d9c50505050505050505050505050565b6040805160a08101909152600060608201818152608083019190915281526020810161076861084f565b815260200161078a604051806040016040528060008152602001600081525090565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180608001604052806004905b60408051808201909152600080825260208201528152602001906001900390816107da5790505090565b60405180608001604052806004905b61081b61084f565b8152602001906001900390816108135790505090565b60405180602001604052806001906020820280368337509192915050565b604051806040016040528061086261086b565b815260200161078a5b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108c2576108c2610889565b60405290565b60405160a0810167ffffffffffffffff811182821017156108c2576108c2610889565b604051601f8201601f1916810167ffffffffffffffff8111828210171561091457610914610889565b604052919050565b600060405161010080820182811067ffffffffffffffff8211171561094357610943610889565b604052909150819083018481111561095a57600080fd5b835b8181101561097457803583526020928301920161095c565b50505092915050565b60006040828403121561098f57600080fd5b61099761089f565b9050813581526020820135602082015292915050565b600082601f8301126109be57600080fd5b6109c661089f565b8060408401858111156109d857600080fd5b845b818110156109f25780358452602093840193016109da565b509095945050505050565b600060808284031215610a0f57600080fd5b610a1761089f565b9050610a2383836109ad565b8152610a3283604084016109ad565b602082015292915050565b60008083601f840112610a4f57600080fd5b50813567ffffffffffffffff811115610a6757600080fd5b6020830191508360208260051b8501011115610a8257600080fd5b9250929050565b600080600080610140808688031215610aa157600080fd5b86601f870112610ab057600080fd5b610aba878761091c565b945061010086013567ffffffffffffffff80821115610ad857600080fd5b908701906101e0828a031215610aed57600080fd5b610af56108c8565b610aff8a8461097d565b81526040610b0f8b8286016109fd565b60208181850152610b238d60c088016109fd565b83850152610b338d8888016109fd565b60608501526101c0860135965084871115610b4d57600080fd5b86860196508c601f880112610b6157600080fd5b8635955084861115610b7557610b75610889565b610b83818760051b016108eb565b86815260069690961b870181019581810192508d871115610ba357600080fd5b968101965b86881015610bc957610bba8e8961097d565b83529683019691810191610ba8565b6080850152509197505050610120880135925080831115610be957600080fd5b5050610bf787828801610a3d565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610c4257610c42610c19565b92915050565b600082610c6557634e487b7160e01b600052601260045260246000fd5b500690565b81810381811115610c4257610c42610c19565b60ff8181168382160290811690818114610c9957610c99610c19565b5092915050565b60ff8181168382160190811115610c4257610c42610c1956fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a264697066735822122095a53bb7331dc696663f0f1b278d854a964e5ad665a835f55a467ae2b1badaf964736f6c63430008140033
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.