Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | Amount | ||
|---|---|---|---|---|---|---|
| 27893876 | 159 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xBbFcCf10...529797a6D The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
PlutoAttestationVerifier
Compiler Version
v0.8.30+commit.73712a01
Optimization Enabled:
No with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/Ownable.sol";
/// @title Verifier
/// @notice A contract that verifies signatures
contract Verifier is Ownable {
/// @notice Mapping of notary addresses to their validity
mapping(address => bool) public isNotary;
/// valid digests for a given address
mapping(bytes32 => address) public digests;
/// @notice Error for invalid signatures
error InvalidSignature();
/// @notice Error for invalid notary addresses
error InvalidNotary();
/// @notice Error for invalid digest
error InvalidDigest();
/// @notice Error for invalid signature length
error InvalidSignatureLength();
/// @notice Error for duplicate proof, meaning the proofs is already associated with another address
error DuplicateProof();
/// @notice Constructor configures the notary address
/// @param notaryAddress The address of the notary to add
constructor(address notaryAddress) Ownable(msg.sender) {
isNotary[notaryAddress] = true;
}
/// @notice Adds a notary
/// @param notaryAddress The address of the notary to add
function addNotary(address notaryAddress) external onlyOwner {
isNotary[notaryAddress] = true;
}
/// @notice Removes a notary
/// @param notaryAddress The address of the notary to remove
function removeNotary(address notaryAddress) external onlyOwner {
isNotary[notaryAddress] = false;
}
// Check to see that the digest is a merkle root of a keccak256 hash of a leafs = (keccak(value), keccak(manifest))
function verify_digest(bytes32 digest, bytes32 manifest, bytes32 value) internal pure returns (bool) {
bytes32 root = keccak256(abi.encodePacked(value, manifest));
return digest == root;
}
/// @notice Verifies a signature
/// @param digest The hash of the data that was signed
/// @param v The recovery id
/// @param r The R value of the signature
/// @param s The S value of the signature
/// @param signer The address that signed the data
/// @param manifest The manifest of the data
/// @param value The value of the data
function verifyNotarySignature(
bytes32 digest,
uint8 v,
bytes32 r,
bytes32 s,
address signer,
bytes32 manifest,
bytes32 value
) external returns (bool) {
// check if the signer is a notary
if (!isNotary[signer]) {
revert InvalidNotary();
}
if (!verify_digest(digest, manifest, value)) {
revert InvalidDigest();
}
// r is the x-coordinate of the curve point
// s is the y-coordinate of the curve point
// v is 27 or 28 based on the y-value being even or odd
// verify the signature
address recoveredSigner = ecrecover(digest, v, r, s);
if (recoveredSigner == address(0) || recoveredSigner != signer) {
revert InvalidSignature();
}
// TODO(WJ 2025-02-20): Should check for any sender.
if (digests[digest] == msg.sender) {
revert DuplicateProof();
}
digests[digest] = msg.sender;
return true;
}
}
contract PlutoAttestationVerifier {
struct ProofData {
string key;
string value;
}
struct AttestationInput {
string version;
string scriptRaw;
string issuedAt;
string nonce;
string sessionId;
ProofData[] data;
}
struct AttestationSignature {
bytes32 digest;
uint8 v;
bytes32 r;
bytes32 s;
address expectedSigner;
}
Verifier public verifier;
constructor(address notaryAddress) {
verifier = new Verifier(notaryAddress);
}
/**
* @dev Calculate script hash from version and script content
*/
function calculateScriptHash(string memory version, string memory scriptRaw) public pure returns (bytes32) {
return keccak256(abi.encodePacked(version, scriptRaw));
}
/**
* @dev Calculate session hash from all session components
*/
function calculateSessionHash(
string memory version,
string memory issuedAt,
string memory nonce,
string memory sessionId,
ProofData[] memory data
) public pure returns (bytes32) {
// Build the hash incrementally
bytes memory hashData = abi.encodePacked(version, issuedAt, nonce, sessionId);
for (uint256 i = 0; i < data.length; i++) {
hashData = abi.encodePacked(hashData, data[i].key, data[i].value);
}
return keccak256(hashData);
}
/**
* @dev Calculate digest from session and script hashes
*/
function calculateDigest(bytes32 sessionHash, bytes32 scriptHash) public pure returns (bytes32) {
// reportData = sessionHash + scriptHash (64 bytes)
bytes memory reportData = abi.encodePacked(sessionHash, scriptHash);
return keccak256(reportData);
}
/**
* @dev Verify complete attestation by calculating hashes and checking signature
*/
function verifyAttestation(AttestationInput memory input, AttestationSignature memory signature)
public
returns (bool)
{
// Calculate script hash
bytes32 scriptHash = calculateScriptHash(input.version, input.scriptRaw);
// Calculate session hash
bytes32 sessionHash =
calculateSessionHash(input.version, input.issuedAt, input.nonce, input.sessionId, input.data);
// Calculate digest
bytes32 digest = calculateDigest(sessionHash, scriptHash);
// Verify the digest matches
if (digest != signature.digest) {
return false;
}
// Call the signature verification contract
bool success = verifier.verifyNotarySignature(
signature.digest, signature.v, signature.r, signature.s, signature.expectedSigner, scriptHash, sessionHash
);
if (!success) {
return false;
}
return success;
}
/**
* @dev Batch verify multiple attestations
*/
function verifyMultipleAttestations(AttestationInput[] memory inputs, AttestationSignature[] memory signatures)
public
returns (bool[] memory)
{
require(inputs.length == signatures.length, "Array length mismatch");
bool[] memory results = new bool[](inputs.length);
for (uint256 i = 0; i < inputs.length; i++) {
results[i] = verifyAttestation(inputs[i], signatures[i]);
}
return results;
}
/**
* @dev Get calculated hashes for debugging
*/
function getCalculatedHashes(AttestationInput memory input)
public
pure
returns (bytes32 scriptHash, bytes32 sessionHash, bytes32 digest)
{
scriptHash = calculateScriptHash(input.version, input.scriptRaw);
sessionHash = calculateSessionHash(input.version, input.issuedAt, input.nonce, input.sessionId, input.data);
digest = calculateDigest(sessionHash, scriptHash);
}
/**
* @dev Helper function to create ProofData array from parallel arrays
*/
function createProofDataArray(string[] memory keys, string[] memory values)
public
pure
returns (ProofData[] memory)
{
require(keys.length == values.length, "Array length mismatch");
ProofData[] memory proofData = new ProofData[](keys.length);
for (uint256 i = 0; i < keys.length; i++) {
proofData[i] = ProofData(keys[i], values[i]);
}
return proofData;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false,
"libraries": {}
}Contract ABI
API[{"inputs":[{"internalType":"address","name":"notaryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"sessionHash","type":"bytes32"},{"internalType":"bytes32","name":"scriptHash","type":"bytes32"}],"name":"calculateDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"scriptRaw","type":"string"}],"name":"calculateScriptHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"issuedAt","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"string","name":"sessionId","type":"string"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"data","type":"tuple[]"}],"name":"calculateSessionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"createProofDataArray","outputs":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"","type":"tuple[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"scriptRaw","type":"string"},{"internalType":"string","name":"issuedAt","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"string","name":"sessionId","type":"string"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"data","type":"tuple[]"}],"internalType":"struct PlutoAttestationVerifier.AttestationInput","name":"input","type":"tuple"}],"name":"getCalculatedHashes","outputs":[{"internalType":"bytes32","name":"scriptHash","type":"bytes32"},{"internalType":"bytes32","name":"sessionHash","type":"bytes32"},{"internalType":"bytes32","name":"digest","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"contract Verifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"scriptRaw","type":"string"},{"internalType":"string","name":"issuedAt","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"string","name":"sessionId","type":"string"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"data","type":"tuple[]"}],"internalType":"struct PlutoAttestationVerifier.AttestationInput","name":"input","type":"tuple"},{"components":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address","name":"expectedSigner","type":"address"}],"internalType":"struct PlutoAttestationVerifier.AttestationSignature","name":"signature","type":"tuple"}],"name":"verifyAttestation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"version","type":"string"},{"internalType":"string","name":"scriptRaw","type":"string"},{"internalType":"string","name":"issuedAt","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"string","name":"sessionId","type":"string"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PlutoAttestationVerifier.ProofData[]","name":"data","type":"tuple[]"}],"internalType":"struct PlutoAttestationVerifier.AttestationInput[]","name":"inputs","type":"tuple[]"},{"components":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address","name":"expectedSigner","type":"address"}],"internalType":"struct PlutoAttestationVerifier.AttestationSignature[]","name":"signatures","type":"tuple[]"}],"name":"verifyMultipleAttestations","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
0x608060405234801561000f575f5ffd5b5060405161271738038061271783398181016040528101906100319190610111565b8060405161003e906100a6565b610048919061014b565b604051809103905ff080158015610061573d5f5f3e3d5ffd5b505f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610164565b610d0c80611a0b83390190565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100e0826100b7565b9050919050565b6100f0816100d6565b81146100fa575f5ffd5b50565b5f8151905061010b816100e7565b92915050565b5f60208284031215610126576101256100b3565b5b5f610133848285016100fd565b91505092915050565b610145816100d6565b82525050565b5f60208201905061015e5f83018461013c565b92915050565b61189a806101715f395ff3fe608060405234801561000f575f5ffd5b5060043610610086575f3560e01c80639e5d2fe5116100595780639e5d2fe514610138578063b2534ad514610168578063ec9e332d14610198578063f523285a146101ca57610086565b80632b7ac3f31461008a57806333c68ff8146100a857806366f778e6146100d85780638c27081814610108575b5f5ffd5b6100926101fa565b60405161009f919061079c565b60405180910390f35b6100c260048036038101906100bd9190610e81565b61021e565b6040516100cf9190610fb9565b60405180910390f35b6100f260048036038101906100ed9190610fd9565b61033a565b6040516100ff9190611042565b60405180910390f35b610122600480360381019061011d9190611139565b61046e565b60405161012f919061130b565b60405180910390f35b610152600480360381019061014d919061132b565b610599565b60405161015f919061143d565b60405180910390f35b610182600480360381019061017d9190611456565b610654565b60405161018f919061143d565b60405180910390f35b6101b260048036038101906101ad91906114cc565b610686565b6040516101c193929190611513565b60405180910390f35b6101e460048036038101906101df9190611548565b6106d1565b6040516101f1919061143d565b60405180910390f35b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114610264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025b906115e0565b60405180910390fd5b5f835167ffffffffffffffff8111156102805761027f6107da565b5b6040519080825280602002602001820160405280156102ae5781602001602082028036833780820191505090505b5090505f5f90505b845181101561032f576102fd8582815181106102d5576102d46115fe565b5b60200260200101518583815181106102f0576102ef6115fe565b5b602002602001015161033a565b8282815181106103105761030f6115fe565b5b60200260200101901515908115158152505080806001019150506102b6565b508091505092915050565b5f5f61034d845f01518560200151610654565b90505f610370855f01518660400151876060015188608001518960a00151610599565b90505f61037d82846106d1565b9050845f01518114610394575f9350505050610468565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631c39b7d7875f0151886020015189604001518a606001518b608001518a8a6040518863ffffffff1660e01b815260040161040d9796959493929190611649565b6020604051808303815f875af1158015610429573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044d91906116e0565b905080610460575f945050505050610468565b809450505050505b92915050565b606081518351146104b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ab906115e0565b60405180910390fd5b5f835167ffffffffffffffff8111156104d0576104cf6107da565b5b60405190808252806020026020018201604052801561050957816020015b6104f6610708565b8152602001906001900390816104ee5790505b5090505f5f90505b845181101561058e576040518060400160405280868381518110610538576105376115fe565b5b60200260200101518152602001858381518110610558576105576115fe565b5b6020026020010151815250828281518110610576576105756115fe565b5b60200260200101819052508080600101915050610511565b508091505092915050565b5f5f868686866040516020016105b29493929190611745565b60405160208183030381529060405290505f5f90505b835181101561063f57818482815181106105e5576105e46115fe565b5b60200260200101515f0151858381518110610603576106026115fe565b5b602002602001015160200151604051602001610621939291906117c6565b604051602081830303815290604052915080806001019150506105c8565b50808051906020012091505095945050505050565b5f82826040516020016106689291906117f6565b60405160208183030381529060405280519060200120905092915050565b5f5f5f61069a845f01518560200151610654565b92506106bc845f01518560400151866060015187608001518860a00151610599565b91506106c882846106d1565b90509193909250565b5f5f83836040516020016106e6929190611839565b6040516020818303038152906040529050808051906020012091505092915050565b604051806040016040528060608152602001606081525090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61076461075f61075a84610722565b610741565b610722565b9050919050565b5f6107758261074a565b9050919050565b5f6107868261076b565b9050919050565b6107968161077c565b82525050565b5f6020820190506107af5f83018461078d565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610810826107ca565b810181811067ffffffffffffffff8211171561082f5761082e6107da565b5b80604052505050565b5f6108416107b5565b905061084d8282610807565b919050565b5f67ffffffffffffffff82111561086c5761086b6107da565b5b602082029050602081019050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f67ffffffffffffffff8211156108a7576108a66107da565b5b6108b0826107ca565b9050602081019050919050565b828183375f83830152505050565b5f6108dd6108d88461088d565b610838565b9050828152602081018484840111156108f9576108f8610889565b5b6109048482856108bd565b509392505050565b5f82601f8301126109205761091f6107c6565b5b81356109308482602086016108cb565b91505092915050565b5f67ffffffffffffffff821115610953576109526107da565b5b602082029050602081019050919050565b5f6040828403121561097957610978610881565b5b6109836040610838565b90505f82013567ffffffffffffffff8111156109a2576109a1610885565b5b6109ae8482850161090c565b5f83015250602082013567ffffffffffffffff8111156109d1576109d0610885565b5b6109dd8482850161090c565b60208301525092915050565b5f6109fb6109f684610939565b610838565b90508083825260208201905060208402830185811115610a1e57610a1d61087d565b5b835b81811015610a6557803567ffffffffffffffff811115610a4357610a426107c6565b5b808601610a508982610964565b85526020850194505050602081019050610a20565b5050509392505050565b5f82601f830112610a8357610a826107c6565b5b8135610a938482602086016109e9565b91505092915050565b5f60c08284031215610ab157610ab0610881565b5b610abb60c0610838565b90505f82013567ffffffffffffffff811115610ada57610ad9610885565b5b610ae68482850161090c565b5f83015250602082013567ffffffffffffffff811115610b0957610b08610885565b5b610b158482850161090c565b602083015250604082013567ffffffffffffffff811115610b3957610b38610885565b5b610b458482850161090c565b604083015250606082013567ffffffffffffffff811115610b6957610b68610885565b5b610b758482850161090c565b606083015250608082013567ffffffffffffffff811115610b9957610b98610885565b5b610ba58482850161090c565b60808301525060a082013567ffffffffffffffff811115610bc957610bc8610885565b5b610bd584828501610a6f565b60a08301525092915050565b5f610bf3610bee84610852565b610838565b90508083825260208201905060208402830185811115610c1657610c1561087d565b5b835b81811015610c5d57803567ffffffffffffffff811115610c3b57610c3a6107c6565b5b808601610c488982610a9c565b85526020850194505050602081019050610c18565b5050509392505050565b5f82601f830112610c7b57610c7a6107c6565b5b8135610c8b848260208601610be1565b91505092915050565b5f67ffffffffffffffff821115610cae57610cad6107da565b5b602082029050602081019050919050565b5f819050919050565b610cd181610cbf565b8114610cdb575f5ffd5b50565b5f81359050610cec81610cc8565b92915050565b5f60ff82169050919050565b610d0781610cf2565b8114610d11575f5ffd5b50565b5f81359050610d2281610cfe565b92915050565b5f610d3282610722565b9050919050565b610d4281610d28565b8114610d4c575f5ffd5b50565b5f81359050610d5d81610d39565b92915050565b5f60a08284031215610d7857610d77610881565b5b610d8260a0610838565b90505f610d9184828501610cde565b5f830152506020610da484828501610d14565b6020830152506040610db884828501610cde565b6040830152506060610dcc84828501610cde565b6060830152506080610de084828501610d4f565b60808301525092915050565b5f610dfe610df984610c94565b610838565b90508083825260208201905060a08402830185811115610e2157610e2061087d565b5b835b81811015610e4a5780610e368882610d63565b84526020840193505060a081019050610e23565b5050509392505050565b5f82601f830112610e6857610e676107c6565b5b8135610e78848260208601610dec565b91505092915050565b5f5f60408385031215610e9757610e966107be565b5b5f83013567ffffffffffffffff811115610eb457610eb36107c2565b5b610ec085828601610c67565b925050602083013567ffffffffffffffff811115610ee157610ee06107c2565b5b610eed85828601610e54565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f8115159050919050565b610f3481610f20565b82525050565b5f610f458383610f2b565b60208301905092915050565b5f602082019050919050565b5f610f6782610ef7565b610f718185610f01565b9350610f7c83610f11565b805f5b83811015610fac578151610f938882610f3a565b9750610f9e83610f51565b925050600181019050610f7f565b5085935050505092915050565b5f6020820190508181035f830152610fd18184610f5d565b905092915050565b5f5f60c08385031215610fef57610fee6107be565b5b5f83013567ffffffffffffffff81111561100c5761100b6107c2565b5b61101885828601610a9c565b925050602061102985828601610d63565b9150509250929050565b61103c81610f20565b82525050565b5f6020820190506110555f830184611033565b92915050565b5f67ffffffffffffffff821115611075576110746107da565b5b602082029050602081019050919050565b5f6110986110938461105b565b610838565b905080838252602082019050602084028301858111156110bb576110ba61087d565b5b835b8181101561110257803567ffffffffffffffff8111156110e0576110df6107c6565b5b8086016110ed898261090c565b855260208501945050506020810190506110bd565b5050509392505050565b5f82601f8301126111205761111f6107c6565b5b8135611130848260208601611086565b91505092915050565b5f5f6040838503121561114f5761114e6107be565b5b5f83013567ffffffffffffffff81111561116c5761116b6107c2565b5b6111788582860161110c565b925050602083013567ffffffffffffffff811115611199576111986107c2565b5b6111a58582860161110c565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61120a826111d8565b61121481856111e2565b93506112248185602086016111f2565b61122d816107ca565b840191505092915050565b5f604083015f8301518482035f8601526112528282611200565b9150506020830151848203602086015261126c8282611200565b9150508091505092915050565b5f6112848383611238565b905092915050565b5f602082019050919050565b5f6112a2826111af565b6112ac81856111b9565b9350836020820285016112be856111c9565b805f5b858110156112f957848403895281516112da8582611279565b94506112e58361128c565b925060208a019950506001810190506112c1565b50829750879550505050505092915050565b5f6020820190508181035f8301526113238184611298565b905092915050565b5f5f5f5f5f60a08688031215611344576113436107be565b5b5f86013567ffffffffffffffff811115611361576113606107c2565b5b61136d8882890161090c565b955050602086013567ffffffffffffffff81111561138e5761138d6107c2565b5b61139a8882890161090c565b945050604086013567ffffffffffffffff8111156113bb576113ba6107c2565b5b6113c78882890161090c565b935050606086013567ffffffffffffffff8111156113e8576113e76107c2565b5b6113f48882890161090c565b925050608086013567ffffffffffffffff811115611415576114146107c2565b5b61142188828901610a6f565b9150509295509295909350565b61143781610cbf565b82525050565b5f6020820190506114505f83018461142e565b92915050565b5f5f6040838503121561146c5761146b6107be565b5b5f83013567ffffffffffffffff811115611489576114886107c2565b5b6114958582860161090c565b925050602083013567ffffffffffffffff8111156114b6576114b56107c2565b5b6114c28582860161090c565b9150509250929050565b5f602082840312156114e1576114e06107be565b5b5f82013567ffffffffffffffff8111156114fe576114fd6107c2565b5b61150a84828501610a9c565b91505092915050565b5f6060820190506115265f83018661142e565b611533602083018561142e565b611540604083018461142e565b949350505050565b5f5f6040838503121561155e5761155d6107be565b5b5f61156b85828601610cde565b925050602061157c85828601610cde565b9150509250929050565b5f82825260208201905092915050565b7f4172726179206c656e677468206d69736d6174636800000000000000000000005f82015250565b5f6115ca601583611586565b91506115d582611596565b602082019050919050565b5f6020820190508181035f8301526115f7816115be565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61163481610cf2565b82525050565b61164381610d28565b82525050565b5f60e08201905061165c5f83018a61142e565b611669602083018961162b565b611676604083018861142e565b611683606083018761142e565b611690608083018661163a565b61169d60a083018561142e565b6116aa60c083018461142e565b98975050505050505050565b6116bf81610f20565b81146116c9575f5ffd5b50565b5f815190506116da816116b6565b92915050565b5f602082840312156116f5576116f46107be565b5b5f611702848285016116cc565b91505092915050565b5f81905092915050565b5f61171f826111d8565b611729818561170b565b93506117398185602086016111f2565b80840191505092915050565b5f6117508287611715565b915061175c8286611715565b91506117688285611715565b91506117748284611715565b915081905095945050505050565b5f81519050919050565b5f81905092915050565b5f6117a082611782565b6117aa818561178c565b93506117ba8185602086016111f2565b80840191505092915050565b5f6117d18286611796565b91506117dd8285611715565b91506117e98284611715565b9150819050949350505050565b5f6118018285611715565b915061180d8284611715565b91508190509392505050565b5f819050919050565b61183361182e82610cbf565b611819565b82525050565b5f6118448285611822565b6020820191506118548284611822565b602082019150819050939250505056fea2646970667358221220a402f71b5be20fde0c68edf4ff51e9b2387f3452196d0baeb0b3e711b36cd56164736f6c634300081e0033608060405234801561000f575f5ffd5b50604051610d0c380380610d0c8339818101604052810190610031919061022b565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100999190610265565b60405180910390fd5b6100b18161010c60201b60201c565b506001805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505061027e565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101fa826101d1565b9050919050565b61020a816101f0565b8114610214575f5ffd5b50565b5f8151905061022581610201565b92915050565b5f602082840312156102405761023f6101cd565b5b5f61024d84828501610217565b91505092915050565b61025f816101f0565b82525050565b5f6020820190506102785f830184610256565b92915050565b610a818061028b5f395ff3fe608060405234801561000f575f5ffd5b5060043610610086575f3560e01c806386785a6f1161005957806386785a6f146101105780638da5cb5b1461012c578063f13eed971461014a578063f2fde38b1461017a57610086565b806301ac42931461008a5780630588565f146100ba5780631c39b7d7146100d6578063715018a614610106575b5f5ffd5b6100a4600480360381019061009f91906107c1565b610196565b6040516100b1919061082b565b60405180910390f35b6100d460048036038101906100cf919061086e565b6101c6565b005b6100f060048036038101906100eb91906108cf565b610225565b6040516100fd9190610986565b60405180910390f35b61010e6104c7565b005b61012a6004803603810190610125919061086e565b6104da565b005b610134610539565b604051610141919061082b565b60405180910390f35b610164600480360381019061015f919061086e565b610560565b6040516101719190610986565b60405180910390f35b610194600480360381019061018f919061086e565b61057d565b005b6002602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6101ce610601565b6001805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166102a6576040517f495b5d7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102b1888484610688565b6102e7576040517f3e78eb9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001898989896040515f815260200160405260405161030a94939291906109bd565b6020604051602081039080840390855afa15801561032a573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061039c57508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156103d3576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1660025f8b81526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610468576040517f5cf8829100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360025f8b81526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001915050979650505050505050565b6104cf610601565b6104d85f6106c2565b565b6104e2610601565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6001602052805f5260405f205f915054906101000a900460ff1681565b610585610601565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105f5575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016105ec919061082b565b60405180910390fd5b6105fe816106c2565b50565b610609610783565b73ffffffffffffffffffffffffffffffffffffffff16610627610539565b73ffffffffffffffffffffffffffffffffffffffff16146106865761064a610783565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161067d919061082b565b60405180910390fd5b565b5f5f828460405160200161069d929190610a20565b6040516020818303038152906040528051906020012090508085149150509392505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5ffd5b5f819050919050565b6107a08161078e565b81146107aa575f5ffd5b50565b5f813590506107bb81610797565b92915050565b5f602082840312156107d6576107d561078a565b5b5f6107e3848285016107ad565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610815826107ec565b9050919050565b6108258161080b565b82525050565b5f60208201905061083e5f83018461081c565b92915050565b61084d8161080b565b8114610857575f5ffd5b50565b5f8135905061086881610844565b92915050565b5f602082840312156108835761088261078a565b5b5f6108908482850161085a565b91505092915050565b5f60ff82169050919050565b6108ae81610899565b81146108b8575f5ffd5b50565b5f813590506108c9816108a5565b92915050565b5f5f5f5f5f5f5f60e0888a0312156108ea576108e961078a565b5b5f6108f78a828b016107ad565b97505060206109088a828b016108bb565b96505060406109198a828b016107ad565b955050606061092a8a828b016107ad565b945050608061093b8a828b0161085a565b93505060a061094c8a828b016107ad565b92505060c061095d8a828b016107ad565b91505092959891949750929550565b5f8115159050919050565b6109808161096c565b82525050565b5f6020820190506109995f830184610977565b92915050565b6109a88161078e565b82525050565b6109b781610899565b82525050565b5f6080820190506109d05f83018761099f565b6109dd60208301866109ae565b6109ea604083018561099f565b6109f7606083018461099f565b95945050505050565b5f819050919050565b610a1a610a158261078e565b610a00565b82525050565b5f610a2b8285610a09565b602082019150610a3b8284610a09565b602082019150819050939250505056fea2646970667358221220d21594a04c30b4942f3727c9eb51d9e95a5be997dd95e6e020a3eca45c96686064736f6c634300081e0033000000000000000000000000209af77dfdaba352890b0bc9b86a25be67ef436a
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610086575f3560e01c80639e5d2fe5116100595780639e5d2fe514610138578063b2534ad514610168578063ec9e332d14610198578063f523285a146101ca57610086565b80632b7ac3f31461008a57806333c68ff8146100a857806366f778e6146100d85780638c27081814610108575b5f5ffd5b6100926101fa565b60405161009f919061079c565b60405180910390f35b6100c260048036038101906100bd9190610e81565b61021e565b6040516100cf9190610fb9565b60405180910390f35b6100f260048036038101906100ed9190610fd9565b61033a565b6040516100ff9190611042565b60405180910390f35b610122600480360381019061011d9190611139565b61046e565b60405161012f919061130b565b60405180910390f35b610152600480360381019061014d919061132b565b610599565b60405161015f919061143d565b60405180910390f35b610182600480360381019061017d9190611456565b610654565b60405161018f919061143d565b60405180910390f35b6101b260048036038101906101ad91906114cc565b610686565b6040516101c193929190611513565b60405180910390f35b6101e460048036038101906101df9190611548565b6106d1565b6040516101f1919061143d565b60405180910390f35b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114610264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025b906115e0565b60405180910390fd5b5f835167ffffffffffffffff8111156102805761027f6107da565b5b6040519080825280602002602001820160405280156102ae5781602001602082028036833780820191505090505b5090505f5f90505b845181101561032f576102fd8582815181106102d5576102d46115fe565b5b60200260200101518583815181106102f0576102ef6115fe565b5b602002602001015161033a565b8282815181106103105761030f6115fe565b5b60200260200101901515908115158152505080806001019150506102b6565b508091505092915050565b5f5f61034d845f01518560200151610654565b90505f610370855f01518660400151876060015188608001518960a00151610599565b90505f61037d82846106d1565b9050845f01518114610394575f9350505050610468565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631c39b7d7875f0151886020015189604001518a606001518b608001518a8a6040518863ffffffff1660e01b815260040161040d9796959493929190611649565b6020604051808303815f875af1158015610429573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044d91906116e0565b905080610460575f945050505050610468565b809450505050505b92915050565b606081518351146104b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ab906115e0565b60405180910390fd5b5f835167ffffffffffffffff8111156104d0576104cf6107da565b5b60405190808252806020026020018201604052801561050957816020015b6104f6610708565b8152602001906001900390816104ee5790505b5090505f5f90505b845181101561058e576040518060400160405280868381518110610538576105376115fe565b5b60200260200101518152602001858381518110610558576105576115fe565b5b6020026020010151815250828281518110610576576105756115fe565b5b60200260200101819052508080600101915050610511565b508091505092915050565b5f5f868686866040516020016105b29493929190611745565b60405160208183030381529060405290505f5f90505b835181101561063f57818482815181106105e5576105e46115fe565b5b60200260200101515f0151858381518110610603576106026115fe565b5b602002602001015160200151604051602001610621939291906117c6565b604051602081830303815290604052915080806001019150506105c8565b50808051906020012091505095945050505050565b5f82826040516020016106689291906117f6565b60405160208183030381529060405280519060200120905092915050565b5f5f5f61069a845f01518560200151610654565b92506106bc845f01518560400151866060015187608001518860a00151610599565b91506106c882846106d1565b90509193909250565b5f5f83836040516020016106e6929190611839565b6040516020818303038152906040529050808051906020012091505092915050565b604051806040016040528060608152602001606081525090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61076461075f61075a84610722565b610741565b610722565b9050919050565b5f6107758261074a565b9050919050565b5f6107868261076b565b9050919050565b6107968161077c565b82525050565b5f6020820190506107af5f83018461078d565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610810826107ca565b810181811067ffffffffffffffff8211171561082f5761082e6107da565b5b80604052505050565b5f6108416107b5565b905061084d8282610807565b919050565b5f67ffffffffffffffff82111561086c5761086b6107da565b5b602082029050602081019050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f67ffffffffffffffff8211156108a7576108a66107da565b5b6108b0826107ca565b9050602081019050919050565b828183375f83830152505050565b5f6108dd6108d88461088d565b610838565b9050828152602081018484840111156108f9576108f8610889565b5b6109048482856108bd565b509392505050565b5f82601f8301126109205761091f6107c6565b5b81356109308482602086016108cb565b91505092915050565b5f67ffffffffffffffff821115610953576109526107da565b5b602082029050602081019050919050565b5f6040828403121561097957610978610881565b5b6109836040610838565b90505f82013567ffffffffffffffff8111156109a2576109a1610885565b5b6109ae8482850161090c565b5f83015250602082013567ffffffffffffffff8111156109d1576109d0610885565b5b6109dd8482850161090c565b60208301525092915050565b5f6109fb6109f684610939565b610838565b90508083825260208201905060208402830185811115610a1e57610a1d61087d565b5b835b81811015610a6557803567ffffffffffffffff811115610a4357610a426107c6565b5b808601610a508982610964565b85526020850194505050602081019050610a20565b5050509392505050565b5f82601f830112610a8357610a826107c6565b5b8135610a938482602086016109e9565b91505092915050565b5f60c08284031215610ab157610ab0610881565b5b610abb60c0610838565b90505f82013567ffffffffffffffff811115610ada57610ad9610885565b5b610ae68482850161090c565b5f83015250602082013567ffffffffffffffff811115610b0957610b08610885565b5b610b158482850161090c565b602083015250604082013567ffffffffffffffff811115610b3957610b38610885565b5b610b458482850161090c565b604083015250606082013567ffffffffffffffff811115610b6957610b68610885565b5b610b758482850161090c565b606083015250608082013567ffffffffffffffff811115610b9957610b98610885565b5b610ba58482850161090c565b60808301525060a082013567ffffffffffffffff811115610bc957610bc8610885565b5b610bd584828501610a6f565b60a08301525092915050565b5f610bf3610bee84610852565b610838565b90508083825260208201905060208402830185811115610c1657610c1561087d565b5b835b81811015610c5d57803567ffffffffffffffff811115610c3b57610c3a6107c6565b5b808601610c488982610a9c565b85526020850194505050602081019050610c18565b5050509392505050565b5f82601f830112610c7b57610c7a6107c6565b5b8135610c8b848260208601610be1565b91505092915050565b5f67ffffffffffffffff821115610cae57610cad6107da565b5b602082029050602081019050919050565b5f819050919050565b610cd181610cbf565b8114610cdb575f5ffd5b50565b5f81359050610cec81610cc8565b92915050565b5f60ff82169050919050565b610d0781610cf2565b8114610d11575f5ffd5b50565b5f81359050610d2281610cfe565b92915050565b5f610d3282610722565b9050919050565b610d4281610d28565b8114610d4c575f5ffd5b50565b5f81359050610d5d81610d39565b92915050565b5f60a08284031215610d7857610d77610881565b5b610d8260a0610838565b90505f610d9184828501610cde565b5f830152506020610da484828501610d14565b6020830152506040610db884828501610cde565b6040830152506060610dcc84828501610cde565b6060830152506080610de084828501610d4f565b60808301525092915050565b5f610dfe610df984610c94565b610838565b90508083825260208201905060a08402830185811115610e2157610e2061087d565b5b835b81811015610e4a5780610e368882610d63565b84526020840193505060a081019050610e23565b5050509392505050565b5f82601f830112610e6857610e676107c6565b5b8135610e78848260208601610dec565b91505092915050565b5f5f60408385031215610e9757610e966107be565b5b5f83013567ffffffffffffffff811115610eb457610eb36107c2565b5b610ec085828601610c67565b925050602083013567ffffffffffffffff811115610ee157610ee06107c2565b5b610eed85828601610e54565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f8115159050919050565b610f3481610f20565b82525050565b5f610f458383610f2b565b60208301905092915050565b5f602082019050919050565b5f610f6782610ef7565b610f718185610f01565b9350610f7c83610f11565b805f5b83811015610fac578151610f938882610f3a565b9750610f9e83610f51565b925050600181019050610f7f565b5085935050505092915050565b5f6020820190508181035f830152610fd18184610f5d565b905092915050565b5f5f60c08385031215610fef57610fee6107be565b5b5f83013567ffffffffffffffff81111561100c5761100b6107c2565b5b61101885828601610a9c565b925050602061102985828601610d63565b9150509250929050565b61103c81610f20565b82525050565b5f6020820190506110555f830184611033565b92915050565b5f67ffffffffffffffff821115611075576110746107da565b5b602082029050602081019050919050565b5f6110986110938461105b565b610838565b905080838252602082019050602084028301858111156110bb576110ba61087d565b5b835b8181101561110257803567ffffffffffffffff8111156110e0576110df6107c6565b5b8086016110ed898261090c565b855260208501945050506020810190506110bd565b5050509392505050565b5f82601f8301126111205761111f6107c6565b5b8135611130848260208601611086565b91505092915050565b5f5f6040838503121561114f5761114e6107be565b5b5f83013567ffffffffffffffff81111561116c5761116b6107c2565b5b6111788582860161110c565b925050602083013567ffffffffffffffff811115611199576111986107c2565b5b6111a58582860161110c565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61120a826111d8565b61121481856111e2565b93506112248185602086016111f2565b61122d816107ca565b840191505092915050565b5f604083015f8301518482035f8601526112528282611200565b9150506020830151848203602086015261126c8282611200565b9150508091505092915050565b5f6112848383611238565b905092915050565b5f602082019050919050565b5f6112a2826111af565b6112ac81856111b9565b9350836020820285016112be856111c9565b805f5b858110156112f957848403895281516112da8582611279565b94506112e58361128c565b925060208a019950506001810190506112c1565b50829750879550505050505092915050565b5f6020820190508181035f8301526113238184611298565b905092915050565b5f5f5f5f5f60a08688031215611344576113436107be565b5b5f86013567ffffffffffffffff811115611361576113606107c2565b5b61136d8882890161090c565b955050602086013567ffffffffffffffff81111561138e5761138d6107c2565b5b61139a8882890161090c565b945050604086013567ffffffffffffffff8111156113bb576113ba6107c2565b5b6113c78882890161090c565b935050606086013567ffffffffffffffff8111156113e8576113e76107c2565b5b6113f48882890161090c565b925050608086013567ffffffffffffffff811115611415576114146107c2565b5b61142188828901610a6f565b9150509295509295909350565b61143781610cbf565b82525050565b5f6020820190506114505f83018461142e565b92915050565b5f5f6040838503121561146c5761146b6107be565b5b5f83013567ffffffffffffffff811115611489576114886107c2565b5b6114958582860161090c565b925050602083013567ffffffffffffffff8111156114b6576114b56107c2565b5b6114c28582860161090c565b9150509250929050565b5f602082840312156114e1576114e06107be565b5b5f82013567ffffffffffffffff8111156114fe576114fd6107c2565b5b61150a84828501610a9c565b91505092915050565b5f6060820190506115265f83018661142e565b611533602083018561142e565b611540604083018461142e565b949350505050565b5f5f6040838503121561155e5761155d6107be565b5b5f61156b85828601610cde565b925050602061157c85828601610cde565b9150509250929050565b5f82825260208201905092915050565b7f4172726179206c656e677468206d69736d6174636800000000000000000000005f82015250565b5f6115ca601583611586565b91506115d582611596565b602082019050919050565b5f6020820190508181035f8301526115f7816115be565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61163481610cf2565b82525050565b61164381610d28565b82525050565b5f60e08201905061165c5f83018a61142e565b611669602083018961162b565b611676604083018861142e565b611683606083018761142e565b611690608083018661163a565b61169d60a083018561142e565b6116aa60c083018461142e565b98975050505050505050565b6116bf81610f20565b81146116c9575f5ffd5b50565b5f815190506116da816116b6565b92915050565b5f602082840312156116f5576116f46107be565b5b5f611702848285016116cc565b91505092915050565b5f81905092915050565b5f61171f826111d8565b611729818561170b565b93506117398185602086016111f2565b80840191505092915050565b5f6117508287611715565b915061175c8286611715565b91506117688285611715565b91506117748284611715565b915081905095945050505050565b5f81519050919050565b5f81905092915050565b5f6117a082611782565b6117aa818561178c565b93506117ba8185602086016111f2565b80840191505092915050565b5f6117d18286611796565b91506117dd8285611715565b91506117e98284611715565b9150819050949350505050565b5f6118018285611715565b915061180d8284611715565b91508190509392505050565b5f819050919050565b61183361182e82610cbf565b611819565b82525050565b5f6118448285611822565b6020820191506118548284611822565b602082019150819050939250505056fea2646970667358221220a402f71b5be20fde0c68edf4ff51e9b2387f3452196d0baeb0b3e711b36cd56164736f6c634300081e0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.