Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 43 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Publish Day Esr | 7695826 | 6 hrs ago | IN | 0 ETH | 0.00006614 | ||||
Publish Day Esr | 7689342 | 30 hrs ago | IN | 0 ETH | 0.00006662 | ||||
Publish Day Esr | 7682773 | 2 days ago | IN | 0 ETH | 0.00007121 | ||||
Publish Day Esr | 7676047 | 3 days ago | IN | 0 ETH | 0.00006372 | ||||
Publish Day Esr | 7669943 | 4 days ago | IN | 0 ETH | 0.00006517 | ||||
Publish Day Esr | 7662046 | 5 days ago | IN | 0 ETH | 0.00020352 | ||||
Publish Day Esr | 7655150 | 6 days ago | IN | 0 ETH | 0.00005909 | ||||
Publish Day Esr | 7648376 | 7 days ago | IN | 0 ETH | 0.00007223 | ||||
Publish Day Esr | 7641659 | 8 days ago | IN | 0 ETH | 0.0000668 | ||||
Publish Day Esr | 7634783 | 9 days ago | IN | 0 ETH | 0.00006358 | ||||
Publish Day Esr | 7627836 | 10 days ago | IN | 0 ETH | 0.00006019 | ||||
Publish Day Esr | 7620883 | 11 days ago | IN | 0 ETH | 0.0000654 | ||||
Publish Day Esr | 7613906 | 12 days ago | IN | 0 ETH | 0.00006337 | ||||
Publish Day Esr | 7606790 | 13 days ago | IN | 0 ETH | 0.00006157 | ||||
Publish Day Esr | 7599630 | 14 days ago | IN | 0 ETH | 0.00006844 | ||||
Publish Day Esr | 7592448 | 15 days ago | IN | 0 ETH | 0.00007671 | ||||
Publish Day Esr | 7585273 | 16 days ago | IN | 0 ETH | 0.00006453 | ||||
Publish Day Esr | 7578258 | 17 days ago | IN | 0 ETH | 0.00006395 | ||||
Publish Day Esr | 7571371 | 18 days ago | IN | 0 ETH | 0.00006487 | ||||
Publish Day Esr | 7564821 | 19 days ago | IN | 0 ETH | 0.00014312 | ||||
Publish Day Esr | 7557566 | 20 days ago | IN | 0 ETH | 0.00012438 | ||||
Publish Day Esr | 7550604 | 21 days ago | IN | 0 ETH | 0.00006079 | ||||
Publish Day Esr | 7543566 | 22 days ago | IN | 0 ETH | 0.00008431 | ||||
Publish Day Esr | 7536386 | 23 days ago | IN | 0 ETH | 0.00006599 | ||||
Publish Day Esr | 7529202 | 24 days ago | IN | 0 ETH | 0.00000673 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ESR
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes 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 {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; contract ESR is Ownable2Step { // constants string public constant name = "Treehouse Ethereum Staking Rate - Spot"; string public constant symbol = "tESR"; // address public immutable owner; uint256 public immutable decimals = 9; uint256 public immutable ESR_PUBLISH_FREQUENCY = 1 days; int256 private latestEsr = 0; uint256 private latestEsrObservedAt = 0; uint256 private esrStartDay = 0; constructor() Ownable(msg.sender) { // owner = msg.sender; esrStartDay = getStartOfDayTimestamp(block.timestamp); } // errors error Unauthorised(); error InvalidTimestamp(); error NotHistoricalData(); error ArrayLengthMismatch(); error MissingEsrData(uint256 date); // events event EsrUpdate(uint256 indexed observationDate, address publisher, int256 esr); /// @dev Convert any timestamp to SOD timestamp as date representation function getStartOfDayTimestamp(uint256 timestamp) private pure returns (uint256 sodTimestamp) { return (timestamp / ESR_PUBLISH_FREQUENCY) * ESR_PUBLISH_FREQUENCY; } // define the mapping from date to ESR mapping(uint256 timestamp => int256 esr) private esrFromDate; function checkAndUpdateEsrStartDay(uint256 timestamp) private { if (timestamp < esrStartDay) { esrStartDay = timestamp; } } // define write functions /// @notice Publish latest ESR value function publishDayEsr(uint256 timestamp, int256 esr) public onlyOwner { // data validation // get SOD timestamp timestamp = getStartOfDayTimestamp(timestamp); // require( // latestEsrObservedAt == 0 || timestamp == latestEsrObservedAt + ESR_PUBLISH_FREQUENCY, // "Submitted timestamp/date is not valid" // ); if (latestEsrObservedAt != 0 && timestamp != latestEsrObservedAt + ESR_PUBLISH_FREQUENCY) { revert InvalidTimestamp(); } latestEsr = esr; latestEsrObservedAt = timestamp; // update mapping esrFromDate[timestamp] = esr; // check and update esrStartDay checkAndUpdateEsrStartDay(timestamp); // emit event emit EsrUpdate(timestamp, msg.sender, esr); } /// @notice Publish historical ESR for a day // function publishDayEsr(uint256 timestamp, int256 esr, bool isHistoricalData) public onlyOwner { // if (isHistoricalData) { // // data validation // // get SOD timestamp // timestamp = getStartOfDayTimestamp(timestamp); // // update mapping for historical data // esrFromDate[timestamp] = esr; // // check and update esrStartDay // checkAndUpdateEsrStartDay(timestamp); // } else { // revert NotHistoricalData(); // } // } /// @notice Publish historical ESR for a number of days in batch function publishDayEsr(uint256[] calldata timestamps, int256[] calldata esrs, bool isHistoricalData) public onlyOwner { if (isHistoricalData) { // data validation // require(timestamps.length == esrs.length, "Submitted times and esr array lengths don't match"); if (timestamps.length != esrs.length) revert ArrayLengthMismatch(); // update mapping for historical data for (uint256 i = 0; i < timestamps.length; i++) { uint256 timestamp = getStartOfDayTimestamp(timestamps[i]); // get SOD timestamp esrFromDate[timestamp] = esrs[i]; // check and update esrStartDay checkAndUpdateEsrStartDay(timestamp); } } else { revert NotHistoricalData(); } } // define read functions /// @notice ESR for the latest observation date available function getLatestEsr() public view returns (int256 esr) { return latestEsr; } /// @notice ESR for the latest observation date available function getRollingAvgEsrForNdays(uint256 numOfDays) public view returns (int256 esr) { uint256 _date = 0; int256 _esr = 0; int256 _sumOfEsr = 0; for (uint256 i = 1; i <= numOfDays; i++) { _date = getStartOfDayTimestamp(block.timestamp) - i * ESR_PUBLISH_FREQUENCY; _esr = esrFromDate[_date]; if (_esr == 0) revert MissingEsrData(_date); _sumOfEsr += _esr; } return _sumOfEsr / int256(numOfDays); } function getEarliestEsrDate() public view returns (uint256 earliestEsrObservationDate) { return esrStartDay; } function getLatestEsrObservationDate() public view returns (uint256 latestEsrObservationDate) { return latestEsrObservedAt; } function getDayEsr(uint256 timestamp) public view returns (uint256 observationDate, int256 esr) { // check if timestamp is SOD time timestamp = getStartOfDayTimestamp(timestamp); // get SOD timestamp return (timestamp, esrFromDate[timestamp]); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol) pragma solidity ^0.8.20; import {Ownable} from "./Ownable.sol"; /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This extension of the {Ownable} contract includes a two-step mechanism to transfer * ownership, where the new owner must call {acceptOwnership} in order to replace the * old one. This can help prevent common mistakes, such as transfers of ownership to * incorrect accounts, or to contracts that are unable to interact with the * permission system. * * The initial owner is specified at deployment time in the constructor for `Ownable`. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. * * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer. */ function transferOwnership(address newOwner) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); if (pendingOwner() != sender) { revert OwnableUnauthorizedAccount(sender); } _transferOwnership(sender); } }
// 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": [ "forge-std/=lib/forge-std/src/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"InvalidTimestamp","type":"error"},{"inputs":[{"internalType":"uint256","name":"date","type":"uint256"}],"name":"MissingEsrData","type":"error"},{"inputs":[],"name":"NotHistoricalData","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"Unauthorised","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"observationDate","type":"uint256"},{"indexed":false,"internalType":"address","name":"publisher","type":"address"},{"indexed":false,"internalType":"int256","name":"esr","type":"int256"}],"name":"EsrUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ESR_PUBLISH_FREQUENCY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getDayEsr","outputs":[{"internalType":"uint256","name":"observationDate","type":"uint256"},{"internalType":"int256","name":"esr","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEarliestEsrDate","outputs":[{"internalType":"uint256","name":"earliestEsrObservationDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestEsr","outputs":[{"internalType":"int256","name":"esr","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestEsrObservationDate","outputs":[{"internalType":"uint256","name":"latestEsrObservationDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numOfDays","type":"uint256"}],"name":"getRollingAvgEsrForNdays","outputs":[{"internalType":"int256","name":"esr","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"int256[]","name":"esrs","type":"int256[]"},{"internalType":"bool","name":"isHistoricalData","type":"bool"}],"name":"publishDayEsr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"int256","name":"esr","type":"int256"}],"name":"publishDayEsr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405260096080526201518060a0525f60028190556003819055600455348015610029575f5ffd5b50338061004f57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100588161006a565b5061006242610086565b600455610136565b600180546001600160a01b0319169055610083816100a5565b50565b60a0515f9061009581846100f4565b61009f9190610113565b92915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8261010e57634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761009f57634e487b7160e01b5f52601160045260245ffd5b60805160a05161095761016c5f395f81816101aa0152818161036f0152818161048e01526105f101525f61013701526109575ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c80638085789f11610093578063ac11607311610063578063ac1160731461021b578063b3e6638b14610243578063e30c39781461024b578063f2fde38b1461025c575f5ffd5b80638085789f146101a55780638da5cb5b146101cc57806395d89b41146101f0578063a60d393c14610213575f5ffd5b80636fb88586116100ce5780636fb885861461017a578063715018a61461018257806379ba50971461018a5780637bddedca14610192575f5ffd5b806306fdde03146100ff5780631459f1011461011d578063313ce56714610132578063489fb55714610167575b5f5ffd5b61010761026f565b604051610114919061069c565b60405180910390f35b61013061012b366004610719565b61028b565b005b6101597f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610114565b6101306101753660046107a0565b61034d565b600454610159565b61013061041f565b610130610432565b6101596101a03660046107c0565b61047b565b6101597f000000000000000000000000000000000000000000000000000000000000000081565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610114565b610107604051806040016040528060048152602001633a22a9a960e11b81525081565b600354610159565b61022e6102293660046107c0565b61052f565b60408051928352602083019190915201610114565b600254610159565b6001546001600160a01b03166101d8565b61013061026a3660046107d7565b610552565b6040518060600160405280602681526020016108fc6026913981565b6102936105c2565b801561032d578382146102b95760405163512509d360e11b815260040160405180910390fd5b5f5b84811015610327575f6102e58787848181106102d9576102d9610804565b905060200201356105ee565b90508484838181106102f9576102f9610804565b9050602002013560055f8381526020019081526020015f208190555061031e8161062a565b506001016102bb565b50610346565b604051638bb3ef8f60e01b815260040160405180910390fd5b5050505050565b6103556105c2565b61035e826105ee565b91506003545f1415801561039f57507f000000000000000000000000000000000000000000000000000000000000000060035461039b919061082c565b8214155b156103bd5760405163b7d0949760e01b815260040160405180910390fd5b600281905560038290555f8281526005602052604090208190556103e08261062a565b604080513381526020810183905283917f463ab7d735a9033f30ca849cbe589ceb85ff7b89f43f3d52f389fc46785cae8c910160405180910390a25050565b6104276105c2565b6104305f610639565b565b60015433906001600160a01b0316811461046f5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b61047881610639565b50565b5f80808060015b85811161051b576104b37f00000000000000000000000000000000000000000000000000000000000000008261083f565b6104bc426105ee565b6104c69190610856565b5f818152600560205260408120549195509093508390036104fd57604051639a1c663360e01b815260048101859052602401610466565b6105078383610869565b91508061051381610890565b915050610482565b5061052685826108bc565b95945050505050565b5f5f61053a836105ee565b5f818152600560205260409020549094909350915050565b61055a6105c2565b600180546001600160a01b0383166001600160a01b0319909116811790915561058a5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b031633146104305760405163118cdaa760e01b8152336004820152602401610466565b5f7f000000000000000000000000000000000000000000000000000000000000000061061a81846108e8565b610624919061083f565b92915050565b60045481101561047857600455565b600180546001600160a01b0319169055610478815f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126106e1575f5ffd5b50813567ffffffffffffffff8111156106f8575f5ffd5b6020830191508360208260051b8501011115610712575f5ffd5b9250929050565b5f5f5f5f5f6060868803121561072d575f5ffd5b853567ffffffffffffffff811115610743575f5ffd5b61074f888289016106d1565b909650945050602086013567ffffffffffffffff81111561076e575f5ffd5b61077a888289016106d1565b90945092505060408601358015158114610792575f5ffd5b809150509295509295909350565b5f5f604083850312156107b1575f5ffd5b50508035926020909101359150565b5f602082840312156107d0575f5ffd5b5035919050565b5f602082840312156107e7575f5ffd5b81356001600160a01b03811681146107fd575f5ffd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561062457610624610818565b808202811582820484141761062457610624610818565b8181038181111561062457610624610818565b8082018281125f83128015821682158216171561088857610888610818565b505092915050565b5f600182016108a1576108a1610818565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f826108ca576108ca6108a8565b600160ff1b82145f19841416156108e3576108e3610818565b500590565b5f826108f6576108f66108a8565b50049056fe54726565686f75736520457468657265756d205374616b696e672052617465202d2053706f74a2646970667358221220bfb72551b0473bfcf77b6a6ba75343fecf99102551cc19eac89a90958bee89f764736f6c634300081c0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c80638085789f11610093578063ac11607311610063578063ac1160731461021b578063b3e6638b14610243578063e30c39781461024b578063f2fde38b1461025c575f5ffd5b80638085789f146101a55780638da5cb5b146101cc57806395d89b41146101f0578063a60d393c14610213575f5ffd5b80636fb88586116100ce5780636fb885861461017a578063715018a61461018257806379ba50971461018a5780637bddedca14610192575f5ffd5b806306fdde03146100ff5780631459f1011461011d578063313ce56714610132578063489fb55714610167575b5f5ffd5b61010761026f565b604051610114919061069c565b60405180910390f35b61013061012b366004610719565b61028b565b005b6101597f000000000000000000000000000000000000000000000000000000000000000981565b604051908152602001610114565b6101306101753660046107a0565b61034d565b600454610159565b61013061041f565b610130610432565b6101596101a03660046107c0565b61047b565b6101597f000000000000000000000000000000000000000000000000000000000001518081565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610114565b610107604051806040016040528060048152602001633a22a9a960e11b81525081565b600354610159565b61022e6102293660046107c0565b61052f565b60408051928352602083019190915201610114565b600254610159565b6001546001600160a01b03166101d8565b61013061026a3660046107d7565b610552565b6040518060600160405280602681526020016108fc6026913981565b6102936105c2565b801561032d578382146102b95760405163512509d360e11b815260040160405180910390fd5b5f5b84811015610327575f6102e58787848181106102d9576102d9610804565b905060200201356105ee565b90508484838181106102f9576102f9610804565b9050602002013560055f8381526020019081526020015f208190555061031e8161062a565b506001016102bb565b50610346565b604051638bb3ef8f60e01b815260040160405180910390fd5b5050505050565b6103556105c2565b61035e826105ee565b91506003545f1415801561039f57507f000000000000000000000000000000000000000000000000000000000001518060035461039b919061082c565b8214155b156103bd5760405163b7d0949760e01b815260040160405180910390fd5b600281905560038290555f8281526005602052604090208190556103e08261062a565b604080513381526020810183905283917f463ab7d735a9033f30ca849cbe589ceb85ff7b89f43f3d52f389fc46785cae8c910160405180910390a25050565b6104276105c2565b6104305f610639565b565b60015433906001600160a01b0316811461046f5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b61047881610639565b50565b5f80808060015b85811161051b576104b37f00000000000000000000000000000000000000000000000000000000000151808261083f565b6104bc426105ee565b6104c69190610856565b5f818152600560205260408120549195509093508390036104fd57604051639a1c663360e01b815260048101859052602401610466565b6105078383610869565b91508061051381610890565b915050610482565b5061052685826108bc565b95945050505050565b5f5f61053a836105ee565b5f818152600560205260409020549094909350915050565b61055a6105c2565b600180546001600160a01b0383166001600160a01b0319909116811790915561058a5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b031633146104305760405163118cdaa760e01b8152336004820152602401610466565b5f7f000000000000000000000000000000000000000000000000000000000001518061061a81846108e8565b610624919061083f565b92915050565b60045481101561047857600455565b600180546001600160a01b0319169055610478815f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126106e1575f5ffd5b50813567ffffffffffffffff8111156106f8575f5ffd5b6020830191508360208260051b8501011115610712575f5ffd5b9250929050565b5f5f5f5f5f6060868803121561072d575f5ffd5b853567ffffffffffffffff811115610743575f5ffd5b61074f888289016106d1565b909650945050602086013567ffffffffffffffff81111561076e575f5ffd5b61077a888289016106d1565b90945092505060408601358015158114610792575f5ffd5b809150509295509295909350565b5f5f604083850312156107b1575f5ffd5b50508035926020909101359150565b5f602082840312156107d0575f5ffd5b5035919050565b5f602082840312156107e7575f5ffd5b81356001600160a01b03811681146107fd575f5ffd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561062457610624610818565b808202811582820484141761062457610624610818565b8181038181111561062457610624610818565b8082018281125f83128015821682158216171561088857610888610818565b505092915050565b5f600182016108a1576108a1610818565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f826108ca576108ca6108a8565b600160ff1b82145f19841416156108e3576108e3610818565b500590565b5f826108f6576108f66108a8565b50049056fe54726565686f75736520457468657265756d205374616b696e672052617465202d2053706f74a2646970667358221220bfb72551b0473bfcf77b6a6ba75343fecf99102551cc19eac89a90958bee89f764736f6c634300081c0033
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.