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": {}
}Contract ABI
API[{"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
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.