Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
HeklaTierProvider
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "../L1/tiers/TierProviderBase.sol"; import "../L1/tiers/ITierRouter.sol"; /// @title HeklaTierProvider /// @custom:security-contact [email protected] contract HeklaTierProvider is TierProviderBase, ITierRouter { address public constant LAB_PROPOSER = 0xD3f681bD6B49887A48cC9C9953720903967E9DC0; /// @inheritdoc ITierRouter function getProvider(uint256) external view returns (address) { return address(this); } /// @inheritdoc ITierProvider function getTierIds() public pure override returns (uint16[] memory tiers_) { tiers_ = new uint16[](6); tiers_[0] = LibTiers.TIER_OPTIMISTIC; tiers_[1] = LibTiers.TIER_SGX; tiers_[2] = LibTiers.TIER_ZKVM_RISC0; tiers_[3] = LibTiers.TIER_GUARDIAN_MINORITY; tiers_[4] = LibTiers.TIER_GUARDIAN; tiers_[5] = LibTiers.TIER_ZKVM_SP1; } /// @inheritdoc ITierProvider function getMinTier(address _proposer, uint256 _rand) public pure override returns (uint16) { if (_proposer == LAB_PROPOSER && _rand % 1000 == 0) { // 0.1% of the total blocks will require ZKVM Risc0 proofs. return LibTiers.TIER_ZKVM_RISC0; } else if (_proposer == LAB_PROPOSER && _rand % 1000 == 1) { // 0.1% of the total blocks will require ZKVM Sp1 proofs. return LibTiers.TIER_ZKVM_SP1; } else if (_rand % 2 == 0) { // 50% of the total blocks will require SGX proofs. return LibTiers.TIER_SGX; } else { return LibTiers.TIER_OPTIMISTIC; } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "../../common/LibStrings.sol"; import "./ITierProvider.sol"; import "./LibTiers.sol"; /// @title TierProviderBase /// @custom:security-contact [email protected] abstract contract TierProviderBase is ITierProvider { /// @dev Grace period for block proving service. /// @notice This constant defines the time window (in minutes) during which the block proving /// service may be paused if gas prices are excessively high. Since block proving is /// asynchronous, this grace period allows provers to defer submissions until gas /// prices become more favorable, potentially reducing transaction costs. uint16 public constant GRACE_PERIOD = 240; // minutes uint96 public constant BOND_UNIT = 75 ether; // TAIKO tokens /// @inheritdoc ITierProvider /// @notice Each tier, except the top tier, has a validity bond that is 75 TAIKO higher than the /// previous tier. Additionally, each tier's contest bond is 6.5625 times its validity bond. function getTier(uint16 _tierId) public pure virtual returns (ITierProvider.Tier memory) { if (_tierId == LibTiers.TIER_OPTIMISTIC) { // cooldownWindow is 1440 minutes and provingWindow is 15 minutes return _buildTier("", BOND_UNIT, 1440, 15); } // TEE Tiers if (_tierId == LibTiers.TIER_SGX) return _buildTeeTier(LibStrings.B_TIER_SGX); if (_tierId == LibTiers.TIER_TDX) return _buildTeeTier(LibStrings.B_TIER_TDX); if (_tierId == LibTiers.TIER_TEE_ANY) return _buildTeeTier(LibStrings.B_TIER_TEE_ANY); // ZKVM Tiers if (_tierId == LibTiers.TIER_ZKVM_RISC0) return _buildZkTier(LibStrings.B_TIER_ZKVM_RISC0); if (_tierId == LibTiers.TIER_ZKVM_SP1) return _buildZkTier(LibStrings.B_TIER_ZKVM_SP1); if (_tierId == LibTiers.TIER_ZKVM_ANY) return _buildZkTier(LibStrings.B_TIER_ZKVM_ANY); // ZKVM+TEE Tier if (_tierId == LibTiers.TIER_ZKVM_AND_TEE) { return _buildTier(LibStrings.B_TIER_ZKVM_AND_TEE, BOND_UNIT * 4, 1440, 180); } // Guardian Minority Tiers if (_tierId == LibTiers.TIER_GUARDIAN_MINORITY) { // cooldownWindow is 240 minutes and provingWindow is 2880 minutes return _buildTier(LibStrings.B_TIER_GUARDIAN_MINORITY, BOND_UNIT * 4, 240, 2880); } // Guardian Major Tiers if (_tierId == LibTiers.TIER_GUARDIAN) { // cooldownWindow is 1440 minutes and provingWindow is 2880 minutes return _buildTier(LibStrings.B_TIER_GUARDIAN, 0, 1440, 2880); } revert TIER_NOT_FOUND(); } /// @dev Builds a TEE tier with a specific verifier name. /// @param _verifierName The name of the verifier. /// @return A Tier struct with predefined parameters for TEE. function _buildTeeTier(bytes32 _verifierName) private pure returns (ITierProvider.Tier memory) { // cooldownWindow is 1440 minutes and provingWindow is 60 minutes return _buildTier(_verifierName, BOND_UNIT * 2, 1440, 60); } /// @dev Builds a ZK tier with a specific verifier name. /// @param _verifierName The name of the verifier. /// @return A Tier struct with predefined parameters for ZK. function _buildZkTier(bytes32 _verifierName) private pure returns (ITierProvider.Tier memory) { // cooldownWindow is 1440 minutes and provingWindow is 180 minutes return _buildTier(_verifierName, BOND_UNIT * 3, 1440, 180); } /// @dev Builds a generic tier with specified parameters. /// @param _verifierName The name of the verifier. /// @param _validityBond The validity bond amount. /// @param _cooldownWindow The cooldown window duration in minutes. /// @param _provingWindow The proving window duration in minutes. /// @return A Tier struct with the provided parameters. function _buildTier( bytes32 _verifierName, uint96 _validityBond, uint16 _cooldownWindow, uint16 _provingWindow ) private pure returns (ITierProvider.Tier memory) { return ITierProvider.Tier({ verifierName: _verifierName, validityBond: _validityBond, contestBond: _validityBond / 10_000 * 65_625, cooldownWindow: _cooldownWindow, provingWindow: GRACE_PERIOD + _provingWindow, maxBlocksToVerifyPerProof: 0 }); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; /// @title ITierRouter /// @notice Defines interface to return an ITierProvider /// @custom:security-contact [email protected] interface ITierRouter { /// @dev Returns the address of the TierProvider for a given block. /// @param blockId ID of the block. /// @return The address of the corresponding TierProvider. function getProvider(uint256 blockId) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; /// @title LibStrings /// @custom:security-contact [email protected] library LibStrings { bytes32 internal constant B_AUTOMATA_DCAP_ATTESTATION = bytes32("automata_dcap_attestation"); bytes32 internal constant B_BLOCK_PROPOSER = bytes32("block_proposer"); bytes32 internal constant B_BRIDGE = bytes32("bridge"); bytes32 internal constant B_BRIDGE_WATCHDOG = bytes32("bridge_watchdog"); bytes32 internal constant B_BRIDGED_ERC1155 = bytes32("bridged_erc1155"); bytes32 internal constant B_BRIDGED_ERC20 = bytes32("bridged_erc20"); bytes32 internal constant B_BRIDGED_ERC721 = bytes32("bridged_erc721"); bytes32 internal constant B_CHAIN_WATCHDOG = bytes32("chain_watchdog"); bytes32 internal constant B_ERC1155_VAULT = bytes32("erc1155_vault"); bytes32 internal constant B_ERC20_VAULT = bytes32("erc20_vault"); bytes32 internal constant B_ERC721_VAULT = bytes32("erc721_vault"); bytes32 internal constant B_PROVER_ASSIGNMENT = bytes32("PROVER_ASSIGNMENT"); bytes32 internal constant B_PROVER_SET = bytes32("prover_set"); bytes32 internal constant B_QUOTA_MANAGER = bytes32("quota_manager"); bytes32 internal constant B_SGX_WATCHDOG = bytes32("sgx_watchdog"); bytes32 internal constant B_SIGNAL_SERVICE = bytes32("signal_service"); bytes32 internal constant B_SP1_REMOTE_VERIFIER = bytes32("sp1_remote_verifier"); bytes32 internal constant B_TAIKO = bytes32("taiko"); bytes32 internal constant B_TAIKO_TOKEN = bytes32("taiko_token"); bytes32 internal constant B_TIER_GUARDIAN = bytes32("tier_guardian"); bytes32 internal constant B_TIER_GUARDIAN_MINORITY = bytes32("tier_guardian_minority"); bytes32 internal constant B_TIER_ROUTER = bytes32("tier_router"); bytes32 internal constant B_TIER_SGX = bytes32("tier_sgx"); bytes32 internal constant B_TIER_TDX = bytes32("tier_tdx"); bytes32 internal constant B_TIER_TEE_ANY = bytes32("tier_tee_any"); bytes32 internal constant B_TIER_ZKVM_RISC0 = bytes32("tier_zkvm_risc0"); bytes32 internal constant B_TIER_ZKVM_SP1 = bytes32("tier_zkvm_sp1"); bytes32 internal constant B_TIER_ZKVM_ANY = bytes32("tier_zkvm_any"); bytes32 internal constant B_TIER_ZKVM_AND_TEE = bytes32("tier_zkvm_and_tee"); bytes32 internal constant B_RISCZERO_GROTH16_VERIFIER = bytes32("risc0_groth16_verifier"); bytes32 internal constant B_WITHDRAWER = bytes32("withdrawer"); bytes32 internal constant H_RETURN_LIVENESS_BOND = keccak256("RETURN_LIVENESS_BOND"); bytes32 internal constant H_SIGNAL_ROOT = keccak256("SIGNAL_ROOT"); bytes32 internal constant H_STATE_ROOT = keccak256("STATE_ROOT"); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; /// @title ITierProvider /// @notice Defines interface to return tier configuration. /// @custom:security-contact [email protected] interface ITierProvider { struct Tier { bytes32 verifierName; uint96 validityBond; uint96 contestBond; uint24 cooldownWindow; // in minutes uint16 provingWindow; // in minutes uint8 maxBlocksToVerifyPerProof; // DEPRECATED } error TIER_NOT_FOUND(); /// @dev Retrieves the configuration for a specified tier. /// @param tierId ID of the tier. /// @return Tier struct containing the tier's parameters. function getTier(uint16 tierId) external view returns (Tier memory); /// @dev Retrieves the IDs of all supported tiers. /// Note that the core protocol requires the number of tiers to be smaller /// than 256. In reality, this number should be much smaller. /// @return The ids of the tiers. function getTierIds() external view returns (uint16[] memory); /// @dev Determines the minimal tier for a block based on a random input. /// @param proposer The address of the block proposer. /// @param rand A pseudo-random number. /// @return The tier id. function getMinTier(address proposer, uint256 rand) external view returns (uint16); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; /// @title LibTiers /// @dev Tier ID cannot be zero and must be unique. /// @custom:security-contact [email protected] library LibTiers { /// @notice Optimistic tier ID. uint16 public constant TIER_OPTIMISTIC = 100; /// @notice TEE tiers /// Although these tiers have diffeerent IDs, at most one should be selected in a verifier. uint16 public constant TIER_SGX = 200; uint16 public constant TIER_TDX = 201; uint16 public constant TIER_TEE_ANY = 202; /// @notice ZK Tiers. /// Although these tiers have diffeerent IDs, at most one should be selected in a verifier. uint16 public constant TIER_ZKVM_RISC0 = 250; uint16 public constant TIER_ZKVM_SP1 = 251; uint16 public constant TIER_ZKVM_ANY = 252; /// @notice Any ZKVM+TEE proof uint16 public constant TIER_ZKVM_AND_TEE = 300; /// @notice Guardian tier ID with minority approval. uint16 public constant TIER_GUARDIAN_MINORITY = 900; /// @notice Guardian tier ID with majority approval. uint16 public constant TIER_GUARDIAN = 1000; }
{ "remappings": [ "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", "openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", "openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", "@risc0/contracts/=node_modules/risc0-ethereum/contracts/src/", "@solady/=node_modules/solady/", "@optimism/=node_modules/optimism/", "@sp1-contracts/=node_modules/sp1-contracts/contracts/", "forge-std/=node_modules/forge-std/", "ds-test/=node_modules/ds-test/src/", "@p256-verifier/contracts/=node_modules/p256-verifier/src/", "optimism/=node_modules/optimism/", "p256-verifier/=node_modules/p256-verifier/", "risc0-ethereum/=node_modules/risc0-ethereum/", "solady/=node_modules/solady/", "sp1-contracts/=node_modules/sp1-contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
[{"inputs":[],"name":"TIER_NOT_FOUND","type":"error"},{"inputs":[],"name":"BOND_UNIT","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAB_PROPOSER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_proposer","type":"address"},{"internalType":"uint256","name":"_rand","type":"uint256"}],"name":"getMinTier","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tierId","type":"uint16"}],"name":"getTier","outputs":[{"components":[{"internalType":"bytes32","name":"verifierName","type":"bytes32"},{"internalType":"uint96","name":"validityBond","type":"uint96"},{"internalType":"uint96","name":"contestBond","type":"uint96"},{"internalType":"uint24","name":"cooldownWindow","type":"uint24"},{"internalType":"uint16","name":"provingWindow","type":"uint16"},{"internalType":"uint8","name":"maxBlocksToVerifyPerProof","type":"uint8"}],"internalType":"struct ITierProvider.Tier","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getTierIds","outputs":[{"internalType":"uint16[]","name":"tiers_","type":"uint16[]"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b506108058061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80638165fd26116100585780638165fd261461014d578063b5fdb86b14610175578063c1a287e214610190578063d8cde1c614610198575f80fd5b806352c5c56b1461007e578063576c3de7146100a95780635c42d07914610122575b5f80fd5b61009161008c366004610653565b6101ad565b60405161ffff90911681526020015b60405180910390f35b6100bc6100b7366004610688565b610257565b6040516100a091905f60c0820190508251825260208301516001600160601b038082166020850152806040860151166040850152505062ffffff606084015116606083015261ffff608084015116608083015260ff60a08401511660a083015292915050565b6101356101303660046106b0565b503090565b6040516001600160a01b0390911681526020016100a0565b61015d680410d586a20a4c000081565b6040516001600160601b0390911681526020016100a0565b61013573d3f681bd6b49887a48cc9c9953720903967e9dc081565b61009160f081565b6101a0610433565b6040516100a091906106c7565b5f6001600160a01b03831673d3f681bd6b49887a48cc9c9953720903967e9dc01480156101e357506101e16103e883610722565b155b156101f0575060fa610251565b6001600160a01b03831673d3f681bd6b49887a48cc9c9953720903967e9dc014801561022757506102236103e883610722565b6001145b15610234575060fb610251565b61023f600283610722565b5f0361024d575060c8610251565b5060645b92915050565b61025f61061f565b60631961ffff831601610284576102515f680410d586a20a4c00006105a0600f61055c565b60c71961ffff8316016102a557610251670e8d2cae4bee6cef60c31b6105d5565b60c81961ffff8316016102c657610251670e8d2cae4bee8c8f60c31b6105d5565b60c91961ffff8316016102eb576102516b746965725f7465655f616e7960a01b6105d5565b60f91961ffff831601610313576102516e0746965725f7a6b766d5f726973633608c1b6105ff565b60fa1961ffff831601610339576102516c746965725f7a6b766d5f73703160981b6105ff565b60fb1961ffff83160161035f576102516c746965725f7a6b766d5f616e7960981b6105ff565b61012b1961ffff8316016103a35761025170746965725f7a6b766d5f616e645f74656560781b610399680410d586a20a4c00006004610749565b6105a060b461055c565b6103831961ffff8316016103ec5761025175746965725f677561726469616e5f6d696e6f7269747960501b6103e2680410d586a20a4c00006004610749565b60f0610b4061055c565b6103e71961ffff83160161041a576102516c3a34b2b92fb3bab0b93234b0b760991b5f6105a0610b4061055c565b6040516334130f6160e21b815260040160405180910390fd5b60408051600680825260e082019092526060916020820160c0803683370190505090506064815f8151811061046a5761046a610774565b602002602001019061ffff16908161ffff168152505060c88160018151811061049557610495610774565b602002602001019061ffff16908161ffff168152505060fa816002815181106104c0576104c0610774565b602002602001019061ffff16908161ffff1681525050610384816003815181106104ec576104ec610774565b602002602001019061ffff16908161ffff16815250506103e88160048151811061051857610518610774565b602002602001019061ffff16908161ffff168152505060fb8160058151811061054357610543610774565b602002602001019061ffff16908161ffff168152505090565b61056461061f565b6040805160c0810182528681526001600160601b038616602082015290810161058f61271087610788565b61059c9062010059610749565b6001600160601b0316815261ffff851660208201526040016105bf8460f06107ad565b61ffff1681525f60209091015295945050505050565b6105dd61061f565b610251826105f5680410d586a20a4c00006002610749565b6105a0603c61055c565b61060761061f565b61025182610399680410d586a20a4c00006003610749565b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a081019190915290565b5f8060408385031215610664575f80fd5b82356001600160a01b038116811461067a575f80fd5b946020939093013593505050565b5f60208284031215610698575f80fd5b813561ffff811681146106a9575f80fd5b9392505050565b5f602082840312156106c0575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561070257835161ffff16835292840192918401916001016106e2565b50909695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826107305761073061070e565b500690565b634e487b7160e01b5f52601160045260245ffd5b6001600160601b0381811683821602808216919082811461076c5761076c610735565b505092915050565b634e487b7160e01b5f52603260045260245ffd5b5f6001600160601b03808416806107a1576107a161070e565b92169190910492915050565b61ffff8181168382160190808211156107c8576107c8610735565b509291505056fea26469706673582212204d85cc4aa2aa7b8b0e0784568fa6c3a9ed0ac202cd206fbd17a0a57a312705f664736f6c63430008180033
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c80638165fd26116100585780638165fd261461014d578063b5fdb86b14610175578063c1a287e214610190578063d8cde1c614610198575f80fd5b806352c5c56b1461007e578063576c3de7146100a95780635c42d07914610122575b5f80fd5b61009161008c366004610653565b6101ad565b60405161ffff90911681526020015b60405180910390f35b6100bc6100b7366004610688565b610257565b6040516100a091905f60c0820190508251825260208301516001600160601b038082166020850152806040860151166040850152505062ffffff606084015116606083015261ffff608084015116608083015260ff60a08401511660a083015292915050565b6101356101303660046106b0565b503090565b6040516001600160a01b0390911681526020016100a0565b61015d680410d586a20a4c000081565b6040516001600160601b0390911681526020016100a0565b61013573d3f681bd6b49887a48cc9c9953720903967e9dc081565b61009160f081565b6101a0610433565b6040516100a091906106c7565b5f6001600160a01b03831673d3f681bd6b49887a48cc9c9953720903967e9dc01480156101e357506101e16103e883610722565b155b156101f0575060fa610251565b6001600160a01b03831673d3f681bd6b49887a48cc9c9953720903967e9dc014801561022757506102236103e883610722565b6001145b15610234575060fb610251565b61023f600283610722565b5f0361024d575060c8610251565b5060645b92915050565b61025f61061f565b60631961ffff831601610284576102515f680410d586a20a4c00006105a0600f61055c565b60c71961ffff8316016102a557610251670e8d2cae4bee6cef60c31b6105d5565b60c81961ffff8316016102c657610251670e8d2cae4bee8c8f60c31b6105d5565b60c91961ffff8316016102eb576102516b746965725f7465655f616e7960a01b6105d5565b60f91961ffff831601610313576102516e0746965725f7a6b766d5f726973633608c1b6105ff565b60fa1961ffff831601610339576102516c746965725f7a6b766d5f73703160981b6105ff565b60fb1961ffff83160161035f576102516c746965725f7a6b766d5f616e7960981b6105ff565b61012b1961ffff8316016103a35761025170746965725f7a6b766d5f616e645f74656560781b610399680410d586a20a4c00006004610749565b6105a060b461055c565b6103831961ffff8316016103ec5761025175746965725f677561726469616e5f6d696e6f7269747960501b6103e2680410d586a20a4c00006004610749565b60f0610b4061055c565b6103e71961ffff83160161041a576102516c3a34b2b92fb3bab0b93234b0b760991b5f6105a0610b4061055c565b6040516334130f6160e21b815260040160405180910390fd5b60408051600680825260e082019092526060916020820160c0803683370190505090506064815f8151811061046a5761046a610774565b602002602001019061ffff16908161ffff168152505060c88160018151811061049557610495610774565b602002602001019061ffff16908161ffff168152505060fa816002815181106104c0576104c0610774565b602002602001019061ffff16908161ffff1681525050610384816003815181106104ec576104ec610774565b602002602001019061ffff16908161ffff16815250506103e88160048151811061051857610518610774565b602002602001019061ffff16908161ffff168152505060fb8160058151811061054357610543610774565b602002602001019061ffff16908161ffff168152505090565b61056461061f565b6040805160c0810182528681526001600160601b038616602082015290810161058f61271087610788565b61059c9062010059610749565b6001600160601b0316815261ffff851660208201526040016105bf8460f06107ad565b61ffff1681525f60209091015295945050505050565b6105dd61061f565b610251826105f5680410d586a20a4c00006002610749565b6105a0603c61055c565b61060761061f565b61025182610399680410d586a20a4c00006003610749565b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a081019190915290565b5f8060408385031215610664575f80fd5b82356001600160a01b038116811461067a575f80fd5b946020939093013593505050565b5f60208284031215610698575f80fd5b813561ffff811681146106a9575f80fd5b9392505050565b5f602082840312156106c0575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b8181101561070257835161ffff16835292840192918401916001016106e2565b50909695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826107305761073061070e565b500690565b634e487b7160e01b5f52601160045260245ffd5b6001600160601b0381811683821602808216919082811461076c5761076c610735565b505092915050565b634e487b7160e01b5f52603260045260245ffd5b5f6001600160601b03808416806107a1576107a161070e565b92169190910492915050565b61ffff8181168382160190808211156107c8576107c8610735565b509291505056fea26469706673582212204d85cc4aa2aa7b8b0e0784568fa6c3a9ed0ac202cd206fbd17a0a57a312705f664736f6c63430008180033
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.