Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FraxtalTransportOracle
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.19;
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ===================== FraxtalransportOracle =======================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance
// ====================================================================
import { Timelock2Step } from "frax-std/access-control/v1/Timelock2Step.sol";
import { ITimelock2Step } from "frax-std/access-control/v1/interfaces/ITimelock2Step.sol";
import { ERC165Storage } from "src/contracts/utils/ERC165Storage.sol";
import { IStateRootOracle } from "src/contracts/frax-oracle/interfaces/IStateRootOracle.sol";
/// @dev High/low prices will be equivalent
contract FraxtalTransportOracle is Timelock2Step, ERC165Storage {
/// @notice The address of the merkle proofing contract (Trusted Relayer) which will decode
/// and validate the L1 storage proofs against the `L1Block` contract
/// @dev If `PriceSource` is an EOA this oracle updated via a trusted relayer
address public priceSource;
/// @notice The current Oracle Price/Rate on L1
uint256 public price;
/// @notice The number of the last L1 block for which the values were synced
uint96 public lastL1Block;
/// @notice The L1 timestamp corresponding to the last time the contract was synced
uint256 public updatedAt;
constructor(address _timelock, address _priceSource) {
_setTimelock({ _newTimelock: _timelock });
_registerInterface({ interfaceId: type(ITimelock2Step).interfaceId });
priceSource = _priceSource;
}
// ====================================================================
// Internal Configuration Setters
// ====================================================================
/// @notice The ```_setPriceSource``` function sets the price source
/// @param _newPriceSource The new price source
function _setPriceSource(address _newPriceSource) internal {
address _priceSource = priceSource;
if (_priceSource == _newPriceSource) revert SamePriceSource();
emit SetPriceSource({ oldPriceSource: _priceSource, newPriceSource: _newPriceSource });
priceSource = _newPriceSource;
}
// ====================================================================
// Configuration Setters
// ====================================================================
/// @notice The ```setPriceSource``` function sets the price source
/// @dev Requires msg.sender to be the timelock address
/// @param _newPriceSource The new price source address
function setPriceSource(address _newPriceSource) external {
_requireTimelock();
_setPriceSource({ _newPriceSource: _newPriceSource });
}
// ====================================================================
// View Helpers
// ====================================================================
/// @notice The ```description``` function returns the description of the contract
/// @return _description The description of the contract
function description() external pure returns (string memory _description) {
_description = "RsEth: Rate Transport";
}
function name() external pure returns (string memory _name) {
_name = "RsEth: Rate Transport";
}
/// @notice The ```decimals``` function returns the decimals of the oracle response
/// @return _decimals The decimals corresponding to the L1 Answer
function decimals() external pure returns (uint8 _decimals) {
_decimals = 18;
}
// ====================================================================
// Pricing Functions
// ====================================================================
/// @notice The ```getPrices``` function is intended to return two prices from different oracles
/// @return isBadData is true when data is stale or otherwise bad
/// @return _priceLow is the lower of the two prices
/// @return _priceHigh is the higher of the two prices
function _getPrices() internal view returns (bool isBadData, uint256 _priceLow, uint256 _priceHigh) {
isBadData = false;
_priceLow = _priceHigh = price;
}
/// @notice The ```getPrices``` function is intended to return two prices from different oracles
/// @return isBadData is true when data is stale or otherwise bad
/// @return _priceLow is the lower of the two prices
/// @return _priceHigh is the higher of the two prices
function getPrices() external view returns (bool isBadData, uint256 _priceLow, uint256 _priceHigh) {
(isBadData, _priceLow, _priceHigh) = _getPrices();
}
/// @dev Adheres to chainlink's AggregatorV3Interface
/// @return _roundId The l1Block corresponding to the last time the oracle was proofed
/// @return _answer The price on L1
/// @return _startedAt The current timestamp
/// @return _updatedAt The current timestamp
/// @return _answeredInRound The l1Block corresponding to the last time the oracle was proofed
function latestRoundData()
external
view
returns (uint80 _roundId, int256 _answer, uint256 _startedAt, uint256 _updatedAt, uint80 _answeredInRound)
{
_answeredInRound = _roundId = uint80(lastL1Block);
_startedAt = _updatedAt = updatedAt;
_answer = int256(price);
if (_answer < 0) revert CastError();
if (_roundId < 0) revert CastError();
}
/// @notice ```getRate``` returns the price pushed to the oracle
/// @return rate The rate of RsEtH per Eth underlying
function getRate() external view returns (uint256 rate) {
rate = price;
}
/// @notice ```pricePershare``` returns the price pushed to the oracle
/// @return sharePrice The rate of RsEtH per Eth underlying
function pricePerShare() external view returns (uint256 sharePrice) {
sharePrice = price;
}
// ====================================================================
// Relay functions from merkle prover (Trusted Relayer)
// ====================================================================
/// @notice ```updateRsEthOracle``` function will update the price reported by this oracle
/// @param _l1BlockNumber The l1 Block Number corresponding to the price pushed to the oracle
/// @param _l1Timestamp The l1 Timestamp corresponding to the price pushed to the oracle
/// @param _price The price being pushed to the oracle which is on the L1
function updateRsEthOracle(uint96 _l1BlockNumber, uint256 _l1Timestamp, uint256 _price) external {
if (msg.sender != priceSource) revert OnlyPriceSource();
if (_l1BlockNumber < lastL1Block) revert StalePush();
if (_l1Timestamp < updatedAt) revert StalePush();
price = _price;
lastL1Block = _l1BlockNumber;
updatedAt = _l1Timestamp;
emit PriceDataUpdated(_l1BlockNumber, _l1Timestamp, _price);
}
// ====================================================================
// Events
// ====================================================================
/// @notice The ```SetPriceSource``` event is emitted when the price source is set
/// @param oldPriceSource The old price source address
/// @param newPriceSource The new price source address
event SetPriceSource(address oldPriceSource, address newPriceSource);
/// @notice The ```PriceDataUpdated``` event is emitted when the price from L1 is pushed to L2
/// @param l1Block The L1 Block at which the rate is updated
/// @param l1Timestamp The L1 Timestamp at which the rate is updated
/// @param rate The Price which is being pushed to the L2
event PriceDataUpdated(uint96 l1Block, uint256 l1Timestamp, uint256 rate);
// ====================================================================
// Errors
// ====================================================================
error OnlyPriceSource();
error SamePriceSource();
error StalePush();
error CastError();
}// SPDX-License-Identifier: ISC
pragma solidity >=0.8.0;
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================== Timelock2Step ===========================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance
// Primary Author
// Drake Evans: https://github.com/DrakeEvans
// Reviewers
// Dennis: https://github.com/denett
// ====================================================================
/// @title Timelock2Step
/// @author Drake Evans (Frax Finance) https://github.com/drakeevans
/// @dev Inspired by the OpenZeppelin's Ownable2Step contract
/// @notice An abstract contract which contains 2-step transfer and renounce logic for a timelock address
abstract contract Timelock2Step {
/// @notice The pending timelock address
address public pendingTimelockAddress;
/// @notice The current timelock address
address public timelockAddress;
constructor() {
timelockAddress = msg.sender;
}
/// @notice Emitted when timelock is transferred
error OnlyTimelock();
/// @notice Emitted when pending timelock is transferred
error OnlyPendingTimelock();
/// @notice The ```TimelockTransferStarted``` event is emitted when the timelock transfer is initiated
/// @param previousTimelock The address of the previous timelock
/// @param newTimelock The address of the new timelock
event TimelockTransferStarted(address indexed previousTimelock, address indexed newTimelock);
/// @notice The ```TimelockTransferred``` event is emitted when the timelock transfer is completed
/// @param previousTimelock The address of the previous timelock
/// @param newTimelock The address of the new timelock
event TimelockTransferred(address indexed previousTimelock, address indexed newTimelock);
/// @notice The ```_isSenderTimelock``` function checks if msg.sender is current timelock address
/// @return Whether or not msg.sender is current timelock address
function _isSenderTimelock() internal view returns (bool) {
return msg.sender == timelockAddress;
}
/// @notice The ```_requireTimelock``` function reverts if msg.sender is not current timelock address
function _requireTimelock() internal view {
if (msg.sender != timelockAddress) revert OnlyTimelock();
}
/// @notice The ```_isSenderPendingTimelock``` function checks if msg.sender is pending timelock address
/// @return Whether or not msg.sender is pending timelock address
function _isSenderPendingTimelock() internal view returns (bool) {
return msg.sender == pendingTimelockAddress;
}
/// @notice The ```_requirePendingTimelock``` function reverts if msg.sender is not pending timelock address
function _requirePendingTimelock() internal view {
if (msg.sender != pendingTimelockAddress) revert OnlyPendingTimelock();
}
/// @notice The ```_transferTimelock``` function initiates the timelock transfer
/// @dev This function is to be implemented by a public function
/// @param _newTimelock The address of the nominated (pending) timelock
function _transferTimelock(address _newTimelock) internal {
pendingTimelockAddress = _newTimelock;
emit TimelockTransferStarted(timelockAddress, _newTimelock);
}
/// @notice The ```_acceptTransferTimelock``` function completes the timelock transfer
/// @dev This function is to be implemented by a public function
function _acceptTransferTimelock() internal {
pendingTimelockAddress = address(0);
_setTimelock(msg.sender);
}
/// @notice The ```_setTimelock``` function sets the timelock address
/// @dev This function is to be implemented by a public function
/// @param _newTimelock The address of the new timelock
function _setTimelock(address _newTimelock) internal {
emit TimelockTransferred(timelockAddress, _newTimelock);
timelockAddress = _newTimelock;
}
/// @notice The ```transferTimelock``` function initiates the timelock transfer
/// @dev Must be called by the current timelock
/// @param _newTimelock The address of the nominated (pending) timelock
function transferTimelock(address _newTimelock) external virtual {
_requireTimelock();
_transferTimelock(_newTimelock);
}
/// @notice The ```acceptTransferTimelock``` function completes the timelock transfer
/// @dev Must be called by the pending timelock
function acceptTransferTimelock() external virtual {
_requirePendingTimelock();
_acceptTransferTimelock();
}
/// @notice The ```renounceTimelock``` function renounces the timelock after setting pending timelock to current timelock
/// @dev Pending timelock must be set to current timelock before renouncing, creating a 2-step renounce process
function renounceTimelock() external virtual {
_requireTimelock();
_requirePendingTimelock();
_transferTimelock(address(0));
_setTimelock(address(0));
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
interface ITimelock2Step {
event TimelockTransferStarted(address indexed previousTimelock, address indexed newTimelock);
event TimelockTransferred(address indexed previousTimelock, address indexed newTimelock);
function acceptTransferTimelock() external;
function pendingTimelockAddress() external view returns (address);
function renounceTimelock() external;
function timelockAddress() external view returns (address);
function transferTimelock(address _newTimelock) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol)
pragma solidity ^0.8.0;
import { ERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
/**
* @dev Storage based implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165Storage is ERC165 {
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId];
}
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
* registering its interface id is not required.
*
* See {IERC165-supportsInterface}.
*
* Requirements:
*
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
*/
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}// SPDX-License-Identifier: ISC
pragma solidity ^0.8.20;
interface IStateRootOracle {
struct BlockInfo {
bytes32 stateRootHash;
uint40 timestamp;
}
function getBlockInfo(uint256 blockNumber) external view returns (BlockInfo memory _blockInfo);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"ds-test/=node_modules/ds-test/src/",
"forge-std/=node_modules/forge-std/src/",
"frax-std/=node_modules/frax-standard-solidity/src/",
"script/=src/script/",
"src/=src/",
"test/=src/test/",
"interfaces/=src/contracts/interfaces/",
"arbitrum/=node_modules/@arbitrum/",
"rlp/=node_modules/solidity-rlp/contracts/",
"@solmate/=node_modules/@rari-capital/solmate/src/",
"@arbitrum/=node_modules/@arbitrum/",
"@chainlink/=node_modules/@chainlink/",
"@mean-finance/=node_modules/@mean-finance/",
"@openzeppelin/=node_modules/@openzeppelin/",
"@rari-capital/=node_modules/@rari-capital/",
"@uniswap/=node_modules/@uniswap/",
"dev-fraxswap/=node_modules/dev-fraxswap/",
"frax-standard-solidity/=node_modules/frax-standard-solidity/",
"prb-math/=node_modules/prb-math/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
"solidity-rlp/=node_modules/solidity-rlp/"
],
"optimizer": {
"enabled": true,
"runs": 1000000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_priceSource","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CastError","type":"error"},{"inputs":[],"name":"OnlyPendingTimelock","type":"error"},{"inputs":[],"name":"OnlyPriceSource","type":"error"},{"inputs":[],"name":"OnlyTimelock","type":"error"},{"inputs":[],"name":"SamePriceSource","type":"error"},{"inputs":[],"name":"StalePush","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"l1Block","type":"uint96"},{"indexed":false,"internalType":"uint256","name":"l1Timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"PriceDataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPriceSource","type":"address"},{"indexed":false,"internalType":"address","name":"newPriceSource","type":"address"}],"name":"SetPriceSource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTimelock","type":"address"},{"indexed":true,"internalType":"address","name":"newTimelock","type":"address"}],"name":"TimelockTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTimelock","type":"address"},{"indexed":true,"internalType":"address","name":"newTimelock","type":"address"}],"name":"TimelockTransferred","type":"event"},{"inputs":[],"name":"acceptTransferTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"_description","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getPrices","outputs":[{"internalType":"bool","name":"isBadData","type":"bool"},{"internalType":"uint256","name":"_priceLow","type":"uint256"},{"internalType":"uint256","name":"_priceHigh","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRate","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastL1Block","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"},{"internalType":"int256","name":"_answer","type":"int256"},{"internalType":"uint256","name":"_startedAt","type":"uint256"},{"internalType":"uint256","name":"_updatedAt","type":"uint256"},{"internalType":"uint80","name":"_answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pendingTimelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerShare","outputs":[{"internalType":"uint256","name":"sharePrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceSource","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPriceSource","type":"address"}],"name":"setPriceSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newTimelock","type":"address"}],"name":"transferTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_l1BlockNumber","type":"uint96"},{"internalType":"uint256","name":"_l1Timestamp","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateRsEthOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b50604051610bb3380380610bb383398101604081905261002e91610177565b600180546001600160a01b031916331790556100498261007f565b610059632fa3fc3160e21b6100da565b600380546001600160a01b0319166001600160a01b0392909216919091179055506101a8565b6001546040516001600160a01b038084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160e01b031980821690036101385760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319165f908152600260205260409020805460ff19166001179055565b80516001600160a01b0381168114610172575f80fd5b919050565b5f8060408385031215610188575f80fd5b6101918361015c565b915061019f6020840161015c565b90509250929050565b6109fe806101b55f395ff3fe608060405234801561000f575f80fd5b5060043610610149575f3560e01c8063679aefce116100c7578063a035b1fe1161007d578063bda5310711610063578063bda53107146102f5578063f6ccaad414610308578063feaf968c14610310575f80fd5b8063a035b1fe146102c7578063bd9a548b146102d0575f80fd5b80637519ab50116100ad5780637519ab5014610289578063770b1c8f1461029257806399530b0614610277575f80fd5b8063679aefce146102775780637284e41614610175575f80fd5b8063313ce5671161011c5780634bc66f32116101025780634bc66f321461023c5780634f8b4ae71461025c578063588aa4ff14610264575f80fd5b8063313ce567146102185780634501409514610227575f80fd5b806301ffc9a71461014d57806306fdde0314610175578063090f3f50146101b457806320531bc9146101f8575b5f80fd5b61016061015b3660046108cd565b61034f565b60405190151581526020015b60405180910390f35b604080518082018252601581527f52734574683a2052617465205472616e73706f727400000000000000000000006020820152905161016c9190610913565b5f546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016c565b6003546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b6040516012815260200161016c565b61023a61023536600461097c565b6103d6565b005b6001546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b61023a6103ea565b61023a6102723660046109af565b61040e565b6004545b60405190815260200161016c565b61027b60065481565b6005546102aa906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161016c565b61027b60045481565b6102d8610573565b60408051931515845260208401929092529082015260600161016c565b61023a61030336600461097c565b61058e565b61023a61059f565b6103186105af565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a00161016c565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806103d057507fffffffff0000000000000000000000000000000000000000000000000000000082165f9081526002602052604090205460ff165b92915050565b6103de61060d565b6103e78161065e565b50565b6103f261060d565b6103fa6106d2565b6104035f61065e565b61040c5f610722565b565b60035473ffffffffffffffffffffffffffffffffffffffff16331461045f576040517f2937b3e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546bffffffffffffffffffffffff90811690841610156104ad576040517f011d308100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006548210156104e9576040517f011d308100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004819055600580547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff85169081179091556006839055604080519182526020820184905281018290527ffff7f2ea03247e7bfdf6b03f42776d525c4c47a29d670260c24cf2cbf6cc890f9060600160405180910390a1505050565b5f805f6105826004545f918190565b91959094509092509050565b61059661060d565b6103e7816107af565b6105a76106d2565b61040c61089d565b6005546006546004546bffffffffffffffffffffffff909216919080835f841215610606576040517f811752de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9091929394565b60015473ffffffffffffffffffffffffffffffffffffffff16331461040c576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a9190a350565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461040c576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60035473ffffffffffffffffffffffffffffffffffffffff9081169082168103610805576040517f22ba75b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f964298b435edfc268e11aa89b342ef1ddac566da6759b6dd15d7aad58a1dc935910160405180910390a150600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561040c33610722565b5f602082840312156108dd575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461090c575f80fd5b9392505050565b5f6020808352835180828501525f5b8181101561093e57858101830151858201604001528201610922565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f6020828403121561098c575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461090c575f80fd5b5f805f606084860312156109c1575f80fd5b83356bffffffffffffffffffffffff811681146109dc575f80fd5b9560208501359550604090940135939250505056fea164736f6c6343000814000a000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b20000000000000000000000005bac02527bbaa82453c0f93b8e3deab8ad0c8dac
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610149575f3560e01c8063679aefce116100c7578063a035b1fe1161007d578063bda5310711610063578063bda53107146102f5578063f6ccaad414610308578063feaf968c14610310575f80fd5b8063a035b1fe146102c7578063bd9a548b146102d0575f80fd5b80637519ab50116100ad5780637519ab5014610289578063770b1c8f1461029257806399530b0614610277575f80fd5b8063679aefce146102775780637284e41614610175575f80fd5b8063313ce5671161011c5780634bc66f32116101025780634bc66f321461023c5780634f8b4ae71461025c578063588aa4ff14610264575f80fd5b8063313ce567146102185780634501409514610227575f80fd5b806301ffc9a71461014d57806306fdde0314610175578063090f3f50146101b457806320531bc9146101f8575b5f80fd5b61016061015b3660046108cd565b61034f565b60405190151581526020015b60405180910390f35b604080518082018252601581527f52734574683a2052617465205472616e73706f727400000000000000000000006020820152905161016c9190610913565b5f546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016c565b6003546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b6040516012815260200161016c565b61023a61023536600461097c565b6103d6565b005b6001546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b61023a6103ea565b61023a6102723660046109af565b61040e565b6004545b60405190815260200161016c565b61027b60065481565b6005546102aa906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161016c565b61027b60045481565b6102d8610573565b60408051931515845260208401929092529082015260600161016c565b61023a61030336600461097c565b61058e565b61023a61059f565b6103186105af565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a00161016c565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806103d057507fffffffff0000000000000000000000000000000000000000000000000000000082165f9081526002602052604090205460ff165b92915050565b6103de61060d565b6103e78161065e565b50565b6103f261060d565b6103fa6106d2565b6104035f61065e565b61040c5f610722565b565b60035473ffffffffffffffffffffffffffffffffffffffff16331461045f576040517f2937b3e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546bffffffffffffffffffffffff90811690841610156104ad576040517f011d308100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006548210156104e9576040517f011d308100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004819055600580547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff85169081179091556006839055604080519182526020820184905281018290527ffff7f2ea03247e7bfdf6b03f42776d525c4c47a29d670260c24cf2cbf6cc890f9060600160405180910390a1505050565b5f805f6105826004545f918190565b91959094509092509050565b61059661060d565b6103e7816107af565b6105a76106d2565b61040c61089d565b6005546006546004546bffffffffffffffffffffffff909216919080835f841215610606576040517f811752de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9091929394565b60015473ffffffffffffffffffffffffffffffffffffffff16331461040c576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a9190a350565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461040c576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60035473ffffffffffffffffffffffffffffffffffffffff9081169082168103610805576040517f22ba75b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f964298b435edfc268e11aa89b342ef1ddac566da6759b6dd15d7aad58a1dc935910160405180910390a150600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561040c33610722565b5f602082840312156108dd575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461090c575f80fd5b9392505050565b5f6020808352835180828501525f5b8181101561093e57858101830151858201604001528201610922565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f6020828403121561098c575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461090c575f80fd5b5f805f606084860312156109c1575f80fd5b83356bffffffffffffffffffffffff811681146109dc575f80fd5b9560208501359550604090940135939250505056fea164736f6c6343000814000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b20000000000000000000000005bac02527bbaa82453c0f93b8e3deab8ad0c8dac
-----Decoded View---------------
Arg [0] : _timelock (address): 0xc16068d1ca7E24E20e56bB70af4D00D92AA4f0b2
Arg [1] : _priceSource (address): 0x5bac02527BbAA82453c0F93b8e3DEab8AD0c8DAc
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b2
Arg [1] : 0000000000000000000000005bac02527bbaa82453c0f93b8e3deab8ad0c8dac
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.