Source Code
Overview
APE Balance
APE Value
$0.00Multichain Info
N/A
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 25788734 | 92 days ago | Contract Creation | 0 APE |
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x44f18EBd...38719243a The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
PackProvenanceVerifier
Compiler Version
v0.8.27+commit.40a35a09
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 PackProvenanceVerifier
* @notice Verifies pack provenance proofs on-chain
* @dev Replicates the testProof function from pack-provenance.ts
*
* This contract allows anyone to verify that:
* 1. A pack contains specific cards
* 2. The cards were hashed correctly (order-independent via sorting)
* 3. The pack's position (tokenId) is cryptographically bound
* 4. The secret produces the expected pack hash
*/
contract PackProvenanceVerifier {
/// @notice Represents a card in a pack
struct PackCard {
uint256 cardIndex;
uint256 serial;
}
/**
* @notice Verify a pack's provenance proof with collection Merkle proof
* @dev Cards will be sorted automatically to match off-chain sorting
* @param tokenId The pack's token ID as uint256
* @param cards Array of cards (will be sorted by contract)
* @param secret The secret used to hash the pack (hex string without 0x prefix)
* @param expectedPackHash The expected pack hash to verify against
* @param collectionRoot The Merkle root of the entire pack collection
* @param merkleProof Array of sibling hashes to prove pack is in collection
* @return valid True if the proof is valid and pack is in collection
* @return computedPackHash The pack hash computed from inputs
*/
function verifyPackProof(
uint256 tokenId,
PackCard[] calldata cards,
string calldata secret,
bytes32 expectedPackHash,
bytes32 collectionRoot,
bytes32[] calldata merkleProof
) external pure returns (bool valid, bytes32 computedPackHash) {
require(cards.length > 0, "Pack must contain cards");
require(bytes(secret).length > 0, "Secret cannot be empty");
// Sort cards to match TypeScript implementation
PackCard[] memory sortedCards = _sortCards(cards);
// Step 1: Hash each card individually
bytes32[] memory cardHashes = new bytes32[](sortedCards.length);
for (uint256 i = 0; i < sortedCards.length; i++) {
// Hash format: sha256("cardIndex:serial")
cardHashes[i] = sha256(
abi.encodePacked(
_uint256ToString(sortedCards[i].cardIndex),
":",
_uint256ToString(sortedCards[i].serial)
)
);
}
// Step 2: Build Merkle tree from card hashes
bytes32 cardsMerkleRoot = _buildMerkleTree(cardHashes);
// Step 3: Hash (cardsMerkleRoot + tokenId + secret) for final pack hash
// Convert tokenId to string to match TypeScript implementation
computedPackHash = sha256(
abi.encodePacked(
_bytes32ToHexString(cardsMerkleRoot),
_uint256ToString(tokenId),
secret
)
);
// Step 4: Validate pack hash matches expected
bool packHashValid = (computedPackHash == expectedPackHash);
// Step 5: Verify pack is in collection using Merkle proof
// Collection leaf = sha256(tokenId + packHash)
bytes32 collectionLeaf = sha256(
abi.encodePacked(
_uint256ToString(tokenId),
_bytes32ToHexString(computedPackHash)
)
);
bool inCollection = _verifyMerkleProof(
collectionLeaf,
merkleProof,
collectionRoot
);
// Both checks must pass
valid = packHashValid && inCollection;
return (valid, computedPackHash);
}
/**
* @notice View function to compute pack hash without emitting events
* @dev Same logic as verifyPackProof but read-only
*/
function computePackHash(
uint256 tokenId,
PackCard[] calldata cards,
string calldata secret
) external pure returns (bytes32 packHash) {
require(cards.length > 0, "Pack must contain cards");
require(bytes(secret).length > 0, "Secret cannot be empty");
// Sort cards to match TypeScript implementation
PackCard[] memory sortedCards = _sortCards(cards);
// Hash each card
bytes32[] memory cardHashes = new bytes32[](sortedCards.length);
for (uint256 i = 0; i < sortedCards.length; i++) {
cardHashes[i] = sha256(
abi.encodePacked(
_uint256ToString(sortedCards[i].cardIndex),
":",
_uint256ToString(sortedCards[i].serial)
)
);
}
// Build Merkle tree
bytes32 cardsMerkleRoot = _buildMerkleTree(cardHashes);
// Final hash
packHash = sha256(
abi.encodePacked(
_bytes32ToHexString(cardsMerkleRoot),
_uint256ToString(tokenId),
secret
)
);
return packHash;
}
/**
* @notice Verify multiple packs in a single transaction
* @dev More gas-efficient for batch verification
*/
function verifyMultipleProofs(
uint256[] calldata tokenIds,
PackCard[][] calldata cardArrays,
string[] calldata secrets,
bytes32[] calldata expectedHashes,
bytes32 collectionRoot,
bytes32[][] calldata merkleProofs
) external view returns (bool[] memory results) {
require(
tokenIds.length == cardArrays.length &&
tokenIds.length == secrets.length &&
tokenIds.length == expectedHashes.length &&
tokenIds.length == merkleProofs.length,
"Array length mismatch"
);
results = new bool[](tokenIds.length);
for (uint256 i = 0; i < tokenIds.length; i++) {
bytes32 computedHash = this.computePackHash(
tokenIds[i],
cardArrays[i],
secrets[i]
);
bool packHashValid = (computedHash == expectedHashes[i]);
// Verify pack is in collection
bytes32 collectionLeaf = sha256(
abi.encodePacked(
_uint256ToString(tokenIds[i]),
_bytes32ToHexString(computedHash)
)
);
bool inCollection = _verifyMerkleProof(
collectionLeaf,
merkleProofs[i],
collectionRoot
);
results[i] = packHashValid && inCollection;
}
return results;
}
/**
* @dev Build Merkle tree from array of hashes
* @param leaves Array of leaf hashes
* @return root The Merkle root hash
*/
function _buildMerkleTree(
bytes32[] memory leaves
) internal pure returns (bytes32 root) {
require(leaves.length > 0, "Cannot build tree from empty array");
if (leaves.length == 1) {
return leaves[0];
}
// Build tree level by level
bytes32[] memory currentLevel = leaves;
while (currentLevel.length > 1) {
uint256 nextLevelSize = (currentLevel.length + 1) / 2;
bytes32[] memory nextLevel = new bytes32[](nextLevelSize);
uint256 nextIndex = 0;
for (uint256 i = 0; i < currentLevel.length; i += 2) {
if (i + 1 < currentLevel.length) {
// Hash pair together with deterministic ordering (smaller hash first)
bytes32 left = currentLevel[i];
bytes32 right = currentLevel[i + 1];
nextLevel[nextIndex] = left < right
? sha256(
abi.encodePacked(
_bytes32ToHexString(left),
_bytes32ToHexString(right)
)
)
: sha256(
abi.encodePacked(
_bytes32ToHexString(right),
_bytes32ToHexString(left)
)
);
} else {
// Odd number of elements, promote the last one
nextLevel[nextIndex] = currentLevel[i];
}
nextIndex++;
}
currentLevel = nextLevel;
}
return currentLevel[0];
}
/**
* @dev Sort cards array by cardIndex (primary) then serial (secondary)
* @dev Uses insertion sort (efficient for small arrays, typical pack size ~5-15 cards)
* @param cards Array of cards to sort
* @return sorted Array of cards sorted by cardIndex then serial
*/
function _sortCards(
PackCard[] calldata cards
) internal pure returns (PackCard[] memory sorted) {
sorted = new PackCard[](cards.length);
// Copy cards to memory
for (uint256 i = 0; i < cards.length; i++) {
sorted[i] = cards[i];
}
// Insertion sort
for (uint256 i = 1; i < sorted.length; i++) {
PackCard memory key = sorted[i];
uint256 j = i;
while (j > 0 && _compareCards(sorted[j - 1], key) > 0) {
sorted[j] = sorted[j - 1];
j--;
}
sorted[j] = key;
}
return sorted;
}
/**
* @dev Compare two cards for sorting
* @return -1 if a < b, 0 if a == b, 1 if a > b
*/
function _compareCards(
PackCard memory a,
PackCard memory b
) internal pure returns (int256) {
if (a.cardIndex < b.cardIndex) {
return -1;
} else if (a.cardIndex > b.cardIndex) {
return 1;
} else {
// Same cardIndex, compare by serial
if (a.serial < b.serial) {
return -1;
} else if (a.serial > b.serial) {
return 1;
} else {
return 0;
}
}
}
/**
* @dev Verify a Merkle proof
* @param leaf The leaf node to verify
* @param proof Array of sibling hashes along the path to root
* @param root The expected Merkle root
* @return True if the proof is valid
*/
function _verifyMerkleProof(
bytes32 leaf,
bytes32[] calldata proof,
bytes32 root
) internal pure returns (bool) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash < proofElement) {
// Current node is left child
computedHash = sha256(
abi.encodePacked(
_bytes32ToHexString(computedHash),
_bytes32ToHexString(proofElement)
)
);
} else {
// Current node is right child
computedHash = sha256(
abi.encodePacked(
_bytes32ToHexString(proofElement),
_bytes32ToHexString(computedHash)
)
);
}
}
return computedHash == root;
}
/**
* @dev Convert uint256 to string
*/
function _uint256ToString(
uint256 value
) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Convert bytes32 to hex string (without 0x prefix)
* @dev Matches the JavaScript .toString("hex") format
*/
function _bytes32ToHexString(
bytes32 data
) internal pure returns (string memory) {
bytes memory hexChars = "0123456789abcdef";
bytes memory result = new bytes(64);
for (uint256 i = 0; i < 32; i++) {
result[i * 2] = hexChars[uint8(data[i] >> 4)];
result[i * 2 + 1] = hexChars[uint8(data[i] & 0x0f)];
}
return string(result);
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"cardIndex","type":"uint256"},{"internalType":"uint256","name":"serial","type":"uint256"}],"internalType":"struct PackProvenanceVerifier.PackCard[]","name":"cards","type":"tuple[]"},{"internalType":"string","name":"secret","type":"string"}],"name":"computePackHash","outputs":[{"internalType":"bytes32","name":"packHash","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"cardIndex","type":"uint256"},{"internalType":"uint256","name":"serial","type":"uint256"}],"internalType":"struct PackProvenanceVerifier.PackCard[][]","name":"cardArrays","type":"tuple[][]"},{"internalType":"string[]","name":"secrets","type":"string[]"},{"internalType":"bytes32[]","name":"expectedHashes","type":"bytes32[]"},{"internalType":"bytes32","name":"collectionRoot","type":"bytes32"},{"internalType":"bytes32[][]","name":"merkleProofs","type":"bytes32[][]"}],"name":"verifyMultipleProofs","outputs":[{"internalType":"bool[]","name":"results","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"cardIndex","type":"uint256"},{"internalType":"uint256","name":"serial","type":"uint256"}],"internalType":"struct PackProvenanceVerifier.PackCard[]","name":"cards","type":"tuple[]"},{"internalType":"string","name":"secret","type":"string"},{"internalType":"bytes32","name":"expectedPackHash","type":"bytes32"},{"internalType":"bytes32","name":"collectionRoot","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"verifyPackProof","outputs":[{"internalType":"bool","name":"valid","type":"bool"},{"internalType":"bytes32","name":"computedPackHash","type":"bytes32"}],"stateMutability":"pure","type":"function"}]Contract Creation Code
0x60808060405234601557610fe6908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806340ff6f551461064f578063b80c2b22146102165763dd299e881461003d57600080fd5b34610211576060366003190112610211576024356001600160401b0381116102115761006d9036906004016107db565b906044356001600160401b038111610211576100906100ae91369060040161080b565b93909261009e821515610868565b6100a98515156108b4565b6109e8565b6100b88151610962565b9260005b825181101561018657602060006101566100e06100d985886109a1565b5151610b9f565b8361014560016100fc836100f48a8d6109a1565b510151610b9f565b6040519384918161011681850198898151938492016109b5565b8301601d60f91b8382015261013482518093856021850191016109b5565b01010301601f19810183528261092a565b6040519283928392519283916109b5565b8101039060025afa1561017a5760019060005161017382886109a1565b52016100bc565b6040513d6000823e3d90fd5b602060006101f78483610145896101a461019f8d610c63565b610dec565b936101b0600435610b9f565b9181604051958694816101cc8188019a8b8151938492016109b5565b86016101e0825180938580850191016109b5565b01019182370186815203601f19810183528261092a565b8101039060025afa1561017a576020600051604051908152f35b600080fd5b346102115760c0366003190112610211576004356001600160401b03811161021157610246903690600401610838565b906024356001600160401b03811161021157610266903690600401610838565b916044356001600160401b03811161021157610286903690600401610838565b90946064356001600160401b038111610211576102a7903690600401610838565b95909160a4356001600160401b038111610211576102c9903690600401610838565b97909483831480610646575b8061063d575b80610634575b156105f7576102ef8361094b565b996102fd6040519b8c61092a565b838b526103098461094b565b601f19013660208d013760005b848110610365578b60405180916020820160208352815180915260206040840192019060005b81811061034a575050500390f35b8251151584528594506020938401939092019160010161033c565b61037081868b6109d8565b35908681101561057b578060051b8b0135601e198c360301811215610211578b016001600160401b0381351161021157803560061b36036020820113610211578482101561057b578160051b840135601e19853603018112156102115784016001600160401b038135116102115780353603602082011361021157604051631ba533d160e31b8152600481019490945260606024850152813560648501526020820191849160848301916000905b803582106105d1575050602093508391839160031983830301604484015280358252803584820185840137600084823584010152601f80199135011601030181305afa801561017a5786868a8d95600094610591575b509260206101456104ac6104a66104a089600098610497826104ea9a899d6109d8565b3588149c6109d8565b35610b9f565b93610dec565b604051928391816104c681850197888151938492016109b5565b83016104da825180938580850191016109b5565b010103601f19810183528261092a565b8101039060025afa1561017a576000518c82101561057b57601e198a3603018260051b8b01351215610211578160051b8a01358a01928335936001600160401b03851161021157602001938060051b36038513610211578f9261055590859260019760843592610ed5565b82610571575b5061056691926109a1565b901515905201610316565b915061056661055b565b634e487b7160e01b600052603260045260246000fd5b9495505050506020823d82116105c9575b816105af6020938361092a565b810103126105c657505189919086868a6020610474565b80fd5b3d91506105a2565b85358452602080870135908501526040958601958895509093019260019091019061041e565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b508883146102e1565b508183146102db565b508083146102d5565b346102115760c0366003190112610211576004356024356001600160401b038111610211576106829036906004016107db565b6044929192356001600160401b038111610211576106a490369060040161080b565b93909260a4356001600160401b038111610211576106c96106e2913690600401610838565b9490936106d7821515610868565b6100a98815156108b4565b926106ed8451610962565b9560005b85518110156107475760206000610723888361014560016100fc836100f48a61071d6100d9828a6109a1565b976109a1565b8101039060025afa1561017a57600190600051610740828b6109a1565b52016106f1565b50600061076b602092836101458a61076161019f8e610c63565b936101b08a610b9f565b8101039060025afa1561017a57600051906020600061079e610791606435861496610b9f565b836101456104ac88610dec565b8101039060025afa1561017a576040936107be9160843591600051610ed5565b826107d3575b50825191151582526020820152f35b9150836107c4565b9181601f84011215610211578235916001600160401b038311610211576020808501948460061b01011161021157565b9181601f84011215610211578235916001600160401b038311610211576020838186019501011161021157565b9181601f84011215610211578235916001600160401b038311610211576020808501948460051b01011161021157565b1561086f57565b60405162461bcd60e51b815260206004820152601760248201527f5061636b206d75737420636f6e7461696e2063617264730000000000000000006044820152606490fd5b156108bb57565b60405162461bcd60e51b81526020600482015260166024820152755365637265742063616e6e6f7420626520656d70747960501b6044820152606490fd5b604081019081106001600160401b0382111761091457604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b0382111761091457604052565b6001600160401b0381116109145760051b60200190565b9061096c8261094b565b610979604051918261092a565b828152809261098a601f199161094b565b0190602036910137565b80511561057b5760200190565b805182101561057b5760209160051b010190565b60005b8381106109c85750506000910152565b81810151838201526020016109b8565b919081101561057b5760051b0190565b6109f18261094b565b926109ff604051948561092a565b828452601f19610a0e8461094b565b0160005b818110610b3f57505060005b83811015610a745760008160061b8401906040823603126105c6575090600191602060405191610a4d836108f9565b8035835201356020820152610a6282886109a1565b52610a6d81876109a1565b5001610a1e565b509150506001915b8051831015610b3b57610a8f83826109a1565b5191835b8015801580610b12575b15610aec57600019820191808311610ad657610acf90610abd84876109a1565b51610ac882886109a1565b52856109a1565b5015610a93575b634e487b7160e01b600052601160045260246000fd5b50610b099060019394959295610b0282876109a1565b52846109a1565b50019190610a7c565b506000198201828111610ad657610b3586610b2f600093886109a1565b51610f62565b13610a9d565b9150565b602090604051610b4e816108f9565b6000815260008382015282828901015201610a12565b6001600160401b03811161091457601f01601f191660200190565b6000198114610ad65760010190565b90815181101561057b570160200190565b8015610c435780816000925b610c2d5750610bb982610b64565b91610bc7604051938461092a565b80835281601f19610bd783610b64565b013660208601375b610be857505090565b6000198101908111610ad6578091600a81066030019182603011610ad657600a9260f81b6001600160f81b03191660001a90610c249086610b8e565b53049081610bdf565b9091610c3a600a91610b7f565b92910480610bab565b50604051610c5260408261092a565b60018152600360fc1b602082015290565b805115610d9c576001815114610d9357905b81516001811115610d845760018101809111610ad657610c979060011c610962565b906000805b8451821015610d7a5760018201808311610ad6578551811015610d60576020610cd591610cc985896109a1565b5160009384928a6109a1565b519081811015610d355790836101456104ac6104a6610cf395610dec565b8101039060025afa15610d295790610d1791515b610d1182876109a1565b52610b7f565b9060028101809111610ad65790610c9c565b604051903d90823e3d90fd5b836101456104ac6104a6610d4895610dec565b8101039060025afa15610d295790610d179151610d07565b50610d1790610d6f83876109a1565b51610d1182876109a1565b5050915090610c75565b5090610d8f90610994565b5190565b610d8f90610994565b60405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74206275696c6420747265652066726f6d20656d70747920617272604482015261617960f01b6064820152608490fd5b604090815190610dfc838361092a565b601082526f181899199a1a9b1b9c1cb0b131b232b360811b6020830152825192610e2760608561092a565b8352604036602085013760005b60208110610e425750505090565b81811a6001600160f81b0319610e5f600483901c600f1686610b8e565b5116908260011b9183830460021484151715610ad65760001a610e828388610b8e565b536001600160f81b031990610e9a90600f1686610b8e565b5116600060018301809311610ec1576001939291610eba911a9187610b8e565b5301610e34565b634e487b7160e01b81526011600452602490fd5b91906000915b808310610ee9575050501490565b9091926000602091610efc8685876109d8565b35908181108314610f375790836101456104ac6104a6610f1b95610dec565b8101039060025afa1561017a576001600051935b019190610edb565b836101456104ac6104a6610f4a95610dec565b8101039060025afa1561017a57600160005193610f2f565b805182519081811015610f79575050505060001990565b1115610f86575050600190565b6020908101519101519081811015610fa057505060001990565b1115610fab57600190565b60009056fea26469706673582212207ef25be3f79795ccf66e11b6581126fd7d7d90e084686c20a869c9c093e07f4a64736f6c634300081b0033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c806340ff6f551461064f578063b80c2b22146102165763dd299e881461003d57600080fd5b34610211576060366003190112610211576024356001600160401b0381116102115761006d9036906004016107db565b906044356001600160401b038111610211576100906100ae91369060040161080b565b93909261009e821515610868565b6100a98515156108b4565b6109e8565b6100b88151610962565b9260005b825181101561018657602060006101566100e06100d985886109a1565b5151610b9f565b8361014560016100fc836100f48a8d6109a1565b510151610b9f565b6040519384918161011681850198898151938492016109b5565b8301601d60f91b8382015261013482518093856021850191016109b5565b01010301601f19810183528261092a565b6040519283928392519283916109b5565b8101039060025afa1561017a5760019060005161017382886109a1565b52016100bc565b6040513d6000823e3d90fd5b602060006101f78483610145896101a461019f8d610c63565b610dec565b936101b0600435610b9f565b9181604051958694816101cc8188019a8b8151938492016109b5565b86016101e0825180938580850191016109b5565b01019182370186815203601f19810183528261092a565b8101039060025afa1561017a576020600051604051908152f35b600080fd5b346102115760c0366003190112610211576004356001600160401b03811161021157610246903690600401610838565b906024356001600160401b03811161021157610266903690600401610838565b916044356001600160401b03811161021157610286903690600401610838565b90946064356001600160401b038111610211576102a7903690600401610838565b95909160a4356001600160401b038111610211576102c9903690600401610838565b97909483831480610646575b8061063d575b80610634575b156105f7576102ef8361094b565b996102fd6040519b8c61092a565b838b526103098461094b565b601f19013660208d013760005b848110610365578b60405180916020820160208352815180915260206040840192019060005b81811061034a575050500390f35b8251151584528594506020938401939092019160010161033c565b61037081868b6109d8565b35908681101561057b578060051b8b0135601e198c360301811215610211578b016001600160401b0381351161021157803560061b36036020820113610211578482101561057b578160051b840135601e19853603018112156102115784016001600160401b038135116102115780353603602082011361021157604051631ba533d160e31b8152600481019490945260606024850152813560648501526020820191849160848301916000905b803582106105d1575050602093508391839160031983830301604484015280358252803584820185840137600084823584010152601f80199135011601030181305afa801561017a5786868a8d95600094610591575b509260206101456104ac6104a66104a089600098610497826104ea9a899d6109d8565b3588149c6109d8565b35610b9f565b93610dec565b604051928391816104c681850197888151938492016109b5565b83016104da825180938580850191016109b5565b010103601f19810183528261092a565b8101039060025afa1561017a576000518c82101561057b57601e198a3603018260051b8b01351215610211578160051b8a01358a01928335936001600160401b03851161021157602001938060051b36038513610211578f9261055590859260019760843592610ed5565b82610571575b5061056691926109a1565b901515905201610316565b915061056661055b565b634e487b7160e01b600052603260045260246000fd5b9495505050506020823d82116105c9575b816105af6020938361092a565b810103126105c657505189919086868a6020610474565b80fd5b3d91506105a2565b85358452602080870135908501526040958601958895509093019260019091019061041e565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b508883146102e1565b508183146102db565b508083146102d5565b346102115760c0366003190112610211576004356024356001600160401b038111610211576106829036906004016107db565b6044929192356001600160401b038111610211576106a490369060040161080b565b93909260a4356001600160401b038111610211576106c96106e2913690600401610838565b9490936106d7821515610868565b6100a98815156108b4565b926106ed8451610962565b9560005b85518110156107475760206000610723888361014560016100fc836100f48a61071d6100d9828a6109a1565b976109a1565b8101039060025afa1561017a57600190600051610740828b6109a1565b52016106f1565b50600061076b602092836101458a61076161019f8e610c63565b936101b08a610b9f565b8101039060025afa1561017a57600051906020600061079e610791606435861496610b9f565b836101456104ac88610dec565b8101039060025afa1561017a576040936107be9160843591600051610ed5565b826107d3575b50825191151582526020820152f35b9150836107c4565b9181601f84011215610211578235916001600160401b038311610211576020808501948460061b01011161021157565b9181601f84011215610211578235916001600160401b038311610211576020838186019501011161021157565b9181601f84011215610211578235916001600160401b038311610211576020808501948460051b01011161021157565b1561086f57565b60405162461bcd60e51b815260206004820152601760248201527f5061636b206d75737420636f6e7461696e2063617264730000000000000000006044820152606490fd5b156108bb57565b60405162461bcd60e51b81526020600482015260166024820152755365637265742063616e6e6f7420626520656d70747960501b6044820152606490fd5b604081019081106001600160401b0382111761091457604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b0382111761091457604052565b6001600160401b0381116109145760051b60200190565b9061096c8261094b565b610979604051918261092a565b828152809261098a601f199161094b565b0190602036910137565b80511561057b5760200190565b805182101561057b5760209160051b010190565b60005b8381106109c85750506000910152565b81810151838201526020016109b8565b919081101561057b5760051b0190565b6109f18261094b565b926109ff604051948561092a565b828452601f19610a0e8461094b565b0160005b818110610b3f57505060005b83811015610a745760008160061b8401906040823603126105c6575090600191602060405191610a4d836108f9565b8035835201356020820152610a6282886109a1565b52610a6d81876109a1565b5001610a1e565b509150506001915b8051831015610b3b57610a8f83826109a1565b5191835b8015801580610b12575b15610aec57600019820191808311610ad657610acf90610abd84876109a1565b51610ac882886109a1565b52856109a1565b5015610a93575b634e487b7160e01b600052601160045260246000fd5b50610b099060019394959295610b0282876109a1565b52846109a1565b50019190610a7c565b506000198201828111610ad657610b3586610b2f600093886109a1565b51610f62565b13610a9d565b9150565b602090604051610b4e816108f9565b6000815260008382015282828901015201610a12565b6001600160401b03811161091457601f01601f191660200190565b6000198114610ad65760010190565b90815181101561057b570160200190565b8015610c435780816000925b610c2d5750610bb982610b64565b91610bc7604051938461092a565b80835281601f19610bd783610b64565b013660208601375b610be857505090565b6000198101908111610ad6578091600a81066030019182603011610ad657600a9260f81b6001600160f81b03191660001a90610c249086610b8e565b53049081610bdf565b9091610c3a600a91610b7f565b92910480610bab565b50604051610c5260408261092a565b60018152600360fc1b602082015290565b805115610d9c576001815114610d9357905b81516001811115610d845760018101809111610ad657610c979060011c610962565b906000805b8451821015610d7a5760018201808311610ad6578551811015610d60576020610cd591610cc985896109a1565b5160009384928a6109a1565b519081811015610d355790836101456104ac6104a6610cf395610dec565b8101039060025afa15610d295790610d1791515b610d1182876109a1565b52610b7f565b9060028101809111610ad65790610c9c565b604051903d90823e3d90fd5b836101456104ac6104a6610d4895610dec565b8101039060025afa15610d295790610d179151610d07565b50610d1790610d6f83876109a1565b51610d1182876109a1565b5050915090610c75565b5090610d8f90610994565b5190565b610d8f90610994565b60405162461bcd60e51b815260206004820152602260248201527f43616e6e6f74206275696c6420747265652066726f6d20656d70747920617272604482015261617960f01b6064820152608490fd5b604090815190610dfc838361092a565b601082526f181899199a1a9b1b9c1cb0b131b232b360811b6020830152825192610e2760608561092a565b8352604036602085013760005b60208110610e425750505090565b81811a6001600160f81b0319610e5f600483901c600f1686610b8e565b5116908260011b9183830460021484151715610ad65760001a610e828388610b8e565b536001600160f81b031990610e9a90600f1686610b8e565b5116600060018301809311610ec1576001939291610eba911a9187610b8e565b5301610e34565b634e487b7160e01b81526011600452602490fd5b91906000915b808310610ee9575050501490565b9091926000602091610efc8685876109d8565b35908181108314610f375790836101456104ac6104a6610f1b95610dec565b8101039060025afa1561017a576001600051935b019190610edb565b836101456104ac6104a6610f4a95610dec565b8101039060025afa1561017a57600160005193610f2f565b805182519081811015610f79575050505060001990565b1115610f86575050600190565b6020908101519101519081811015610fa057505060001990565b1115610fab57600190565b60009056fea26469706673582212207ef25be3f79795ccf66e11b6581126fd7d7d90e084686c20a869c9c093e07f4a64736f6c634300081b0033
Loading...
Loading
Loading...
Loading
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.