Source Code
Overview
CELO Balance
CELO Value
$0.00Multichain Info
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ZKMptValidator
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../interface/IZKMptValidator.sol";
import "./MptVerifier.sol";
contract ZKMptValidator is MptVerifier, IZKMptValidator, Initializable {
struct ParsedInput {
bytes32 receiptHash;
bytes32 logHash;
}
struct ZkProof {
uint256[2] a;
uint256[2][2] b;
uint256[2] c;
uint256[4] inputs;
}
function initialize() public initializer {
}
function validateMPT(bytes calldata _proof) external view returns (Receipt memory receipt){
ZkProof memory proofData;
(proofData.a, proofData.b, proofData.c, proofData.inputs)
= abi.decode(_proof, (uint256[2], uint256[2][2], uint256[2], uint256[4]));
uint256[1] memory compressInput;
compressInput[0] = _hashInput(proofData.inputs);
require(verifyProof(proofData.a, proofData.b, proofData.c, compressInput), "invalid zkProof");
ParsedInput memory parsedInput = _parseInput(proofData.inputs);
receipt = Receipt(parsedInput.receiptHash, parsedInput.logHash);
}
function _parseInput(uint256[4] memory _inputs) internal pure returns (ParsedInput memory){
ParsedInput memory result;
result.receiptHash = bytes32((_inputs[1] << 128) | _inputs[0]);
result.logHash = bytes32((_inputs[3] << 128) | _inputs[2]);
return result;
}
function _hashInput(uint256[4] memory _inputs) internal pure returns (uint256) {
uint256 computedHash = uint256(keccak256(abi.encodePacked(_inputs[0], _inputs[1], _inputs[2], _inputs[3])));
return computedHash / 256;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IZKMptValidator {
struct Receipt {
bytes32 receiptHash;
bytes32 logsHash;
}
function validateMPT(bytes calldata _proof) external view returns (Receipt memory receipt);
}// SPDX-License-Identifier: AML
//
// 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.0;
library Pairing {
uint256 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;
}
/*
* @return 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));
}
}
/*
* @return 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;
// solium-disable-next-line security/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() }
}
require(success,"pairing-add-failed");
}
/*
* @return The product of a point on G1 and a scalar, i.e.
* p == p.scalar_mul(1) and p.plus(p) == p.scalar_mul(2) for all
* points p.
*/
function scalar_mul(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;
// solium-disable-next-line security/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() }
}
require (success,"pairing-mul-failed");
}
/* @return 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) {
G1Point[4] memory p1 = [a1, b1, c1, d1];
G2Point[4] memory p2 = [a2, b2, c2, d2];
uint256 inputSize = 24;
uint256[] memory input = new uint256[](inputSize);
for (uint256 i = 0; i < 4; i++) {
uint256 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];
}
uint256[1] memory out;
bool success;
// solium-disable-next-line security/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() }
}
require(success,"pairing-opcode-failed");
return out[0] != 0;
}
}
contract MptVerifier {
using Pairing for *;
uint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
uint256 constant PRIME_Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
struct VerifyingKey {
Pairing.G1Point alfa1;
Pairing.G2Point beta2;
Pairing.G2Point gamma2;
Pairing.G2Point delta2;
Pairing.G1Point[2] IC;
}
struct Proof {
Pairing.G1Point A;
Pairing.G2Point B;
Pairing.G1Point C;
}
function verifyingKey() internal pure returns (VerifyingKey memory vk) {
vk.alfa1 = Pairing.G1Point(uint256(2678600260555495616753815368476186838356348758339950899331204177355351665650), uint256(18695704648399853341383334171981070401059789537169583891477431355930317254211));
vk.beta2 = Pairing.G2Point([uint256(17364746540401716807360877470835138388995558999455528907210437766233832293718), uint256(7469171900258652344832254712884027722557370604317136014182255160189931794994)], [uint256(15741898557801836118682642964587202955664190708773685177763635276470485465972), uint256(20445230717186921639498379990709868967002310261340856532839671258406432530972)]);
vk.gamma2 = Pairing.G2Point([uint256(3961588080992602039769306720570295296633534912416593215821646499723615525831), uint256(8898038057106326560437272449792325349489422803589192069429023173882039415902)], [uint256(17637200423407438320252224845802153882037412947006266128028865901950806416244), uint256(21496593751705824480232167215361606187950254278483701945917507742960891239288)]);
vk.delta2 = Pairing.G2Point([uint256(5383617415456433463231935077871355546631170540713408408606186815306277751633), uint256(6765937569339433789794058407235622519965792325199446102544440989169116597125)], [uint256(1820612112354795435991732275028094784293302832454312652021763996142652374595), uint256(825466534512603757172784478886114766162841041009036022526085482288633493422)]);
vk.IC[0] = Pairing.G1Point(uint256(8931159439728414380385993045503195868581591348390388165937405742300133373635), uint256(14827189442322873939282305747725974603006812425265098350951140518602403771656));
vk.IC[1] = Pairing.G1Point(uint256(1022789490768641092621404978702621914191368813759376820039897212965167708169), uint256(18360418502139285932008505622254933612154820710174613990059821607771169341721));
}
/*
* @returns Whether the proof is valid given the hardcoded verifying key
* above and the public inputs
*/
function verifyProof(
uint256[2] memory a,
uint256[2][2] memory b,
uint256[2] memory c,
uint256[1] memory input
) public view returns (bool r) {
Proof memory proof;
proof.A = Pairing.G1Point(a[0], a[1]);
proof.B = Pairing.G2Point([b[0][0], b[0][1]], [b[1][0], b[1][1]]);
proof.C = Pairing.G1Point(c[0], c[1]);
VerifyingKey memory vk = verifyingKey();
// Compute the linear combination vk_x
Pairing.G1Point memory vk_x = Pairing.G1Point(0, 0);
// Make sure that proof.A, B, and C are each less than the prime q
require(proof.A.X < PRIME_Q, "verifier-aX-gte-prime-q");
require(proof.A.Y < PRIME_Q, "verifier-aY-gte-prime-q");
require(proof.B.X[0] < PRIME_Q, "verifier-bX0-gte-prime-q");
require(proof.B.Y[0] < PRIME_Q, "verifier-bY0-gte-prime-q");
require(proof.B.X[1] < PRIME_Q, "verifier-bX1-gte-prime-q");
require(proof.B.Y[1] < PRIME_Q, "verifier-bY1-gte-prime-q");
require(proof.C.X < PRIME_Q, "verifier-cX-gte-prime-q");
require(proof.C.Y < PRIME_Q, "verifier-cY-gte-prime-q");
// Make sure that every input is less than the snark scalar field
for (uint256 i = 0; i < input.length; i++) {
require(input[i] < SNARK_SCALAR_FIELD,"verifier-gte-snark-scalar-field");
vk_x = Pairing.plus(vk_x, Pairing.scalar_mul(vk.IC[i + 1], input[i]));
}
vk_x = Pairing.plus(vk_x, vk.IC[0]);
return Pairing.pairing(
Pairing.negate(proof.A),
proof.B,
vk.alfa1,
vk.beta2,
vk_x,
vk.gamma2,
proof.C,
vk.delta2
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}{
"remappings": [
"@ensdomains/=node_modules/@ensdomains/",
"@openzeppelin/=node_modules/@openzeppelin/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_proof","type":"bytes"}],"name":"validateMPT","outputs":[{"components":[{"internalType":"bytes32","name":"receiptHash","type":"bytes32"},{"internalType":"bytes32","name":"logsHash","type":"bytes32"}],"internalType":"struct IZKMptValidator.Receipt","name":"receipt","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"a","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"b","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"c","type":"uint256[2]"},{"internalType":"uint256[1]","name":"input","type":"uint256[1]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"r","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50611594806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630afb22da1461004657806343753b4d146100795780638129fc1c1461009c575b600080fd5b6100596100543660046111b8565b6100a6565b604080518251815260209283015192810192909252015b60405180910390f35b61008c610087366004611308565b6101bb565b6040519015158152602001610070565b6100a46106bb565b005b60408051808201909152600080825260208201526100c2610fde565b6100ce838501856113c0565b60608501526040840152602083015281526100e761101d565b6100f482606001516107c4565b815281516020830151604084015161010e929190846101bb565b6101515760405162461bcd60e51b815260206004820152600f60248201526e34b73b30b634b2103d35a83937b7b360891b60448201526064015b60405180910390fd5b506060908101516040805180820182526000808252602091820181905282518084018452818152808301918252845183860151608090811b909117825284860151959096015190951b90931783528151808301909252925181529051918101919091529392505050565b60006101c561103b565b60408051808201825287518152602080890151818301529083528151608081018352875151818401908152885183015160608301528152825180840184528883018051518252518301518184015281830152838201528151808301835286518152868201519181019190915290820152600061023f610821565b60408051808201909152600080825260208201528351519192509060008051602061153f833981519152116102b65760405162461bcd60e51b815260206004820152601760248201527f76657269666965722d61582d6774652d7072696d652d710000000000000000006044820152606401610148565b82516020015160008051602061153f833981519152116103185760405162461bcd60e51b815260206004820152601760248201527f76657269666965722d61592d6774652d7072696d652d710000000000000000006044820152606401610148565b6020830151515160008051602061153f8339815191521161037b5760405162461bcd60e51b815260206004820152601860248201527f76657269666965722d6258302d6774652d7072696d652d7100000000000000006044820152606401610148565b60208381015101515160008051602061153f833981519152116103e05760405162461bcd60e51b815260206004820152601860248201527f76657269666965722d6259302d6774652d7072696d652d7100000000000000006044820152606401610148565b60208381015151015160008051602061153f833981519152116104455760405162461bcd60e51b815260206004820152601860248201527f76657269666965722d6258312d6774652d7072696d652d7100000000000000006044820152606401610148565b602083810151810151015160008051602061153f833981519152116104ac5760405162461bcd60e51b815260206004820152601860248201527f76657269666965722d6259312d6774652d7072696d652d7100000000000000006044820152606401610148565b60408301515160008051602061153f8339815191521161050e5760405162461bcd60e51b815260206004820152601760248201527f76657269666965722d63582d6774652d7072696d652d710000000000000000006044820152606401610148565b60008051602061153f833981519152836040015160200151106105735760405162461bcd60e51b815260206004820152601760248201527f76657269666965722d63592d6774652d7072696d652d710000000000000000006044820152606401610148565b60005b6001811015610667577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018682600181106105b2576105b2611478565b6020020151106106045760405162461bcd60e51b815260206004820152601f60248201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c64006044820152606401610148565b6106538261064e856080015184600161061d91906114a4565b6002811061062d5761062d611478565b602002015189856001811061064457610644611478565b6020020151610b42565b610bd8565b91508061065f816114bd565b915050610576565b50608082015151610679908290610bd8565b90506106af61068b8460000151610c71565b84602001518460000151856020015185876040015189604001518960600151610d07565b98975050505050505050565b600054610100900460ff16158080156106db5750600054600160ff909116105b806106f55750303b1580156106f5575060005460ff166001145b6107585760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610148565b6000805460ff19166001179055801561077b576000805461ff0019166101001790555b80156107c1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b8051602080830151604080850151606080870151835180870197909752868401949094528501526080808501929092528051808503909201825260a0909301909252815191012060009061081a610100826114ec565b9392505050565b610829611087565b6040805180820182527f05ec08b59dea2069bd9fbdbabf88faa3cccd1c1c738ef9452410db4b79162bf281527f295564d2bb98e1324ef3edc8c8ebfd225ccec46e144b6c90a0b7571cb1856e436020808301919091529083528151608080820184527f26641926ba5524e38fff9b0d0f4faa3cfd9a0e4641513e21fed45df5372405568285019081527f108366c787a1a8ec66fc0e51589bc388bb658e4080b1f095cc9110fe3f8cb232606080850191909152908352845180860186527f22cd994d8a7c5de90933bb3c5d3168d4fbde5393070a8cbce268c9ddae1f3b7481527f2d33972b48bcd4122cbf542e0319a9aeb9248ef9d171bfac8e0c34f8c923e21c818601528385015285840192909252835180820185527f08c22decc3dc1c743cd6cc6744f0870ecf7b461746d8b04bc47690c38291dbc78186019081527f13ac1c6ee79a1e073606f9793811d608486393fa127c9a9e3caba297aabab45e828501528152845180860186527f26fe4d3aea023c982c0a21007ec42713dfd4d34e3dcb795b033f401ba5125b7481527f2f86a411a06642662ea3e692550feb9f181cc637f4a38cf3d8235d42dff49b78818601528185015285850152835180820185527f0be704fc4db805e2d9f5b17611b6a2c79428dce01a4a52e3f86f50b6cf028b518186019081527f0ef5628c793e756e1d0ff155411f0601bba95074f0941433c2176364953d4b85828501528152845180860186527f04066e10739da5bf19c043379acbdedf844fb66955ac897f133fcd2d07443e4381527f01d3328f78526e75854fe6ad38e36cce4f278e1e5c510b5f46624ae065ce37ae818601528185015291850191909152825180840184527f13bedb6b441f8fbb0e0dff36c2a91060c7e0382edc4276d0f651155783f0b6c381527f20c7e44ec4ca929ca6d9a774932bca646cd6e47a4312656386fc8455e1d875088184015290840180519190915282518084019093527f0242e0dab33eab1168b9f9bdcf3af61e7dca2be3f8d5cd21f950f471556e380983527f2897a0ec5f90b391241b11727b406dc8410a9695d4adf0eb79778e42690bc1198383015251015290565b6040805180820190915260008082526020820152610b5e6110d8565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa90508080610b8d57fe5b5080610bd05760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b6044820152606401610148565b505092915050565b6040805180820190915260008082526020820152610bf46110f6565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa90508080610c2e57fe5b5080610bd05760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5859190b59985a5b195960721b6044820152606401610148565b60408051808201909152600080825260208201528151158015610c9657506020820151155b15610cb4575050604080518082019091526000808252602082015290565b60405180604001604052808360000151815260200160008051602061153f8339815191528460200151610ce79190611500565b610cff9060008051602061153f833981519152611514565b905292915050565b60408051608080820183528a825260208083018a90528284018890526060808401879052845192830185528b83528282018a9052828501889052820185905283516018808252610320820190955260009491859190839082016103008036833701905050905060005b6004811015610f5b576000610d86826006611527565b9050858260048110610d9a57610d9a611478565b60200201515183610dac8360006114a4565b81518110610dbc57610dbc611478565b602002602001018181525050858260048110610dda57610dda611478565b60200201516020015183826001610df191906114a4565b81518110610e0157610e01611478565b602002602001018181525050848260048110610e1f57610e1f611478565b6020020151515183610e328360026114a4565b81518110610e4257610e42611478565b602002602001018181525050848260048110610e6057610e60611478565b6020020151516001602002015183610e798360036114a4565b81518110610e8957610e89611478565b602002602001018181525050848260048110610ea757610ea7611478565b602002015160200151600060028110610ec257610ec2611478565b602002015183610ed38360046114a4565b81518110610ee357610ee3611478565b602002602001018181525050848260048110610f0157610f01611478565b602002015160200151600160028110610f1c57610f1c611478565b602002015183610f2d8360056114a4565b81518110610f3d57610f3d611478565b60209081029190910101525080610f53816114bd565b915050610d70565b50610f6461101d565b6000602082602086026020860160086107d05a03fa90508080610f8357fe5b5080610fc95760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b6044820152606401610148565b505115159d9c50505050505050505050505050565b6040518060800160405280610ff1611114565b8152602001610ffe611132565b815260200161100b611114565b81526020016110186110f6565b905290565b60405180602001604052806001906020820280368337509192915050565b6040805160a08101909152600060608201818152608083019190915281526020810161106561115f565b8152602001611018604051806040016040528060008152602001600081525090565b6040805160e08101909152600060a0820181815260c08301919091528152602081016110b161115f565b81526020016110be61115f565b81526020016110cb61115f565b815260200161101861117f565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180604001604052806002905b611149611114565b8152602001906001900390816111415790505090565b6040518060400160405280611172611114565b8152602001611018611114565b60405180604001604052806002905b604080518082019091526000808252602082015281526020019060019003908161118e5790505090565b600080602083850312156111cb57600080fd5b823567ffffffffffffffff808211156111e357600080fd5b818501915085601f8301126111f757600080fd5b81358181111561120657600080fd5b86602082850101111561121857600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156112635761126361122a565b60405290565b600082601f83011261127a57600080fd5b611282611240565b80604084018581111561129457600080fd5b845b818110156112ae578035845260209384019301611296565b509095945050505050565b600082601f8301126112ca57600080fd5b6112d2611240565b8060808401858111156112e457600080fd5b845b818110156112ae576112f88782611269565b84526020909301926040016112e6565b60008060008061012080868803121561132057600080fd5b61132a8787611269565b945061133987604088016112b9565b93506113488760c08801611269565b92508661011f87011261135a57600080fd5b604051602080820182811067ffffffffffffffff8211171561137e5761137e61122a565b60405291870191818984111561139357600080fd5b61010089015b848110156113b05780358252908201908201611399565b5096999598509396509450505050565b6000806000806101808086880312156113d857600080fd5b6113e28787611269565b94506113f187604088016112b9565b93506114008760c08801611269565b92508661011f87011261141257600080fd5b6040516080810181811067ffffffffffffffff821117156114355761143561122a565b60405290860190808883111561144a57600080fd5b61010088015b83811015611468578035825260209182019101611450565b5050809250505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156114b7576114b761148e565b92915050565b6000600182016114cf576114cf61148e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826114fb576114fb6114d6565b500490565b60008261150f5761150f6114d6565b500690565b818103818111156114b7576114b761148e565b80820281158282048414176114b7576114b761148e56fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212207dd7bb178ab91c0249ca1be86c0dc43d47ad119c8028dd00337bbd3bf22c065664736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100415760003560e01c80630afb22da1461004657806343753b4d146100795780638129fc1c1461009c575b600080fd5b6100596100543660046111b8565b6100a6565b604080518251815260209283015192810192909252015b60405180910390f35b61008c610087366004611308565b6101bb565b6040519015158152602001610070565b6100a46106bb565b005b60408051808201909152600080825260208201526100c2610fde565b6100ce838501856113c0565b60608501526040840152602083015281526100e761101d565b6100f482606001516107c4565b815281516020830151604084015161010e929190846101bb565b6101515760405162461bcd60e51b815260206004820152600f60248201526e34b73b30b634b2103d35a83937b7b360891b60448201526064015b60405180910390fd5b506060908101516040805180820182526000808252602091820181905282518084018452818152808301918252845183860151608090811b909117825284860151959096015190951b90931783528151808301909252925181529051918101919091529392505050565b60006101c561103b565b60408051808201825287518152602080890151818301529083528151608081018352875151818401908152885183015160608301528152825180840184528883018051518252518301518184015281830152838201528151808301835286518152868201519181019190915290820152600061023f610821565b60408051808201909152600080825260208201528351519192509060008051602061153f833981519152116102b65760405162461bcd60e51b815260206004820152601760248201527f76657269666965722d61582d6774652d7072696d652d710000000000000000006044820152606401610148565b82516020015160008051602061153f833981519152116103185760405162461bcd60e51b815260206004820152601760248201527f76657269666965722d61592d6774652d7072696d652d710000000000000000006044820152606401610148565b6020830151515160008051602061153f8339815191521161037b5760405162461bcd60e51b815260206004820152601860248201527f76657269666965722d6258302d6774652d7072696d652d7100000000000000006044820152606401610148565b60208381015101515160008051602061153f833981519152116103e05760405162461bcd60e51b815260206004820152601860248201527f76657269666965722d6259302d6774652d7072696d652d7100000000000000006044820152606401610148565b60208381015151015160008051602061153f833981519152116104455760405162461bcd60e51b815260206004820152601860248201527f76657269666965722d6258312d6774652d7072696d652d7100000000000000006044820152606401610148565b602083810151810151015160008051602061153f833981519152116104ac5760405162461bcd60e51b815260206004820152601860248201527f76657269666965722d6259312d6774652d7072696d652d7100000000000000006044820152606401610148565b60408301515160008051602061153f8339815191521161050e5760405162461bcd60e51b815260206004820152601760248201527f76657269666965722d63582d6774652d7072696d652d710000000000000000006044820152606401610148565b60008051602061153f833981519152836040015160200151106105735760405162461bcd60e51b815260206004820152601760248201527f76657269666965722d63592d6774652d7072696d652d710000000000000000006044820152606401610148565b60005b6001811015610667577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018682600181106105b2576105b2611478565b6020020151106106045760405162461bcd60e51b815260206004820152601f60248201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c64006044820152606401610148565b6106538261064e856080015184600161061d91906114a4565b6002811061062d5761062d611478565b602002015189856001811061064457610644611478565b6020020151610b42565b610bd8565b91508061065f816114bd565b915050610576565b50608082015151610679908290610bd8565b90506106af61068b8460000151610c71565b84602001518460000151856020015185876040015189604001518960600151610d07565b98975050505050505050565b600054610100900460ff16158080156106db5750600054600160ff909116105b806106f55750303b1580156106f5575060005460ff166001145b6107585760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610148565b6000805460ff19166001179055801561077b576000805461ff0019166101001790555b80156107c1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b8051602080830151604080850151606080870151835180870197909752868401949094528501526080808501929092528051808503909201825260a0909301909252815191012060009061081a610100826114ec565b9392505050565b610829611087565b6040805180820182527f05ec08b59dea2069bd9fbdbabf88faa3cccd1c1c738ef9452410db4b79162bf281527f295564d2bb98e1324ef3edc8c8ebfd225ccec46e144b6c90a0b7571cb1856e436020808301919091529083528151608080820184527f26641926ba5524e38fff9b0d0f4faa3cfd9a0e4641513e21fed45df5372405568285019081527f108366c787a1a8ec66fc0e51589bc388bb658e4080b1f095cc9110fe3f8cb232606080850191909152908352845180860186527f22cd994d8a7c5de90933bb3c5d3168d4fbde5393070a8cbce268c9ddae1f3b7481527f2d33972b48bcd4122cbf542e0319a9aeb9248ef9d171bfac8e0c34f8c923e21c818601528385015285840192909252835180820185527f08c22decc3dc1c743cd6cc6744f0870ecf7b461746d8b04bc47690c38291dbc78186019081527f13ac1c6ee79a1e073606f9793811d608486393fa127c9a9e3caba297aabab45e828501528152845180860186527f26fe4d3aea023c982c0a21007ec42713dfd4d34e3dcb795b033f401ba5125b7481527f2f86a411a06642662ea3e692550feb9f181cc637f4a38cf3d8235d42dff49b78818601528185015285850152835180820185527f0be704fc4db805e2d9f5b17611b6a2c79428dce01a4a52e3f86f50b6cf028b518186019081527f0ef5628c793e756e1d0ff155411f0601bba95074f0941433c2176364953d4b85828501528152845180860186527f04066e10739da5bf19c043379acbdedf844fb66955ac897f133fcd2d07443e4381527f01d3328f78526e75854fe6ad38e36cce4f278e1e5c510b5f46624ae065ce37ae818601528185015291850191909152825180840184527f13bedb6b441f8fbb0e0dff36c2a91060c7e0382edc4276d0f651155783f0b6c381527f20c7e44ec4ca929ca6d9a774932bca646cd6e47a4312656386fc8455e1d875088184015290840180519190915282518084019093527f0242e0dab33eab1168b9f9bdcf3af61e7dca2be3f8d5cd21f950f471556e380983527f2897a0ec5f90b391241b11727b406dc8410a9695d4adf0eb79778e42690bc1198383015251015290565b6040805180820190915260008082526020820152610b5e6110d8565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa90508080610b8d57fe5b5080610bd05760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b6044820152606401610148565b505092915050565b6040805180820190915260008082526020820152610bf46110f6565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa90508080610c2e57fe5b5080610bd05760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5859190b59985a5b195960721b6044820152606401610148565b60408051808201909152600080825260208201528151158015610c9657506020820151155b15610cb4575050604080518082019091526000808252602082015290565b60405180604001604052808360000151815260200160008051602061153f8339815191528460200151610ce79190611500565b610cff9060008051602061153f833981519152611514565b905292915050565b60408051608080820183528a825260208083018a90528284018890526060808401879052845192830185528b83528282018a9052828501889052820185905283516018808252610320820190955260009491859190839082016103008036833701905050905060005b6004811015610f5b576000610d86826006611527565b9050858260048110610d9a57610d9a611478565b60200201515183610dac8360006114a4565b81518110610dbc57610dbc611478565b602002602001018181525050858260048110610dda57610dda611478565b60200201516020015183826001610df191906114a4565b81518110610e0157610e01611478565b602002602001018181525050848260048110610e1f57610e1f611478565b6020020151515183610e328360026114a4565b81518110610e4257610e42611478565b602002602001018181525050848260048110610e6057610e60611478565b6020020151516001602002015183610e798360036114a4565b81518110610e8957610e89611478565b602002602001018181525050848260048110610ea757610ea7611478565b602002015160200151600060028110610ec257610ec2611478565b602002015183610ed38360046114a4565b81518110610ee357610ee3611478565b602002602001018181525050848260048110610f0157610f01611478565b602002015160200151600160028110610f1c57610f1c611478565b602002015183610f2d8360056114a4565b81518110610f3d57610f3d611478565b60209081029190910101525080610f53816114bd565b915050610d70565b50610f6461101d565b6000602082602086026020860160086107d05a03fa90508080610f8357fe5b5080610fc95760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b6044820152606401610148565b505115159d9c50505050505050505050505050565b6040518060800160405280610ff1611114565b8152602001610ffe611132565b815260200161100b611114565b81526020016110186110f6565b905290565b60405180602001604052806001906020820280368337509192915050565b6040805160a08101909152600060608201818152608083019190915281526020810161106561115f565b8152602001611018604051806040016040528060008152602001600081525090565b6040805160e08101909152600060a0820181815260c08301919091528152602081016110b161115f565b81526020016110be61115f565b81526020016110cb61115f565b815260200161101861117f565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180604001604052806002905b611149611114565b8152602001906001900390816111415790505090565b6040518060400160405280611172611114565b8152602001611018611114565b60405180604001604052806002905b604080518082019091526000808252602082015281526020019060019003908161118e5790505090565b600080602083850312156111cb57600080fd5b823567ffffffffffffffff808211156111e357600080fd5b818501915085601f8301126111f757600080fd5b81358181111561120657600080fd5b86602082850101111561121857600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156112635761126361122a565b60405290565b600082601f83011261127a57600080fd5b611282611240565b80604084018581111561129457600080fd5b845b818110156112ae578035845260209384019301611296565b509095945050505050565b600082601f8301126112ca57600080fd5b6112d2611240565b8060808401858111156112e457600080fd5b845b818110156112ae576112f88782611269565b84526020909301926040016112e6565b60008060008061012080868803121561132057600080fd5b61132a8787611269565b945061133987604088016112b9565b93506113488760c08801611269565b92508661011f87011261135a57600080fd5b604051602080820182811067ffffffffffffffff8211171561137e5761137e61122a565b60405291870191818984111561139357600080fd5b61010089015b848110156113b05780358252908201908201611399565b5096999598509396509450505050565b6000806000806101808086880312156113d857600080fd5b6113e28787611269565b94506113f187604088016112b9565b93506114008760c08801611269565b92508661011f87011261141257600080fd5b6040516080810181811067ffffffffffffffff821117156114355761143561122a565b60405290860190808883111561144a57600080fd5b61010088015b83811015611468578035825260209182019101611450565b5050809250505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156114b7576114b761148e565b92915050565b6000600182016114cf576114cf61148e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826114fb576114fb6114d6565b500490565b60008261150f5761150f6114d6565b500690565b818103818111156114b7576114b761148e565b80820281158282048414176114b7576114b761148e56fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212207dd7bb178ab91c0249ca1be86c0dc43d47ad119c8028dd00337bbd3bf22c065664736f6c63430008120033
Loading...
Loading
Loading...
Loading
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.