Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x79e4D1B8...5C66F373E The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Yaru
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 10000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { IYaru } from "./interfaces/IYaru.sol"; import { IHashi, IAdapter } from "./interfaces/IHashi.sol"; import { Message } from "./interfaces/IMessage.sol"; import { MessageIdCalculator } from "./utils/MessageIdCalculator.sol"; import { MessageHashCalculator } from "./utils/MessageHashCalculator.sol"; import { IJushin } from "./interfaces/IJushin.sol"; contract Yaru is IYaru, MessageIdCalculator, MessageHashCalculator, ReentrancyGuard { address public immutable HASHI; address public immutable YAHO; uint256 public immutable SOURCE_CHAIN_ID; mapping(uint256 => bool) public executed; constructor(address hashi, address yaho_, uint256 sourceChainId) { HASHI = hashi; YAHO = yaho_; SOURCE_CHAIN_ID = sourceChainId; } /// @inheritdoc IYaru function executeMessages(Message[] calldata messages) external nonReentrant returns (bytes[] memory) { bytes[] memory returnDatas = new bytes[](messages.length); for (uint256 i = 0; i < messages.length; ) { Message memory message = messages[i]; bytes32 messageHash = calculateMessageHash(message); uint256 messageId = calculateMessageId(SOURCE_CHAIN_ID, YAHO, messageHash); if (message.targetChainId != block.chainid) revert InvalidToChainId(message.targetChainId, block.chainid); if (executed[messageId]) revert MessageIdAlreadyExecuted(messageId); executed[messageId] = true; if ( !IHashi(HASHI).checkHashWithThresholdFromAdapters( SOURCE_CHAIN_ID, messageId, message.threshold, message.adapters ) ) revert ThresholdNotMet(); try IJushin(message.receiver).onMessage( messageId, SOURCE_CHAIN_ID, message.sender, message.threshold, message.adapters, message.data ) returns (bytes memory returnData) { returnDatas[i] = returnData; } catch { revert CallFailed(); } emit MessageExecuted(messageId, message); unchecked { ++i; } } return returnDatas; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; /** * @title IAdapter */ interface IAdapter { error ConflictingBlockHeader(uint256 blockNumber, bytes32 blockHash, bytes32 storedBlockHash); error InvalidBlockHeaderRLP(); /** * @dev Emitted when a hash is stored. * @param id - The ID of the stored hash. * @param hash - The stored hash as bytes32 values. */ event HashStored(uint256 indexed id, bytes32 indexed hash); /** * @dev Returns the hash for a given ID. * @param domain - Identifier for the domain to query. * @param id - Identifier for the ID to query. * @return hash Bytes32 hash for the given ID on the given domain. * @notice MUST return bytes32(0) if the hash is not present. */ function getHash(uint256 domain, uint256 id) external view returns (bytes32 hash); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import { IAdapter } from "./IAdapter.sol"; /** * @title IHashi */ interface IHashi { error AdaptersDisagree(IAdapter adapterOne, IAdapter adapterTwo); error HashNotAvailableInAdapter(IAdapter adapter); error InvalidThreshold(uint256 threshold, uint256 maxThreshold); error NoAdaptersGiven(); /** * @dev Checks whether the threshold is reached for a message given a set of adapters. * @param domain - ID of the domain to query. * @param id - ID for which to return hash. * @param threshold - Threshold to use. * @param adapters - Array of addresses for the adapters to query. * @notice If the threshold is 1, it will always return true. * @return result A boolean indicating if a threshold for a given message has been reached. */ function checkHashWithThresholdFromAdapters( uint256 domain, uint256 id, uint256 threshold, IAdapter[] calldata adapters ) external view returns (bool); /** * @dev Returns the hash stored by a given adapter for a given ID. * @param domain - ID of the domain to query. * @param id - ID for which to return a hash. * @param adapter - Address of the adapter to query. * @return hash stored by the given adapter for the given ID. */ function getHashFromAdapter(uint256 domain, uint256 id, IAdapter adapter) external view returns (bytes32); /** * @dev Returns the hashes for a given ID stored by a given set of adapters. * @param domain - The ID of the domain to query. * @param id - The ID for which to return hashes. * @param adapters - An array of addresses for the adapters to query. * @return hashes An array of hashes stored by the given adapters for the specified ID. */ function getHashesFromAdapters( uint256 domain, uint256 id, IAdapter[] calldata adapters ) external view returns (bytes32[] memory); /** * @dev Returns the hash unanimously agreed upon by a given set of adapters. * @param domain - The ID of the domain to query. * @param id - The ID for which to return a hash. * @param adapters - An array of addresses for the adapters to query. * @return hash agreed on by the given set of adapters. * @notice MUST revert if adapters disagree on the hash or if an adapter does not report. */ function getHash(uint256 domain, uint256 id, IAdapter[] calldata adapters) external view returns (bytes32); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import { IAdapter } from "./IAdapter.sol"; /** * @title IJushin */ interface IJushin { /** * @dev Handles the incoming message from a specified chain. * @param messageId - The unique identifier of the message. * @param sourceChainId - The ID of the origin chain from which the message originates. * @param sender - The address of the sender of the message on the origin chain. * @param threshold - The minimum number of adapters required to have stored the same message. * @param data - The data contained in the message, in bytes. * @param adapters - An array of `IAdapter` contracts. * @return result bytes at the user's choice */ function onMessage( uint256 messageId, uint256 sourceChainId, address sender, uint256 threshold, IAdapter[] calldata adapters, bytes calldata data ) external returns (bytes memory); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import { IReporter } from "./IReporter.sol"; import { IAdapter } from "./IAdapter.sol"; struct Message { uint256 nonce; uint256 targetChainId; uint256 threshold; address sender; address receiver; bytes data; IReporter[] reporters; IAdapter[] adapters; }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import { Message } from "./IMessage.sol"; /** * @title IMessageHashCalculator */ interface IMessageHashCalculator { /** * @dev Calculates and returns the hash of a given message. * @param message - The `Message` structure containing various fields to be hashed. * @return hash The keccak256 hash of the message, represented as a 32-byte hexadecimal string. */ function calculateMessageHash(Message memory message) external pure returns (bytes32); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; /** * @title IMessageIdCalculator */ interface IMessageIdCalculator { /** * @dev Calculates and returns a unique identifier (ID) for a message. * * @param sourceChainId - The ID of the chain from which the message originates. * @param dispatcherAddress - The address of the dispatcher sending the message. * @param messageHash - The keccak256 hash of the message, represented as a 32-byte hexadecimal string. * @return messageId The unique identifier for the message, calculated based on the input parameters. */ function calculateMessageId( uint256 sourceChainId, address dispatcherAddress, bytes32 messageHash ) external pure returns (uint256); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import { IAdapter } from "./IAdapter.sol"; interface IReporter { error NotYaho(address sender, address expectedYaho); /** * @dev Emitted when a block is dispatched to another chain. * @param targetChainId - The target chain's identifier associated with the dispatched block. * @param adapter - The adapter address associated with the dispatched block. * @param blockNumber - The block number associated with the dispatched block. * @param blockHeader - The dispatched block header as a bytes32 value. */ event BlockDispatched( uint256 indexed targetChainId, IAdapter adapter, uint256 indexed blockNumber, bytes32 blockHeader ); /** * @dev Emitted when a message is dispatched to another chain. * @param targetChainId - The target chain's identifier associated with the dispatched message. * @param adapter - The adapter address associated with the dispatched message. * @param messageId - The message identifier associated with the dispatched message. * @param messageHash - The dispatched message hash as a bytes32 value. */ event MessageDispatched( uint256 indexed targetChainId, IAdapter adapter, uint256 indexed messageId, bytes32 messageHash ); /** * @dev Dispatches blocks to a given adapter on the target chaib. * @param targetChainId - The target chain's Uint256 identifier. * @param adapter - The adapter instance to use. * @param blockNumbers - An array of Uint256 block numbers to dispatch. * @notice blockNumbers must include block numbers that are greater than or equal to (currentBlock - 256) due to EVM limitations. * @return result - The result returned by the adapter as bytes. */ function dispatchBlocks( uint256 targetChainId, IAdapter adapter, uint256[] memory blockNumbers ) external payable returns (bytes32); /** * @dev Dispatches messages to a target chain using the specified adapter. * @param targetChainId - The target chain's Uint256 identifier. * @param adapter - The adapter instance to use. * @param messageIds - An array of Uint256 message identifiers. * @param messageHashes - An array of bytes32 message hashes. * @notice This function can be called only by Yaho * @return result - The result returned by the adapter as bytes. */ function dispatchMessages( uint256 targetChainId, IAdapter adapter, uint256[] memory messageIds, bytes32[] memory messageHashes ) external payable returns (bytes32); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.0; import { Message } from "./IMessage.sol"; import { IMessageHashCalculator } from "./IMessageHashCalculator.sol"; import { IMessageIdCalculator } from "./IMessageIdCalculator.sol"; /** * @title IYaru */ interface IYaru is IMessageHashCalculator, IMessageIdCalculator { error CallFailed(); error InvalidToChainId(uint256 chainId, uint256 expectedChainId); error MessageIdAlreadyExecuted(uint256 messageId); error ThresholdNotMet(); /** * @dev Emitted when a message is executed with its associated message ID and message object. * @param messageId - The message ID associated with the executed message. * @param message - The message object associated with this event. */ event MessageExecuted(uint256 indexed messageId, Message message); /** * @dev Executes a batch of messages and returns the results if the threshold for a single message has been reached * @param messages - An array of `Message` structures * @return result An array of byte arrays, where each byte array is the result of executing a respective message from the input. */ function executeMessages(Message[] calldata messages) external returns (bytes[] memory); }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; import { IMessageHashCalculator } from "../interfaces/IMessageHashCalculator.sol"; import { Message } from "../interfaces/IMessage.sol"; contract MessageHashCalculator is IMessageHashCalculator { /// @inheritdoc IMessageHashCalculator function calculateMessageHash(Message memory message) public pure returns (bytes32) { return keccak256(abi.encode(message)); } }
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity ^0.8.20; import { IMessageIdCalculator } from "../interfaces/IMessageIdCalculator.sol"; contract MessageIdCalculator is IMessageIdCalculator { /// @inheritdoc IMessageIdCalculator function calculateMessageId( uint256 sourceChainId, address dispatcherAddress, bytes32 messageHash ) public pure returns (uint256) { return uint256(keccak256(abi.encode(sourceChainId, dispatcherAddress, messageHash))); } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 10000 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"hashi","type":"address"},{"internalType":"address","name":"yaho_","type":"address"},{"internalType":"uint256","name":"sourceChainId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CallFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"expectedChainId","type":"uint256"}],"name":"InvalidToChainId","type":"error"},{"inputs":[{"internalType":"uint256","name":"messageId","type":"uint256"}],"name":"MessageIdAlreadyExecuted","type":"error"},{"inputs":[],"name":"ThresholdNotMet","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"messageId","type":"uint256"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"targetChainId","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"contract IReporter[]","name":"reporters","type":"address[]"},{"internalType":"contract IAdapter[]","name":"adapters","type":"address[]"}],"indexed":false,"internalType":"struct Message","name":"message","type":"tuple"}],"name":"MessageExecuted","type":"event"},{"inputs":[],"name":"HASHI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SOURCE_CHAIN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YAHO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"targetChainId","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"contract IReporter[]","name":"reporters","type":"address[]"},{"internalType":"contract IAdapter[]","name":"adapters","type":"address[]"}],"internalType":"struct Message","name":"message","type":"tuple"}],"name":"calculateMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"sourceChainId","type":"uint256"},{"internalType":"address","name":"dispatcherAddress","type":"address"},{"internalType":"bytes32","name":"messageHash","type":"bytes32"}],"name":"calculateMessageId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"targetChainId","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"contract IReporter[]","name":"reporters","type":"address[]"},{"internalType":"contract IAdapter[]","name":"adapters","type":"address[]"}],"internalType":"struct Message[]","name":"messages","type":"tuple[]"}],"name":"executeMessages","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"executed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x608080604052600436101561001357600080fd5b60003560e01c908163036a7954146102055750806331fa321b146101c2578063523d415a14610171578063543836b11461012e57806374be2150146100f35780639e83334b146100a25763d3ecebd71461006c57600080fd5b3461009d57602060031936011261009d576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b3461009d57600060031936011261009d57602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000dbdf80c87f414fac8342e04d870764197bd3bac7168152f35b3461009d57600060031936011261009d5760206040517f0000000000000000000000000000000000000000000000000000000000066eee8152f35b3461009d57602060031936011261009d5760043567ffffffffffffffff811161009d57610169610164602092369060040161092c565b610c6e565b604051908152f35b3461009d57600060031936011261009d57602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a86bc62ac53dc86687ab6c15fdebc71ad51fb615168152f35b3461009d57606060031936011261009d5760243573ffffffffffffffffffffffffffffffffffffffff8116810361009d5761016960209160443590600435610c97565b3461009d57602060031936011261009d5767ffffffffffffffff6004351161009d5736602360043501121561009d5767ffffffffffffffff600435600401351161009d573660246004356004013560051b60043501011161009d576002600054146107e157600260005561027e60043560040135610914565b61028b60405191826108a6565b600480350135808252601f19906102a190610914565b0160005b8181106107d0578260005b600435600401358110610343575060018060005560405190602082016020835283518091526040830190602060408260051b8601019501916000905b8282106102f95785870386f35b90919293602080610333897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a869c030186528851610860565b98960194939190910191016102ec565b60248160051b6004350101357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedd60043536030181121561009d5761038f9060243691600435010161092c565b906103e361039c83610c6e565b7f000000000000000000000000dbdf80c87f414fac8342e04d870764197bd3bac77f0000000000000000000000000000000000000000000000000000000000066eee610c97565b6020830151468103610799575080600052600160205260ff6040600020541661076857806000526001602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556104ba6020604085015160e08601519060405193849283927fb0bb1be40000000000000000000000000000000000000000000000000000000084527f0000000000000000000000000000000000000000000000000000000000066eee60048501528760248501526044840152608060648401526084830190610b12565b038173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a86bc62ac53dc86687ab6c15fdebc71ad51fb615165afa90811561075c57600091610721575b50156106f75782600073ffffffffffffffffffffffffffffffffffffffff60806105cf9601511673ffffffffffffffffffffffffffffffffffffffff6060840151169060408401518360e0860151936105e160a08801516040519b8c97889687957fd496af240000000000000000000000000000000000000000000000000000000087528d60048801527f0000000000000000000000000000000000000000000000000000000000066eee60248801526044870152606486015260c0608486015260c4850190610b12565b906003198483030160a4850152610860565b03925af160009481610670575b5061061d5760046040517f3204506f000000000000000000000000000000000000000000000000000000008152fd5b6106677fdd1bdfea38460565f157126e887f629eef09468d58dcb316e9b432eaabe1463a9160019561064f8689610b5c565b5261065a8588610b5c565b5060405191829182610b9f565b0390a2016102b0565b9094503d90816000823e61068482826108a6565b602081838101031261009d5780519067ffffffffffffffff821161009d57828101601f83830101121561009d5781810151906106bf826108f8565b936106cd60405195866108a6565b828552810160208385840101011161009d5760206106f09381860192010161083d565b93866105ee565b60046040517f59fa4a93000000000000000000000000000000000000000000000000000000008152fd5b90506020813d602011610754575b8161073c602093836108a6565b8101031261009d5751801515810361009d5785610504565b3d915061072f565b6040513d6000823e3d90fd5b602490604051907f5919bfee0000000000000000000000000000000000000000000000000000000082526004820152fd5b604490604051907f841022d50000000000000000000000000000000000000000000000000000000082526004820152466024820152fd5b8060606020809386010152016102a5565b807f08c379a0000000000000000000000000000000000000000000000000000000006064925260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b60005b8381106108505750506000910152565b8181015183820152602001610840565b90601f19601f60209361087e8151809281875287808801910161083d565b0116010190565b359073ffffffffffffffffffffffffffffffffffffffff8216820361009d57565b90601f601f19910116810190811067ffffffffffffffff8211176108c957604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116108c957601f01601f191660200190565b67ffffffffffffffff81116108c95760051b60200190565b9190610100808483031261009d5760409182519182019067ffffffffffffffff91838110838211176108c95784528295803584526020928382013584860152858201358686015261097f60608301610885565b606086015261099060808301610885565b608086015260a082013581811161009d5782019183601f8401121561009d5782356109ba816108f8565b906109c7895192836108a6565b8082528587828701011161009d5780878096018684013760009485918301015260a087015260c0810135828111610b0e57810184601f82011215610b0e57803590610a1182610914565b91610a1e8a5193846108a6565b808352878084019160051b83010191878311610b0a578801905b828210610ada5750505060c087015260e0810135918211610acf57019082601f83011215610ad757813591610a78610a6f84610914565b975197886108a6565b828752848088019360051b820101938411610ad3578401915b838310610aa357505050505060e00152565b823573ffffffffffffffffffffffffffffffffffffffff81168103610acf578152918401918401610a91565b8280fd5b5080fd5b80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168103610b06578152908801908801610a38565b8780fd5b8680fd5b8380fd5b90815180825260208080930193019160005b828110610b32575050505090565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101610b24565b8051821015610b705760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91909160208082528351818301528084015160408301526040840151606083015273ffffffffffffffffffffffffffffffffffffffff918260608601511660808201528260808601511660a082015260a0850151610c0b610100918260c0850152610120840190610860565b9360c087015194601f1994858583030160e08601528080885193848152019701926000905b838210610c5557505050505060e0610c52959601519282850301910152610b12565b90565b8451811689529782019793820193600190910190610c30565b604051610c9181610c83602082019485610b9f565b03601f1981018352826108a6565b51902090565b9173ffffffffffffffffffffffffffffffffffffffff60405192602084019485521660408301526060820152606081526080810181811067ffffffffffffffff8211176108c9576040525190209056fea26469706673582212204f7e497a7e720881cd1e95fcc5a109ad35b6ccb9d33349769d6b47dec07bfadb64736f6c63430008140033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.