Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 4,418 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Step | 899429 | 238 days ago | IN | 0 ETH | 0.00001102 | ||||
Rotate | 899429 | 238 days ago | IN | 0 ETH | 0.00002054 | ||||
Step | 899429 | 238 days ago | IN | 0 ETH | 0.00001102 | ||||
Rotate | 899429 | 238 days ago | IN | 0 ETH | 0.00002054 | ||||
Step | 899429 | 238 days ago | IN | 0 ETH | 0.00001102 | ||||
Rotate | 899429 | 238 days ago | IN | 0 ETH | 0.00002054 | ||||
Step | 899429 | 238 days ago | IN | 0 ETH | 0.00001102 | ||||
Rotate | 899428 | 238 days ago | IN | 0 ETH | 0.00001844 | ||||
Rotate | 899428 | 238 days ago | IN | 0 ETH | 0.00001844 | ||||
Rotate | 850068 | 246 days ago | IN | 0 ETH | 0.00082638 | ||||
Rotate | 849998 | 246 days ago | IN | 0 ETH | 0.00077918 | ||||
Rotate | 849935 | 246 days ago | IN | 0 ETH | 0.00077343 | ||||
Rotate | 849871 | 246 days ago | IN | 0 ETH | 0.00081319 | ||||
Rotate | 849770 | 246 days ago | IN | 0 ETH | 0.0008459 | ||||
Rotate | 849716 | 246 days ago | IN | 0 ETH | 0.00075962 | ||||
Rotate | 849655 | 246 days ago | IN | 0 ETH | 0.00088344 | ||||
Rotate | 849593 | 246 days ago | IN | 0 ETH | 0.00080106 | ||||
Rotate | 849531 | 246 days ago | IN | 0 ETH | 0.00079543 | ||||
Rotate | 849469 | 246 days ago | IN | 0 ETH | 0.00084569 | ||||
Rotate | 849404 | 246 days ago | IN | 0 ETH | 0.00083974 | ||||
Rotate | 849347 | 246 days ago | IN | 0 ETH | 0.00080846 | ||||
Rotate | 849286 | 246 days ago | IN | 0 ETH | 0.00080614 | ||||
Rotate | 849230 | 246 days ago | IN | 0 ETH | 0.00075593 | ||||
Rotate | 849161 | 246 days ago | IN | 0 ETH | 0.0008353 | ||||
Rotate | 849100 | 246 days ago | IN | 0 ETH | 0.00076449 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xc90C333F...7070582e1 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Spectre
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// The Licensed Work is (c) 2023 ChainSafe // Code: https://github.com/ChainSafe/Spectre // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import {SyncStepLib} from "./SyncStepLib.sol"; import {RotateLib} from "./RotateLib.sol"; import {SyncStepCompressedVerifier} from "./interfaces/SyncStepVerifier.sol"; import {CommitteeUpdateVerifier} from "./interfaces/CommitteeUpdateVerifier.sol"; contract Spectre { using SyncStepLib for SyncStepLib.SyncStepInput; using RotateLib for RotateLib.RotateInput; uint256 internal immutable SLOTS_PER_PERIOD; /// Maps from a sync period to the poseidon commitment for the sync committee. mapping(uint256 => uint256) public syncCommitteePoseidons; /// Maps from a slot to a beacon block header root. mapping(uint256 => bytes32) public blockHeaderRoots; /// Maps from a slot to the current finalized ethereum1 execution state root. mapping(uint256 => bytes32) public executionPayloadRoots; /// The highest slot that has been verified uint256 public head = 0; SyncStepCompressedVerifier public immutable stepVerifier; CommitteeUpdateVerifier public immutable committeeUpdateVerifier; constructor( address _stepVerifierAddress, address _committeeUpdateVerifierAddress, uint256 _initialSyncPeriod, uint256 _initialSyncCommitteePoseidon, uint256 _slotsPerPeriod ) { stepVerifier = SyncStepCompressedVerifier(_stepVerifierAddress); committeeUpdateVerifier = CommitteeUpdateVerifier( _committeeUpdateVerifierAddress ); syncCommitteePoseidons[ _initialSyncPeriod ] = _initialSyncCommitteePoseidon; SLOTS_PER_PERIOD = _slotsPerPeriod; } /// @notice Verify that a sync committee has attested to a block that finalizes the given header root and execution payload /// @param input The input to the sync step. Defines the slot and attestation to verify /// @param proof The proof for the sync step function step( SyncStepLib.SyncStepInput calldata input, bytes calldata proof ) external { uint256 currentPeriod = getSyncCommitteePeriod(input.attestedSlot); if (syncCommitteePoseidons[currentPeriod] == 0) { revert("Sync committee not yet set for this period"); } uint256[14] memory pubInputs = input.toPublicInputs( syncCommitteePoseidons[currentPeriod] ); bool success = stepVerifier.verify(pubInputs, proof); if (!success) { revert("Proof verification failed"); } // update the contract state executionPayloadRoots[input.finalizedSlot] = input.executionPayloadRoot; blockHeaderRoots[input.finalizedSlot] = input.finalizedHeaderRoot; head = input.finalizedSlot; } /// @notice Use the current sync committee to verify the transition to a new sync committee /// @param rotateInput The input to the sync step. /// @param rotateProof The proof for the rotation /// @param stepInput The input to the sync step. /// @param stepProof The proof for the sync step function rotate( RotateLib.RotateInput calldata rotateInput, bytes calldata rotateProof, SyncStepLib.SyncStepInput calldata stepInput, bytes calldata stepProof ) external { // *step phase* // This allows trusting that the current sync committee has signed off on the finalizedHeaderRoot which is used as the base of the SSZ proof // that checks the new committee is in the beacon state 'next_sync_committee' field. It also allows trusting the finalizedSlot which is // used to calculate the sync period that the new committee belongs to. uint256 attestingPeriod = getSyncCommitteePeriod( stepInput.attestedSlot ); uint256[14] memory stepVeriferInputs = stepInput.toPublicInputs( syncCommitteePoseidons[attestingPeriod] ); bool stepSuccess = stepVerifier.verify(stepVeriferInputs, stepProof); if (!stepSuccess) { revert("Step proof verification failed"); } // *rotation phase* // This proof checks that the given poseidon commitment and SSZ commitment to the sync committee are equivalent and that // that there exists an SSZ proof that can verify this SSZ commitment to the committee is in the state uint256 currentPeriod = getSyncCommitteePeriod(stepInput.finalizedSlot); uint256 nextPeriod = currentPeriod + 1; uint256[77] memory rotateVerifierInputs = rotateInput.toPublicInputs( stepInput.finalizedHeaderRoot ); bool rotateSuccess = committeeUpdateVerifier.verify( rotateVerifierInputs, rotateProof ); if (!rotateSuccess) { revert("Rotation proof verification failed"); } // update the contract state syncCommitteePoseidons[nextPeriod] = rotateInput.syncCommitteePoseidon; } function getSyncCommitteePeriod( uint256 slot ) internal view returns (uint256) { return slot / SLOTS_PER_PERIOD; } }
// The Licensed Work is (c) 2023 ChainSafe // Code: https://github.com/ChainSafe/Spectre // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import { EndianConversions } from "./EndianConversions.sol"; library SyncStepLib { struct SyncStepInput { uint64 attestedSlot; uint64 finalizedSlot; uint64 participation; bytes32 finalizedHeaderRoot; bytes32 executionPayloadRoot; uint256[12] accumulator; } /** * @notice Compute the public input commitment for the sync step given this input. * This must always match the prodecure used in lightclient-circuits/src/sync_step_circuit.rs - SyncStepCircuit::instance() * @param args The arguments for the sync step * @return The public input commitment that can be sent to the verifier contract. */ function toPublicInputs(SyncStepInput memory args, uint256 syncCommitteePoseidon) internal pure returns (uint256[14] memory) { uint256[14] memory inputs; for (uint256 i = 0; i < args.accumulator.length; i++) { inputs[i] = args.accumulator[i]; } bytes32 h = sha256(abi.encodePacked( EndianConversions.toLittleEndian64(args.attestedSlot), EndianConversions.toLittleEndian64(args.finalizedSlot), EndianConversions.toLittleEndian64(args.participation), args.finalizedHeaderRoot, args.executionPayloadRoot )); uint256 commitment = uint256(EndianConversions.toLittleEndian(uint256(h))); inputs[args.accumulator.length] = commitment & ((uint256(1) << 253) - 1); // truncated to 253 bits inputs[args.accumulator.length + 1] = syncCommitteePoseidon; return inputs; } }
// The Licensed Work is (c) 2023 ChainSafe // Code: https://github.com/ChainSafe/Spectre // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import { EndianConversions } from "./EndianConversions.sol"; library RotateLib { struct RotateInput { bytes32 syncCommitteeSSZ; uint256 syncCommitteePoseidon; uint256[12] accumulator; } /** * @notice Compute the public input commitment for the rotation * This must always match the method used in lightclient-circuits/src/committee_udate_circuit.rs - CommitteeUpdateCircuit::instance() * @param args The arguments for the sync step * @return The public input commitment that can be sent to the verifier contract. */ function toPublicInputs(RotateInput memory args, bytes32 finalizedHeaderRoot) internal pure returns (uint256[77] memory) { uint256[77] memory inputs; for (uint256 i = 0; i < args.accumulator.length; i++) { inputs[i] = args.accumulator[i]; } inputs[args.accumulator.length] = args.syncCommitteePoseidon; uint256 syncCommitteeSSZNumeric = uint256(args.syncCommitteeSSZ); for (uint256 i = 0; i < 32; i++) { inputs[args.accumulator.length + 32 - i] = syncCommitteeSSZNumeric % 2 ** 8; syncCommitteeSSZNumeric = syncCommitteeSSZNumeric / 2 ** 8; } uint256 finalizedHeaderRootNumeric = uint256(finalizedHeaderRoot); for (uint256 j = 0; j < 32; j++) { inputs[args.accumulator.length + 64 - j] = finalizedHeaderRootNumeric % 2 ** 8; finalizedHeaderRootNumeric = finalizedHeaderRootNumeric / 2 ** 8; } return inputs; } }
// The Licensed Work is (c) 2023 ChainSafe // Code: https://github.com/ChainSafe/Spectre // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; interface SyncStepVerifier { function verify(uint256[2] calldata input, bytes calldata proof) external returns (bool); } interface SyncStepCompressedVerifier { function verify(uint256[14] calldata pubInputs, bytes calldata proof) external returns (bool); }
// The Licensed Work is (c) 2023 ChainSafe // Code: https://github.com/ChainSafe/Spectre // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; interface CommitteeUpdateVerifier { function verify(uint256[77] calldata pubInputs, bytes calldata proof) external returns (bool); }
// The Licensed Work is (c) 2023 ChainSafe // Code: https://github.com/ChainSafe/Spectre // SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; library EndianConversions { function toLittleEndian64(uint64 v) internal pure returns (bytes8) { v = ((v & 0xFF00FF00FF00FF00) >> 8) | ((v & 0x00FF00FF00FF00FF) << 8); v = ((v & 0xFFFF0000FFFF0000) >> 16) | ((v & 0x0000FFFF0000FFFF) << 16); v = ((v & 0xFFFFFFFF00000000) >> 32) | ((v & 0x00000000FFFFFFFF) << 32); return bytes8(v); } function toLittleEndian(uint256 v) internal pure returns (bytes32) { v = ((v & 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00) >> 8) | ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8); v = ((v & 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000) >> 16) | ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16); v = ((v & 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000) >> 32) | ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32); v = ((v & 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000000000000000) >> 64) | ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64); v = (v >> 128) | (v << 128); return bytes32(v); } }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/" ], "optimizer": { "enabled": true, "runs": 200, "details": { "constantOptimizer": true, "yul": false } }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
[{"inputs":[{"internalType":"address","name":"_stepVerifierAddress","type":"address"},{"internalType":"address","name":"_committeeUpdateVerifierAddress","type":"address"},{"internalType":"uint256","name":"_initialSyncPeriod","type":"uint256"},{"internalType":"uint256","name":"_initialSyncCommitteePoseidon","type":"uint256"},{"internalType":"uint256","name":"_slotsPerPeriod","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blockHeaderRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"committeeUpdateVerifier","outputs":[{"internalType":"contract CommitteeUpdateVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"executionPayloadRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"head","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"syncCommitteeSSZ","type":"bytes32"},{"internalType":"uint256","name":"syncCommitteePoseidon","type":"uint256"},{"internalType":"uint256[12]","name":"accumulator","type":"uint256[12]"}],"internalType":"struct RotateLib.RotateInput","name":"rotateInput","type":"tuple"},{"internalType":"bytes","name":"rotateProof","type":"bytes"},{"components":[{"internalType":"uint64","name":"attestedSlot","type":"uint64"},{"internalType":"uint64","name":"finalizedSlot","type":"uint64"},{"internalType":"uint64","name":"participation","type":"uint64"},{"internalType":"bytes32","name":"finalizedHeaderRoot","type":"bytes32"},{"internalType":"bytes32","name":"executionPayloadRoot","type":"bytes32"},{"internalType":"uint256[12]","name":"accumulator","type":"uint256[12]"}],"internalType":"struct SyncStepLib.SyncStepInput","name":"stepInput","type":"tuple"},{"internalType":"bytes","name":"stepProof","type":"bytes"}],"name":"rotate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"attestedSlot","type":"uint64"},{"internalType":"uint64","name":"finalizedSlot","type":"uint64"},{"internalType":"uint64","name":"participation","type":"uint64"},{"internalType":"bytes32","name":"finalizedHeaderRoot","type":"bytes32"},{"internalType":"bytes32","name":"executionPayloadRoot","type":"bytes32"},{"internalType":"uint256[12]","name":"accumulator","type":"uint256[12]"}],"internalType":"struct SyncStepLib.SyncStepInput","name":"input","type":"tuple"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"step","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stepVerifier","outputs":[{"internalType":"contract SyncStepCompressedVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"syncCommitteePoseidons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063ab845fd31161005b578063ab845fd314610115578063b34711ab1461013c578063c22fc36a1461015c578063c9ac04591461017c57600080fd5b806353c0004d1461008d5780637865b2d5146100c3578063828f504f146100d85780638f7dcfa31461010c575b600080fd5b6100ad61009b366004610a1f565b60016020526000908152604090205481565b6040516100ba9190610a50565b60405180910390f35b6100d66100d1366004610acc565b61018f565b005b6100ff7f000000000000000000000000fa27fe30ff012b80b7844424da0b5872b3e3497e81565b6040516100ba9190610b5a565b6100ad60035481565b6100ff7f000000000000000000000000ea6468b3a91af00909a4f9d9b4f4e73142b8f59c81565b6100ad61014a366004610a1f565b60006020819052908152604090205481565b6100ad61016a366004610a1f565b60026020526000908152604090205481565b6100d661018a366004610b7e565b61035b565b60006101b06101a16020860186610c3f565b67ffffffffffffffff16610566565b600081815260208190526040812054919250036101e85760405162461bcd60e51b81526004016101df90610caa565b60405180910390fd5b6000818152602081905260408120546102109061020a36889003880188610e50565b90610598565b905060007f000000000000000000000000fa27fe30ff012b80b7844424da0b5872b3e3497e6001600160a01b03166369f0433b8387876040518463ffffffff1660e01b815260040161026493929190610ee9565b6020604051808303816000875af1158015610283573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a79190610f28565b9050806102c65760405162461bcd60e51b81526004016101df90610f80565b6080860135600260006102df60408a0160208b01610c3f565b67ffffffffffffffff168152602001908152602001600020819055508560600135600160008860200160208101906103179190610c3f565b67ffffffffffffffff168152602001908152602001600020819055508560200160208101906103469190610c3f565b67ffffffffffffffff16600355505050505050565b600061036d6101a16020860186610c3f565b600081815260208190526040812054919250906103939061020a36889003880188610e50565b905060007f000000000000000000000000fa27fe30ff012b80b7844424da0b5872b3e3497e6001600160a01b03166369f0433b8387876040518463ffffffff1660e01b81526004016103e793929190610ee9565b6020604051808303816000875af1158015610406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042a9190610f28565b9050806104495760405162461bcd60e51b81526004016101df90610fc4565b600061045e6101a16040890160208a01610c3f565b9050600061046d826001610fea565b9050600061048e60608a0135610488368f90038f018f61105c565b9061081d565b905060007f000000000000000000000000ea6468b3a91af00909a4f9d9b4f4e73142b8f59c6001600160a01b031663cacd830e838e8e6040518463ffffffff1660e01b81526004016104e2939291906110aa565b6020604051808303816000875af1158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610f28565b9050806105445760405162461bcd60e51b81526004016101df9061110c565b50506000908152602081815260409091209a0135909955505050505050505050565b60006105927f000000000000000000000000000000000000000000000000000000000000200083611132565b92915050565b6105a06109c6565b6105a86109c6565b60005b600c8110156105f8578460a0015181600c81106105ca576105ca611146565b60200201518282600e81106105e1576105e1611146565b6020020152806105f08161115c565b9150506105ab565b506000600261060a8660000151610962565b6106178760200151610962565b6106248860400151610962565b8860600151896080015160405160200161064295949392919061118c565b60408051601f198184030181529082905261065c9161122b565b602060405180830381855afa158015610679573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061069c9190611249565b905060007bffffffff000000000000000000000000ffffffff00000000000000007eff000000ff000000ff000000ff000000ff000000ff000000ff000000ff0000600884811c9182167fff000000ff000000ff000000ff000000ff000000ff000000ff000000ff0000009186901b91821617601090811c7cff000000ff000000ff000000ff000000ff000000ff000000ff000000ff9093167dff000000ff000000ff000000ff000000ff000000ff000000ff000000ff0090921691909117901b17602081811c9283167fffffffff000000000000000000000000ffffffff0000000000000000000000009290911b91821617604090811c73ffffffff000000000000000000000000ffffffff90931677ffffffff000000000000000000000000ffffffff0000000090921691909117901b17608081811c91901b1790506107e86001600160fd1b61126a565b811661018084015284836107fe600c6001610fea565b600e811061080e5761080e611146565b60200201525090949350505050565b6108256109e5565b61082d6109e5565b60005b600c81101561087d57846040015181600c811061084f5761084f611146565b60200201518282604d811061086657610866611146565b6020020152806108758161115c565b915050610830565b506020840151610180820152835160005b60208110156108f0576108a36101008361127d565b83826108b1600c6020610fea565b6108bb919061126a565b604d81106108cb576108cb611146565b60200201526108dc61010083611132565b9150806108e88161115c565b91505061088e565b508360005b60208110156109575761090a6101008361127d565b8482610918600c6040610fea565b610922919061126a565b604d811061093257610932611146565b602002015261094361010083611132565b91508061094f8161115c565b9150506108f5565b509195945050505050565b66ff000000ff0000600882811c91821667ff000000ff0000009390911b92831617601090811c64ff000000ff90921665ff000000ff009093169290921790911b17602081811c63ffffffff1667ffffffff000000009290911b919091161760c01b90565b604051806101c00160405280600e906020820280368337509192915050565b604051806109a00160405280604d906020820280368337509192915050565b805b8114610a1157600080fd5b50565b803561059281610a04565b600060208284031215610a3457610a34600080fd5b6000610a408484610a14565b949350505050565b805b82525050565b602081016105928284610a48565b60006102208284031215610a7457610a74600080fd5b50919050565b60008083601f840112610a8f57610a8f600080fd5b50813567ffffffffffffffff811115610aaa57610aaa600080fd5b602083019150836001820283011115610ac557610ac5600080fd5b9250929050565b60008060006102408486031215610ae557610ae5600080fd5b6000610af18686610a5e565b93505061022084013567ffffffffffffffff811115610b1257610b12600080fd5b610b1e86828701610a7a565b92509250509250925092565b60006001600160a01b038216610592565b600061059282610b2a565b600061059282610b3b565b610a4a81610b46565b602081016105928284610b51565b60006101c08284031215610a7457610a74600080fd5b6000806000806000806104208789031215610b9b57610b9b600080fd5b6000610ba78989610b68565b9650506101c087013567ffffffffffffffff811115610bc857610bc8600080fd5b610bd489828a01610a7a565b95509550506101e0610be889828a01610a5e565b93505061040087013567ffffffffffffffff811115610c0957610c09600080fd5b610c1589828a01610a7a565b92509250509295509295509295565b67ffffffffffffffff8116610a06565b803561059281610c24565b600060208284031215610c5457610c54600080fd5b6000610a408484610c34565b602a81526000602082017f53796e6320636f6d6d6974746565206e6f74207965742073657420666f7220748152691a1a5cc81c195c9a5bd960b21b602082015291505b5060400190565b6020808252810161059281610c60565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715610cf657610cf6610cba565b6040525050565b6000610d0860405190565b9050610d148282610cd0565b919050565b600067ffffffffffffffff821115610d3357610d33610cba565b5060200290565b6000610d4d610d4884610d19565b610cfd565b90508060208402830185811115610d6657610d66600080fd5b835b81811015610d8a5780610d7b8882610a14565b84525060209283019201610d68565b5050509392505050565b600082601f830112610da857610da8600080fd5b600c610a40848285610d3a565b60006102208284031215610dcb57610dcb600080fd5b610dd560c0610cfd565b90506000610de38484610c34565b8252506020610df484848301610c34565b6020830152506040610e0884828501610c34565b6040830152506060610e1c84828501610a14565b6060830152506080610e3084828501610a14565b60808301525060a0610e4484828501610d94565b60a08301525092915050565b60006102208284031215610e6657610e66600080fd5b6000610a408484610db5565b6000610e7e8383610a48565b505060200190565b600e818060005b83811015610eb2578151610ea18782610e72565b965060208301925050600101610e8d565b505050505050565b82818337506000910152565b8183526000602084019350610edc838584610eba565b5050601f01601f19160190565b6101e08101610ef88286610e86565b8181036101c0830152610f0c818486610ec6565b95945050505050565b801515610a06565b805161059281610f15565b600060208284031215610f3d57610f3d600080fd5b6000610a408484610f1d565b601981526000602082017f50726f6f6620766572696669636174696f6e206661696c656400000000000000815291505b5060200190565b6020808252810161059281610f49565b601e81526000602082017f537465702070726f6f6620766572696669636174696f6e206661696c6564000081529150610f79565b6020808252810161059281610f90565b634e487b7160e01b600052601160045260246000fd5b8082018082111561059257610592610fd4565b60006101c0828403121561101357611013600080fd5b61101d6060610cfd565b9050600061102b8484610a14565b825250602061103c84848301610a14565b602083015250604061105084828501610d94565b60408301525092915050565b60006101c0828403121561107257611072600080fd5b6000610a408484610ffd565b604d818060005b83811015610eb25781516110998782610e72565b965060208301925050600101611085565b6109c081016110b9828661107e565b8181036109a0830152610f0c818486610ec6565b602281526000602082017f526f746174696f6e2070726f6f6620766572696669636174696f6e206661696c815261195960f21b60208201529150610ca3565b60208082528101610592816110cd565b634e487b7160e01b600052601260045260246000fd5b6000826111415761114161111c565b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019820361116f5761116f610fd4565b5060010190565b6001600160c01b03198116610a4a565b80610a4a565b60006111988288611176565b6008820191506111a88287611176565b6008820191506111b88286611176565b6008820191506111c88285611186565b6020820191506111d88284611186565b5060200195945050505050565b60005b838110156112005781810151838201526020016111e8565b50506000910152565b6000611213825190565b6112218185602086016111e5565b9290920192915050565b60006112378284611209565b9392505050565b805161059281610a04565b60006020828403121561125e5761125e600080fd5b6000610a40848461123e565b8181038181111561059257610592610fd4565b60008261128c5761128c61111c565b50069056fea2646970667358221220d358b6d3235b06e3854bd4cfa50f1b957573e1141af605e6907f215c7a54e2bc64736f6c63430008130033
Loading...
Loading
[ Download: CSV Export ]
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.