Source Code
Latest 25 from a total of 110 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Register Gradien... | 40439531 | 17 days ago | IN | 0 ETH | 0.00000058 | ||||
| Register Gradien... | 40434131 | 17 days ago | IN | 0 ETH | 0.00000084 | ||||
| Register Gradien... | 40396331 | 18 days ago | IN | 0 ETH | 0.00000097 | ||||
| Register Gradien... | 40390931 | 18 days ago | IN | 0 ETH | 0.00000062 | ||||
| Register Gradien... | 40353130 | 19 days ago | IN | 0 ETH | 0.00000044 | ||||
| Register Gradien... | 40347733 | 19 days ago | IN | 0 ETH | 0.00000048 | ||||
| Register Gradien... | 40309931 | 20 days ago | IN | 0 ETH | 0.0000004 | ||||
| Register Gradien... | 40304532 | 20 days ago | IN | 0 ETH | 0.00000045 | ||||
| Register Gradien... | 40266731 | 21 days ago | IN | 0 ETH | 0.00000027 | ||||
| Register Gradien... | 40261332 | 21 days ago | IN | 0 ETH | 0.00000035 | ||||
| Register Gradien... | 40261330 | 21 days ago | IN | 0 ETH | 0.00000035 | ||||
| Register Gradien... | 40223531 | 22 days ago | IN | 0 ETH | 0.00000034 | ||||
| Register Gradien... | 40218133 | 22 days ago | IN | 0 ETH | 0.00000023 | ||||
| Register Gradien... | 40218132 | 22 days ago | IN | 0 ETH | 0.00000023 | ||||
| Register Gradien... | 40180330 | 23 days ago | IN | 0 ETH | 0.00000042 | ||||
| Register Gradien... | 40174932 | 23 days ago | IN | 0 ETH | 0.00000023 | ||||
| Register Gradien... | 40137130 | 24 days ago | IN | 0 ETH | 0.00000023 | ||||
| Register Gradien... | 40131731 | 24 days ago | IN | 0 ETH | 0.00000024 | ||||
| Register Gradien... | 40093930 | 25 days ago | IN | 0 ETH | 0.00000026 | ||||
| Register Gradien... | 40088531 | 25 days ago | IN | 0 ETH | 0.00000023 | ||||
| Register Gradien... | 40050731 | 26 days ago | IN | 0 ETH | 0.00000023 | ||||
| Register Gradien... | 40045334 | 26 days ago | IN | 0 ETH | 0.0000003 | ||||
| Register Gradien... | 40045332 | 26 days ago | IN | 0 ETH | 0.0000003 | ||||
| Register Gradien... | 40007532 | 27 days ago | IN | 0 ETH | 0.00000024 | ||||
| Register Gradien... | 40007530 | 27 days ago | IN | 0 ETH | 0.00000024 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
VoidlyGradientRegistry
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title VoidlyGradientRegistry
* @notice Append-only registry for federated-learning gradient attestations (IPFS CIDs).
* @dev Optimized for L2 (e.g., Base). Event model is indexer-friendly and on-chain reads are paginatable.
*/
contract VoidlyGradientRegistry {
// -------------------------------------------------------------------------
// Errors
// -------------------------------------------------------------------------
error NodeIdRequired();
error IpfsHashRequired();
error AttestationHashRequired();
error NoAttestationsFound();
error NotAuthorized();
error IndexOutOfBounds();
error InvalidNewOwner();
error CountZero();
error UnknownNode();
// -------------------------------------------------------------------------
// Types
// -------------------------------------------------------------------------
struct Attestation {
// NOTE: Two dynamic fields first; fixed fields (uint64,address) follow and pack together in one slot.
string ipfsHash; // CID for gradient data (e.g., "Qm..."/CIDv0 or "bafy..."/CIDv1)
string attestationHash; // CID for Ed25519 signature payload
uint64 timestamp; // Block timestamp (gas-lean vs uint256)
address nodeOperator; // submitter (msg.sender)
}
struct ZKProof {
bytes32 merkleRoot; // Merkle root of session commitments
uint256 sessionCount; // Claimed sessions served
uint64 timeRangeStart; // Proof period start
uint64 timeRangeEnd; // Proof period end
uint64 timestamp; // When proof was submitted
address nodeOperator; // Who submitted
}
// -------------------------------------------------------------------------
// Storage
// -------------------------------------------------------------------------
uint256 public constant VERSION = 1;
address public owner;
address public pendingOwner;
// nodeKey = keccak256(nodeId); using bytes32 key is cheaper than string mapping
mapping(bytes32 => Attestation[]) private _attestations;
mapping(bytes32 => ZKProof[]) private _zkProofs;
mapping(bytes32 => bool) private _seenNode;
uint256 public totalAttestations; // global counter
uint256 public totalZKProofs; // ZK proofs submitted
uint256 public nodeCount; // count of unique nodeIds observed
// -------------------------------------------------------------------------
// Events
// -------------------------------------------------------------------------
/**
* @dev NOTE: `nodeId` is NON-indexed so its literal value is visible in logs.
* We index `nodeKey` (keccak) for cheap filtering + `operator` for actor filtering.
*/
event GradientRegistered(
bytes32 indexed nodeKey,
address indexed operator,
string nodeId,
string ipfsHash,
string attestationHash,
uint64 timestamp
);
event NodeRegistered(
bytes32 indexed nodeKey,
address indexed firstOperator,
string nodeId
);
event NodeSlashed(
bytes32 indexed nodeKey,
address indexed operator,
string nodeId,
string reason
);
event ZKProofSubmitted(
bytes32 indexed nodeKey,
address indexed operator,
string nodeId,
bytes32 merkleRoot,
uint256 sessionCount,
uint64 timestamp
);
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
// -------------------------------------------------------------------------
// Constructor / ownership
// -------------------------------------------------------------------------
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
if (msg.sender != owner) revert NotAuthorized();
_;
}
/// @notice Start two-step ownership transfer (safer for multisigs / ops).
function transferOwnership(address newOwner) external onlyOwner {
if (newOwner == address(0)) revert InvalidNewOwner();
pendingOwner = newOwner;
emit OwnershipTransferStarted(owner, newOwner);
}
/// @notice Accept ownership after `transferOwnership`.
function acceptOwnership() external {
if (msg.sender != pendingOwner) revert NotAuthorized();
address prev = owner;
owner = msg.sender;
pendingOwner = address(0);
emit OwnershipTransferred(prev, owner);
}
// -------------------------------------------------------------------------
// Core
// -------------------------------------------------------------------------
/**
* @notice Register a gradient attestation.
* @dev Permissionless by design; the protocol layer should decide which CIDs/IDs to trust.
*/
function registerGradient(
string calldata nodeId,
string calldata ipfsHash,
string calldata attestationHash
) external {
if (bytes(nodeId).length == 0) revert NodeIdRequired();
if (bytes(ipfsHash).length == 0) revert IpfsHashRequired();
if (bytes(attestationHash).length == 0) revert AttestationHashRequired();
bytes32 nodeKey = _nodeKey(nodeId);
if (!_seenNode[nodeKey]) {
_seenNode[nodeKey] = true;
unchecked { nodeCount += 1; }
emit NodeRegistered(nodeKey, msg.sender, nodeId);
}
uint64 t = uint64(block.timestamp);
Attestation storage a = _attestations[nodeKey].push();
a.ipfsHash = ipfsHash;
a.attestationHash = attestationHash;
a.timestamp = t;
a.nodeOperator = msg.sender;
unchecked { totalAttestations += 1; }
emit GradientRegistered(
nodeKey,
msg.sender,
nodeId,
ipfsHash,
attestationHash,
t
);
}
/**
* @notice Submit zero-knowledge proof of privacy compliance
* @dev Proves "served N sessions, logged 0 destinations" without revealing session data
*/
function submitZKProof(
string calldata nodeId,
bytes32 merkleRoot,
uint256 sessionCount,
uint64 timeRangeStart,
uint64 timeRangeEnd
) external {
if (bytes(nodeId).length == 0) revert NodeIdRequired();
if (sessionCount == 0) revert CountZero();
if (timeRangeEnd <= timeRangeStart) revert InvalidNewOwner(); // reusing error
bytes32 nodeKey = _nodeKey(nodeId);
if (!_seenNode[nodeKey]) {
_seenNode[nodeKey] = true;
unchecked { nodeCount += 1; }
emit NodeRegistered(nodeKey, msg.sender, nodeId);
}
uint64 t = uint64(block.timestamp);
ZKProof storage proof = _zkProofs[nodeKey].push();
proof.merkleRoot = merkleRoot;
proof.sessionCount = sessionCount;
proof.timeRangeStart = timeRangeStart;
proof.timeRangeEnd = timeRangeEnd;
proof.timestamp = t;
proof.nodeOperator = msg.sender;
unchecked { totalZKProofs += 1; }
emit ZKProofSubmitted(
nodeKey,
msg.sender,
nodeId,
merkleRoot,
sessionCount,
t
);
}
// -------------------------------------------------------------------------
// Views
// -------------------------------------------------------------------------
/// @notice Return the full history (prefer range pagination for large sets).
function getNodeHistory(string calldata nodeId)
external
view
returns (Attestation[] memory)
{
return _attestations[_nodeKey(nodeId)];
}
/// @notice Return the latest attestation for a node.
function getLatestAttestation(string calldata nodeId)
external
view
returns (Attestation memory)
{
Attestation[] storage arr = _attestations[_nodeKey(nodeId)];
uint256 len = arr.length;
if (len == 0) revert NoAttestationsFound();
return arr[len - 1];
}
/// @notice Return the number of attestations stored for a node.
function getAttestationCount(string calldata nodeId)
external
view
returns (uint256)
{
return _attestations[_nodeKey(nodeId)].length;
}
/// @notice Return the attestation at a given index (with bounds check).
function getAttestationAt(
string calldata nodeId,
uint256 index
) external view returns (Attestation memory) {
Attestation[] storage arr = _attestations[_nodeKey(nodeId)];
if (index >= arr.length) revert IndexOutOfBounds();
return arr[index];
}
/// @notice Paginate results to avoid returning huge arrays via eth_call.
/// @param start inclusive start index
/// @param count how many to return (must be > 0). Will clamp at end of array.
function getAttestationsRange(
string calldata nodeId,
uint256 start,
uint256 count
) external view returns (Attestation[] memory) {
if (count == 0) revert CountZero();
Attestation[] storage arr = _attestations[_nodeKey(nodeId)];
uint256 len = arr.length;
if (start >= len) revert IndexOutOfBounds();
uint256 end = start + count;
if (end > len) end = len;
uint256 n = end - start;
Attestation[] memory out = new Attestation[](n);
for (uint256 i = 0; i < n; ) {
out[i] = arr[start + i];
unchecked { ++i; }
}
return out;
}
/// @notice Whether we have ever seen this nodeId (based on keccak(nodeId)).
function existsNode(string calldata nodeId) external view returns (bool) {
return _seenNode[_nodeKey(nodeId)];
}
/// @notice Get all ZK proofs for a node
function getZKProofs(string calldata nodeId)
external
view
returns (ZKProof[] memory)
{
return _zkProofs[_nodeKey(nodeId)];
}
/// @notice Get latest ZK proof for a node
function getLatestZKProof(string calldata nodeId)
external
view
returns (ZKProof memory)
{
ZKProof[] storage proofs = _zkProofs[_nodeKey(nodeId)];
uint256 len = proofs.length;
if (len == 0) revert NoAttestationsFound();
return proofs[len - 1];
}
/// @notice Get ZK proof count for a node
function getZKProofCount(string calldata nodeId)
external
view
returns (uint256)
{
return _zkProofs[_nodeKey(nodeId)].length;
}
// -------------------------------------------------------------------------
// Slashing (event-only placeholder)
// -------------------------------------------------------------------------
/// @notice Record a slashing event (no funds movement; integrate real slashing later).
function slashNode(string calldata nodeId, string calldata reason)
external
onlyOwner
{
bytes32 nodeKey = _nodeKey(nodeId);
if (!_seenNode[nodeKey]) revert UnknownNode();
emit NodeSlashed(nodeKey, msg.sender, nodeId, reason);
}
// -------------------------------------------------------------------------
// Internal utilities
// -------------------------------------------------------------------------
function _nodeKey(string memory nodeId) private pure returns (bytes32) {
return keccak256(bytes(nodeId));
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AttestationHashRequired","type":"error"},{"inputs":[],"name":"CountZero","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidNewOwner","type":"error"},{"inputs":[],"name":"IpfsHashRequired","type":"error"},{"inputs":[],"name":"NoAttestationsFound","type":"error"},{"inputs":[],"name":"NodeIdRequired","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"UnknownNode","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"nodeKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"string","name":"nodeId","type":"string"},{"indexed":false,"internalType":"string","name":"ipfsHash","type":"string"},{"indexed":false,"internalType":"string","name":"attestationHash","type":"string"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"GradientRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"nodeKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"firstOperator","type":"address"},{"indexed":false,"internalType":"string","name":"nodeId","type":"string"}],"name":"NodeRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"nodeKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"string","name":"nodeId","type":"string"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"NodeSlashed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"nodeKey","type":"bytes32"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"string","name":"nodeId","type":"string"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"sessionCount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"ZKProofSubmitted","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"existsNode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAttestationAt","outputs":[{"components":[{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.Attestation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getAttestationCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getAttestationsRange","outputs":[{"components":[{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.Attestation[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getLatestAttestation","outputs":[{"components":[{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.Attestation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getLatestZKProof","outputs":[{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"sessionCount","type":"uint256"},{"internalType":"uint64","name":"timeRangeStart","type":"uint64"},{"internalType":"uint64","name":"timeRangeEnd","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.ZKProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getNodeHistory","outputs":[{"components":[{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.Attestation[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getZKProofCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"}],"name":"getZKProofs","outputs":[{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"sessionCount","type":"uint256"},{"internalType":"uint64","name":"timeRangeStart","type":"uint64"},{"internalType":"uint64","name":"timeRangeEnd","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"address","name":"nodeOperator","type":"address"}],"internalType":"struct VoidlyGradientRegistry.ZKProof[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"attestationHash","type":"string"}],"name":"registerGradient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"string","name":"reason","type":"string"}],"name":"slashNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"nodeId","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"sessionCount","type":"uint256"},{"internalType":"uint64","name":"timeRangeStart","type":"uint64"},{"internalType":"uint64","name":"timeRangeEnd","type":"uint64"}],"name":"submitZKProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAttestations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalZKProofs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50600080546001600160a01b03191633179055611bb9806100326000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063d7a1420311610071578063d7a142031461028a578063e16d98b51461029d578063e30c3978146102c0578063f2fde38b146102d3578063ffa1ad74146102e657600080fd5b80638da5cb5b1461021057806395cac59f1461023b578063cc5973381461024e578063d3495fda14610257578063d666ac411461027757600080fd5b80636e02d0b9116100f45780636e02d0b9146101ad57806379ba5097146101c25780638128e6c6146101ca578063837f9ef3146101dd57806387fe3233146101f057600080fd5b8063011f12411461013157806314e4058e1461015a5780631d8fa9471461017a578063604857421461019b5780636da49b83146101a4575b600080fd5b61014461013f36600461145c565b6102ee565b604051610151919061154d565b60405180910390f35b61016d610168366004611567565b6104f2565b60405161015191906115a8565b61018d610188366004611567565b6106fc565b604051908152602001610151565b61018d60055481565b61018d60075481565b6101c06101bb366004611626565b610759565b005b6101c061097f565b6101446101d8366004611567565b610a01565b61018d6101eb366004611567565b610aa4565b6102036101fe366004611567565b610ae9565b60405161015191906116ee565b600054610223906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d61024936600461173c565b610be1565b61018d60065481565b61026a610265366004611567565b610ebe565b604051610151919061178c565b6101c061028536600461179a565b611008565b6101c0610298366004611833565b6111df565b6102b06102ab366004611567565b6112cc565b6040519015158152602001610151565b600154610223906001600160a01b031681565b6101c06102e136600461189e565b61132c565b61018d600181565b6102f66113da565b60006002600061033b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260200190815260200160002090508080549050831061036f57604051634e23d03560e01b815260040160405180910390fd5b808381548110610381576103816118c7565b90600052602060002090600302016040518060800160405290816000820180546103aa906118dd565b80601f01602080910402602001604051908101604052809291908181526020018280546103d6906118dd565b80156104235780601f106103f857610100808354040283529160200191610423565b820191906000526020600020905b81548152906001019060200180831161040657829003601f168201915b5050505050815260200160018201805461043c906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610468906118dd565b80156104b55780601f1061048a576101008083540402835291602001916104b5565b820191906000526020600020905b81548152906001019060200180831161049857829003601f168201915b5050509183525050600291909101546001600160401b0381166020830152600160401b90046001600160a01b031660409091015295945050505050565b60606002600061053785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106ef5783829060005260206000209060030201604051806080016040529081600082018054610598906118dd565b80601f01602080910402602001604051908101604052809291908181526020018280546105c4906118dd565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050815260200160018201805461062a906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610656906118dd565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050509183525050600291909101546001600160401b038116602080840191909152600160401b9091046001600160a01b03166040909201919091529082526001929092019101610565565b5050505090505b92915050565b60006003600061074185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b81526020810191909152604001600020549392505050565b600085900361077b57604051637900159560e01b815260040160405180910390fd5b8260000361079c576040516311f6547b60e21b815260040160405180910390fd5b816001600160401b0316816001600160401b0316116107ce57604051632a52b3c360e11b815260040160405180910390fd5b600061080f87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661088c5760008181526004602052604090819020805460ff1916600190811790915560078054909101905551339082907f8326de45f66576db8724d4b3fca6bd518de1924e3dd3a2a62722d49e2ed3418390610883908b908b90611940565b60405180910390a35b60008181526003602081815260408084208054600180820183559186529290942060049092029091018881558084018890556002810180546001600160401b038981166fffffffffffffffffffffffffffffffff1990921691909117600160401b898316021767ffffffffffffffff60801b1916600160801b4292831602179091559281018054336001600160a01b031990911681179091556006805490950190945590519192909184907fb9be8b0a436dc0b085b349c839065e144caf21ed4e9e757220ba670bf2cbf5f19061096c908d908d908d908d908a9061195c565b60405180910390a3505050505050505050565b6001546001600160a01b031633146109aa5760405163ea8e4eb560e01b815260040160405180910390fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610a096113da565b600060026000610a4e86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020905060008180549050905080600003610a885760405163792120e960e01b815260040160405180910390fd5b81610a946001836119ac565b81548110610381576103816118c7565b60006002600061074185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b606060036000610b2e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106ef5760008481526020908190206040805160c08101825260048602909201805483526001808201548486015260028201546001600160401b0380821694860194909452600160401b810484166060860152600160801b90049092166080840152600301546001600160a01b031660a08301529083529092019101610b5c565b606081600003610c04576040516311f6547b60e21b815260040160405180910390fd5b600060026000610c4988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260208101919091526040016000208054909150808510610c7e57604051634e23d03560e01b815260040160405180910390fd5b6000610c8a85876119bf565b905081811115610c975750805b6000610ca387836119ac565b90506000816001600160401b03811115610cbf57610cbf6119d2565b604051908082528060200260200182016040528015610cf857816020015b610ce56113da565b815260200190600190039081610cdd5790505b50905060005b82811015610eb05785610d11828b6119bf565b81548110610d2157610d216118c7565b9060005260206000209060030201604051806080016040529081600082018054610d4a906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610d76906118dd565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b50505050508152602001600182018054610ddc906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e08906118dd565b8015610e555780601f10610e2a57610100808354040283529160200191610e55565b820191906000526020600020905b815481529060010190602001808311610e3857829003601f168201915b5050509183525050600291909101546001600160401b0381166020830152600160401b90046001600160a01b03166040909101528251839083908110610e9d57610e9d6118c7565b6020908102919091010152600101610cfe565b509998505050505050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152600060036000610f3586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020905060008180549050905080600003610f6f5760405163792120e960e01b815260040160405180910390fd5b81610f7b6001836119ac565b81548110610f8b57610f8b6118c7565b60009182526020918290206040805160c08101825260049093029091018054835260018101549383019390935260028301546001600160401b0380821692840192909252600160401b810482166060840152600160801b90041660808201526003909101546001600160a01b031660a08201529250505092915050565b600085900361102a57604051637900159560e01b815260040160405180910390fd5b600083900361104c5760405163eabfb56d60e01b815260040160405180910390fd5b600081900361106e57604051638a41014160e01b815260040160405180910390fd5b60006110af87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661112c5760008181526004602052604090819020805460ff1916600190811790915560078054909101905551339082907f8326de45f66576db8724d4b3fca6bd518de1924e3dd3a2a62722d49e2ed3418390611123908b908b90611940565b60405180910390a35b60008181526002602090815260408220805460018101825590835291204291600302018061115b878983611a37565b506001810161116b858783611a37565b506002810180546001600160401b0384166001600160e01b03199091161733600160401b81029190911790915560058054600101905560405184907f783b044dce7b053b4c6530b32077a369784582a0132610e0359c9e28b69f8eea9061096c908d908d908d908d908d908d908c90611af7565b6000546001600160a01b0316331461120a5760405163ea8e4eb560e01b815260040160405180910390fd5b600061124b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661127d57604051638b7114df60e01b815260040160405180910390fd5b336001600160a01b0316817fc53877e0156390b35fbfb90b9bcef46d8f85fe9c2906f3d4130418739a02868c878787876040516112bd9493929190611b51565b60405180910390a35050505050565b60006004600061131185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260208101919091526040016000205460ff169392505050565b6000546001600160a01b031633146113575760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b03811661137e57604051632a52b3c360e11b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a350565b805160209091012090565b6040518060800160405280606081526020016060815260200160006001600160401b0316815260200160006001600160a01b031681525090565b60008083601f84011261142657600080fd5b5081356001600160401b0381111561143d57600080fd5b60208301915083602082850101111561145557600080fd5b9250929050565b60008060006040848603121561147157600080fd5b83356001600160401b0381111561148757600080fd5b61149386828701611414565b909790965060209590950135949350505050565b6000815180845260005b818110156114cd576020818501810151868301820152016114b1565b506000602082860101526020601f19601f83011685010191505092915050565b600081516080845261150260808501826114a7565b90506020830151848203602086015261151b82826114a7565b6040858101516001600160401b0316908701526060948501516001600160a01b03169490950193909352509192915050565b60208152600061156060208301846114ed565b9392505050565b6000806020838503121561157a57600080fd5b82356001600160401b0381111561159057600080fd5b61159c85828601611414565b90969095509350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156115fd57603f198886030184526115eb8583516114ed565b945092850192908501906001016115cf565b5092979650505050505050565b80356001600160401b038116811461162157600080fd5b919050565b60008060008060008060a0878903121561163f57600080fd5b86356001600160401b0381111561165557600080fd5b61166189828a01611414565b90975095505060208701359350604087013592506116816060880161160a565b915061168f6080880161160a565b90509295509295509295565b805182526020810151602083015260408101516001600160401b038082166040850152806060840151166060850152806080840151166080850152505060018060a01b0360a08201511660a08301525050565b6020808252825182820181905260009190848201906040850190845b818110156117305761171d83855161169b565b9284019260c0929092019160010161170a565b50909695505050505050565b6000806000806060858703121561175257600080fd5b84356001600160401b0381111561176857600080fd5b61177487828801611414565b90989097506020870135966040013595509350505050565b60c081016106f6828461169b565b600080600080600080606087890312156117b357600080fd5b86356001600160401b03808211156117ca57600080fd5b6117d68a838b01611414565b909850965060208901359150808211156117ef57600080fd5b6117fb8a838b01611414565b9096509450604089013591508082111561181457600080fd5b5061182189828a01611414565b979a9699509497509295939492505050565b6000806000806040858703121561184957600080fd5b84356001600160401b038082111561186057600080fd5b61186c88838901611414565b9096509450602087013591508082111561188557600080fd5b5061189287828801611414565b95989497509550505050565b6000602082840312156118b057600080fd5b81356001600160a01b038116811461156057600080fd5b634e487b7160e01b600052603260045260246000fd5b600181811c908216806118f157607f821691505b60208210810361191157634e487b7160e01b600052602260045260246000fd5b50919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000611954602083018486611917565b949350505050565b608081526000611970608083018789611917565b60208301959095525060408101929092526001600160401b031660609091015292915050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106f6576106f6611996565b808201808211156106f6576106f6611996565b634e487b7160e01b600052604160045260246000fd5b601f821115611a3257600081815260208120601f850160051c81016020861015611a0f5750805b601f850160051c820191505b81811015611a2e57828155600101611a1b565b5050505b505050565b6001600160401b03831115611a4e57611a4e6119d2565b611a6283611a5c83546118dd565b836119e8565b6000601f841160018114611a965760008515611a7e5750838201355b600019600387901b1c1916600186901b178355611af0565b600083815260209020601f19861690835b82811015611ac75786850135825560209485019460019092019101611aa7565b5086821015611ae45760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b608081526000611b0b60808301898b611917565b8281036020840152611b1e81888a611917565b90508281036040840152611b33818688611917565b9150506001600160401b038316606083015298975050505050505050565b604081526000611b65604083018688611917565b8281036020840152611b78818587611917565b97965050505050505056fea2646970667358221220e7ee3d378bada3358a20c29a809d5b0539f0e664b7285c6d102cf159234e96b764736f6c63430008140033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063d7a1420311610071578063d7a142031461028a578063e16d98b51461029d578063e30c3978146102c0578063f2fde38b146102d3578063ffa1ad74146102e657600080fd5b80638da5cb5b1461021057806395cac59f1461023b578063cc5973381461024e578063d3495fda14610257578063d666ac411461027757600080fd5b80636e02d0b9116100f45780636e02d0b9146101ad57806379ba5097146101c25780638128e6c6146101ca578063837f9ef3146101dd57806387fe3233146101f057600080fd5b8063011f12411461013157806314e4058e1461015a5780631d8fa9471461017a578063604857421461019b5780636da49b83146101a4575b600080fd5b61014461013f36600461145c565b6102ee565b604051610151919061154d565b60405180910390f35b61016d610168366004611567565b6104f2565b60405161015191906115a8565b61018d610188366004611567565b6106fc565b604051908152602001610151565b61018d60055481565b61018d60075481565b6101c06101bb366004611626565b610759565b005b6101c061097f565b6101446101d8366004611567565b610a01565b61018d6101eb366004611567565b610aa4565b6102036101fe366004611567565b610ae9565b60405161015191906116ee565b600054610223906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d61024936600461173c565b610be1565b61018d60065481565b61026a610265366004611567565b610ebe565b604051610151919061178c565b6101c061028536600461179a565b611008565b6101c0610298366004611833565b6111df565b6102b06102ab366004611567565b6112cc565b6040519015158152602001610151565b600154610223906001600160a01b031681565b6101c06102e136600461189e565b61132c565b61018d600181565b6102f66113da565b60006002600061033b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260200190815260200160002090508080549050831061036f57604051634e23d03560e01b815260040160405180910390fd5b808381548110610381576103816118c7565b90600052602060002090600302016040518060800160405290816000820180546103aa906118dd565b80601f01602080910402602001604051908101604052809291908181526020018280546103d6906118dd565b80156104235780601f106103f857610100808354040283529160200191610423565b820191906000526020600020905b81548152906001019060200180831161040657829003601f168201915b5050505050815260200160018201805461043c906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610468906118dd565b80156104b55780601f1061048a576101008083540402835291602001916104b5565b820191906000526020600020905b81548152906001019060200180831161049857829003601f168201915b5050509183525050600291909101546001600160401b0381166020830152600160401b90046001600160a01b031660409091015295945050505050565b60606002600061053785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106ef5783829060005260206000209060030201604051806080016040529081600082018054610598906118dd565b80601f01602080910402602001604051908101604052809291908181526020018280546105c4906118dd565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050815260200160018201805461062a906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610656906118dd565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050509183525050600291909101546001600160401b038116602080840191909152600160401b9091046001600160a01b03166040909201919091529082526001929092019101610565565b5050505090505b92915050565b60006003600061074185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b81526020810191909152604001600020549392505050565b600085900361077b57604051637900159560e01b815260040160405180910390fd5b8260000361079c576040516311f6547b60e21b815260040160405180910390fd5b816001600160401b0316816001600160401b0316116107ce57604051632a52b3c360e11b815260040160405180910390fd5b600061080f87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661088c5760008181526004602052604090819020805460ff1916600190811790915560078054909101905551339082907f8326de45f66576db8724d4b3fca6bd518de1924e3dd3a2a62722d49e2ed3418390610883908b908b90611940565b60405180910390a35b60008181526003602081815260408084208054600180820183559186529290942060049092029091018881558084018890556002810180546001600160401b038981166fffffffffffffffffffffffffffffffff1990921691909117600160401b898316021767ffffffffffffffff60801b1916600160801b4292831602179091559281018054336001600160a01b031990911681179091556006805490950190945590519192909184907fb9be8b0a436dc0b085b349c839065e144caf21ed4e9e757220ba670bf2cbf5f19061096c908d908d908d908d908a9061195c565b60405180910390a3505050505050505050565b6001546001600160a01b031633146109aa5760405163ea8e4eb560e01b815260040160405180910390fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610a096113da565b600060026000610a4e86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020905060008180549050905080600003610a885760405163792120e960e01b815260040160405180910390fd5b81610a946001836119ac565b81548110610381576103816118c7565b60006002600061074185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b606060036000610b2e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106ef5760008481526020908190206040805160c08101825260048602909201805483526001808201548486015260028201546001600160401b0380821694860194909452600160401b810484166060860152600160801b90049092166080840152600301546001600160a01b031660a08301529083529092019101610b5c565b606081600003610c04576040516311f6547b60e21b815260040160405180910390fd5b600060026000610c4988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260208101919091526040016000208054909150808510610c7e57604051634e23d03560e01b815260040160405180910390fd5b6000610c8a85876119bf565b905081811115610c975750805b6000610ca387836119ac565b90506000816001600160401b03811115610cbf57610cbf6119d2565b604051908082528060200260200182016040528015610cf857816020015b610ce56113da565b815260200190600190039081610cdd5790505b50905060005b82811015610eb05785610d11828b6119bf565b81548110610d2157610d216118c7565b9060005260206000209060030201604051806080016040529081600082018054610d4a906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610d76906118dd565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b50505050508152602001600182018054610ddc906118dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e08906118dd565b8015610e555780601f10610e2a57610100808354040283529160200191610e55565b820191906000526020600020905b815481529060010190602001808311610e3857829003601f168201915b5050509183525050600291909101546001600160401b0381166020830152600160401b90046001600160a01b03166040909101528251839083908110610e9d57610e9d6118c7565b6020908102919091010152600101610cfe565b509998505050505050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152600060036000610f3586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b8152602001908152602001600020905060008180549050905080600003610f6f5760405163792120e960e01b815260040160405180910390fd5b81610f7b6001836119ac565b81548110610f8b57610f8b6118c7565b60009182526020918290206040805160c08101825260049093029091018054835260018101549383019390935260028301546001600160401b0380821692840192909252600160401b810482166060840152600160801b90041660808201526003909101546001600160a01b031660a08201529250505092915050565b600085900361102a57604051637900159560e01b815260040160405180910390fd5b600083900361104c5760405163eabfb56d60e01b815260040160405180910390fd5b600081900361106e57604051638a41014160e01b815260040160405180910390fd5b60006110af87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661112c5760008181526004602052604090819020805460ff1916600190811790915560078054909101905551339082907f8326de45f66576db8724d4b3fca6bd518de1924e3dd3a2a62722d49e2ed3418390611123908b908b90611940565b60405180910390a35b60008181526002602090815260408220805460018101825590835291204291600302018061115b878983611a37565b506001810161116b858783611a37565b506002810180546001600160401b0384166001600160e01b03199091161733600160401b81029190911790915560058054600101905560405184907f783b044dce7b053b4c6530b32077a369784582a0132610e0359c9e28b69f8eea9061096c908d908d908d908d908d908d908c90611af7565b6000546001600160a01b0316331461120a5760405163ea8e4eb560e01b815260040160405180910390fd5b600061124b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b60008181526004602052604090205490915060ff1661127d57604051638b7114df60e01b815260040160405180910390fd5b336001600160a01b0316817fc53877e0156390b35fbfb90b9bcef46d8f85fe9c2906f3d4130418739a02868c878787876040516112bd9493929190611b51565b60405180910390a35050505050565b60006004600061131185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113cf92505050565b815260208101919091526040016000205460ff169392505050565b6000546001600160a01b031633146113575760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b03811661137e57604051632a52b3c360e11b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a350565b805160209091012090565b6040518060800160405280606081526020016060815260200160006001600160401b0316815260200160006001600160a01b031681525090565b60008083601f84011261142657600080fd5b5081356001600160401b0381111561143d57600080fd5b60208301915083602082850101111561145557600080fd5b9250929050565b60008060006040848603121561147157600080fd5b83356001600160401b0381111561148757600080fd5b61149386828701611414565b909790965060209590950135949350505050565b6000815180845260005b818110156114cd576020818501810151868301820152016114b1565b506000602082860101526020601f19601f83011685010191505092915050565b600081516080845261150260808501826114a7565b90506020830151848203602086015261151b82826114a7565b6040858101516001600160401b0316908701526060948501516001600160a01b03169490950193909352509192915050565b60208152600061156060208301846114ed565b9392505050565b6000806020838503121561157a57600080fd5b82356001600160401b0381111561159057600080fd5b61159c85828601611414565b90969095509350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156115fd57603f198886030184526115eb8583516114ed565b945092850192908501906001016115cf565b5092979650505050505050565b80356001600160401b038116811461162157600080fd5b919050565b60008060008060008060a0878903121561163f57600080fd5b86356001600160401b0381111561165557600080fd5b61166189828a01611414565b90975095505060208701359350604087013592506116816060880161160a565b915061168f6080880161160a565b90509295509295509295565b805182526020810151602083015260408101516001600160401b038082166040850152806060840151166060850152806080840151166080850152505060018060a01b0360a08201511660a08301525050565b6020808252825182820181905260009190848201906040850190845b818110156117305761171d83855161169b565b9284019260c0929092019160010161170a565b50909695505050505050565b6000806000806060858703121561175257600080fd5b84356001600160401b0381111561176857600080fd5b61177487828801611414565b90989097506020870135966040013595509350505050565b60c081016106f6828461169b565b600080600080600080606087890312156117b357600080fd5b86356001600160401b03808211156117ca57600080fd5b6117d68a838b01611414565b909850965060208901359150808211156117ef57600080fd5b6117fb8a838b01611414565b9096509450604089013591508082111561181457600080fd5b5061182189828a01611414565b979a9699509497509295939492505050565b6000806000806040858703121561184957600080fd5b84356001600160401b038082111561186057600080fd5b61186c88838901611414565b9096509450602087013591508082111561188557600080fd5b5061189287828801611414565b95989497509550505050565b6000602082840312156118b057600080fd5b81356001600160a01b038116811461156057600080fd5b634e487b7160e01b600052603260045260246000fd5b600181811c908216806118f157607f821691505b60208210810361191157634e487b7160e01b600052602260045260246000fd5b50919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000611954602083018486611917565b949350505050565b608081526000611970608083018789611917565b60208301959095525060408101929092526001600160401b031660609091015292915050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106f6576106f6611996565b808201808211156106f6576106f6611996565b634e487b7160e01b600052604160045260246000fd5b601f821115611a3257600081815260208120601f850160051c81016020861015611a0f5750805b601f850160051c820191505b81811015611a2e57828155600101611a1b565b5050505b505050565b6001600160401b03831115611a4e57611a4e6119d2565b611a6283611a5c83546118dd565b836119e8565b6000601f841160018114611a965760008515611a7e5750838201355b600019600387901b1c1916600186901b178355611af0565b600083815260209020601f19861690835b82811015611ac75786850135825560209485019460019092019101611aa7565b5086821015611ae45760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b608081526000611b0b60808301898b611917565b8281036020840152611b1e81888a611917565b90508281036040840152611b33818688611917565b9150506001600160401b038316606083015298975050505050505050565b604081526000611b65604083018688611917565b8281036020840152611b78818587611917565b97965050505050505056fea2646970667358221220e7ee3d378bada3358a20c29a809d5b0539f0e664b7285c6d102cf159234e96b764736f6c63430008140033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.