Overview
FRAX Balance | FXTL Balance
FRAX Value
$0.00Latest 19 from a total of 19 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Add Round Data C... | 1133637 | 701 days ago | IN | 0 FRAX | 0.0078295 | ||||
| Add Round Data C... | 1130026 | 702 days ago | IN | 0 FRAX | 0.00778302 | ||||
| Add Round Data C... | 1120539 | 702 days ago | IN | 0 FRAX | 0.01085809 | ||||
| Add Round Data C... | 1119971 | 702 days ago | IN | 0 FRAX | 0.01049265 | ||||
| Add Round Data C... | 1119482 | 702 days ago | IN | 0 FRAX | 0.01036419 | ||||
| Add Round Data C... | 1096651 | 702 days ago | IN | 0 FRAX | 0.0078957 | ||||
| Add Round Data C... | 1094042 | 702 days ago | IN | 0 FRAX | 0.00791664 | ||||
| Add Round Data C... | 1093418 | 702 days ago | IN | 0 FRAX | 0.00761368 | ||||
| Add Round Data C... | 1090646 | 702 days ago | IN | 0 FRAX | 0.00856351 | ||||
| Add Round Data C... | 1088865 | 703 days ago | IN | 0 FRAX | 0.0070402 | ||||
| Add Round Data C... | 1087647 | 703 days ago | IN | 0 FRAX | 0.00750577 | ||||
| Add Round Data C... | 1087612 | 703 days ago | IN | 0 FRAX | 0.00435508 | ||||
| Add Round Data C... | 1087569 | 703 days ago | IN | 0 FRAX | 0.00449685 | ||||
| Add Round Data C... | 1087092 | 703 days ago | IN | 0 FRAX | 0.00504015 | ||||
| Add Round Data C... | 1087017 | 703 days ago | IN | 0 FRAX | 0.00411571 | ||||
| Add Round Data C... | 1087006 | 703 days ago | IN | 0 FRAX | 0.00450351 | ||||
| Add Round Data C... | 1086990 | 703 days ago | IN | 0 FRAX | 0.00450922 | ||||
| Add Round Data C... | 1086328 | 703 days ago | IN | 0 FRAX | 0.00843739 | ||||
| Add Oracle Pairs | 1084238 | 703 days ago | IN | 0 FRAX | 0.00016164 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 1133637 | 701 days ago | 0 FRAX | |||||
| 1133637 | 701 days ago | 0 FRAX | |||||
| 1130026 | 702 days ago | 0 FRAX | |||||
| 1130026 | 702 days ago | 0 FRAX | |||||
| 1120539 | 702 days ago | 0 FRAX | |||||
| 1120539 | 702 days ago | 0 FRAX | |||||
| 1119971 | 702 days ago | 0 FRAX | |||||
| 1119971 | 702 days ago | 0 FRAX | |||||
| 1119482 | 702 days ago | 0 FRAX | |||||
| 1119482 | 702 days ago | 0 FRAX | |||||
| 1096651 | 702 days ago | 0 FRAX | |||||
| 1096651 | 702 days ago | 0 FRAX | |||||
| 1094042 | 702 days ago | 0 FRAX | |||||
| 1094042 | 702 days ago | 0 FRAX | |||||
| 1093418 | 702 days ago | 0 FRAX | |||||
| 1093418 | 702 days ago | 0 FRAX | |||||
| 1090646 | 702 days ago | 0 FRAX | |||||
| 1090646 | 702 days ago | 0 FRAX | |||||
| 1088865 | 703 days ago | 0 FRAX | |||||
| 1088865 | 703 days ago | 0 FRAX | |||||
| 1087647 | 703 days ago | 0 FRAX | |||||
| 1087647 | 703 days ago | 0 FRAX | |||||
| 1087612 | 703 days ago | 0 FRAX | |||||
| 1086328 | 703 days ago | 0 FRAX | |||||
| 1086328 | 703 days ago | 0 FRAX |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.19;
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ====================== MerkleProofChainlink ========================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance
// ====================================================================
import { ERC165Storage } from "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol";
import { Timelock2Step } from "frax-std/access-control/v1/Timelock2Step.sol";
import { ITimelock2Step } from "frax-std/access-control/v1/interfaces/ITimelock2Step.sol";
import { MerkleTreeProver } from "./lib/MerkleTreeProver.sol";
import { StateProofVerifier as Verifier } from "./lib/StateProofVerifier.sol";
import { IPriceSourceReceiver } from "./interfaces/IPriceSourceReceiver.sol";
import { IStateRootOracle } from "./interfaces/IStateRootOracle.sol";
/// @title MerkleProofPriceSource
/// @author Jon Walch (Frax Finance) https://github.com/jonwalch
/// @notice Proves price round data from an L1 Frax Oracle and pushes the price data to an L2 Frax Oracle
contract MerkleProofPriceSourceChainlink is ERC165Storage, Timelock2Step {
/// @notice The address of the StateRootOracle on Layer 2
IStateRootOracle public immutable STATE_ROOT_ORACLE;
/// @notice Configuration linking Frax Oracles for the same asset on L1 / L2
mapping(address layer2FraxOracle => address layer1FraxOracle) public oracleLookup;
/// @notice The ```constructor``` function
/// @param _stateRootOracle Address of the L2 StateRootOracle
/// @param _timelockAddress Address of Timelock contract on L2
constructor(address _stateRootOracle, address _timelockAddress) Timelock2Step() {
_setTimelock({ _newTimelock: _timelockAddress });
_registerInterface({ interfaceId: type(ITimelock2Step).interfaceId });
STATE_ROOT_ORACLE = IStateRootOracle(_stateRootOracle);
}
// ====================================================================
// Events
// ====================================================================
/// @notice The ```OraclePairAdded``` event is emitted when a new Frax Oracle pair is added
/// @param fraxOracleLayer1 The address of the layer 1 Frax Oracle
/// @param fraxOracleLayer2 The address of the layer 2 Frax Oracle
event OraclePairAdded(address indexed fraxOracleLayer1, address indexed fraxOracleLayer2);
// ====================================================================
// Configuration Setters
// ====================================================================
/// @dev A pair of addresses that are the Frax Oracles for the same asset on layer 1 and layer 2
struct OraclePair {
address layer1FraxOracle;
address layer2FraxOracle;
}
/// @notice The ```addOraclePairs``` function sets an L1/L2 pair if they haven't been set already
/// @param _oraclePairs List of OraclePairs representing the same oracle on L1 and L2
function addOraclePairs(OraclePair[] calldata _oraclePairs) external {
_requireTimelock();
for (uint256 i = 0; i < _oraclePairs.length; ++i) {
OraclePair memory _oraclePair = _oraclePairs[i];
if (oracleLookup[_oraclePair.layer2FraxOracle] != address(0)) {
revert OraclePairAlreadySet({
fraxOracleLayer1: oracleLookup[_oraclePair.layer2FraxOracle],
fraxOracleLayer2: _oraclePair.layer2FraxOracle
});
}
oracleLookup[_oraclePair.layer2FraxOracle] = _oraclePair.layer1FraxOracle;
emit OraclePairAdded({
fraxOracleLayer1: _oraclePair.layer1FraxOracle,
fraxOracleLayer2: _oraclePair.layer2FraxOracle
});
}
}
// ====================================================================
// Proof / Add Price Function
// ====================================================================
/// @notice Proves CL Oracle<>Aggregator<>price relationship on L1 and pushed data to L2
/// @dev Proves the storage root using block info from the L2 StateRootOracle.
/// @dev Proof: Oracle ---> Aggregator ---> latestRoundId ---> Price
/// @dev L2 Frax Oracle. L2 Frax Oracle must be configured to accept price data from this contract.
/// @param _clAddress The address of the CL Oracle to check
/// @param _blockNumber The block number
/// @param _accountProofOracle The accountProof of the oracle retrieved from eth_getProof
/// @param _storageProofOracle The storageProof.proof of the oracle retrieved from eth_getProof
/// @param _accountProofAggregator The accountProof for the oracle aggregator from eth_getProof
/// @param _storageProofAggregator The storageProof for `HotVars` slot oracle aggregator from eth_getProof
/// @param _storageProofAggregator The storageProof for calculated price slot oracle aggregator from eth_getProof
function _fetchAndProofChainlinkAnswer(
address _clAddress,
uint256 _blockNumber,
bytes[] memory _accountProofOracle,
bytes[] memory _storageProofOracle,
bytes[] memory _accountProofAggregator,
bytes[] memory _storageProofAggregator,
bytes[] memory _storageProofAggregator1
) internal view returns (uint256, uint256) {
IStateRootOracle.BlockInfo memory _blockInfo = STATE_ROOT_ORACLE.getBlockInfo(_blockNumber);
Verifier.Account memory _accountPool = MerkleTreeProver.proveStorageRoot({
stateRootHash: _blockInfo.stateRootHash,
proofAddress: _clAddress,
accountProof: _accountProofOracle
});
uint256 _aggregator = uint256(
MerkleTreeProver
.proveStorageSlotValue({
storageRootHash: _accountPool.storageRoot,
slot: bytes32(uint256(2)),
storageProof: _storageProofOracle
})
.value
);
address aggregator = address(uint160(uint256(_aggregator) >> 16));
Verifier.Account memory _accountPoolAggregator = MerkleTreeProver.proveStorageRoot({
stateRootHash: _blockInfo.stateRootHash,
proofAddress: aggregator,
accountProof: _accountProofAggregator
});
uint256 roundId = uint256(
MerkleTreeProver
.proveStorageSlotValue({
storageRootHash: _accountPoolAggregator.storageRoot,
slot: bytes32(uint256(43)),
storageProof: _storageProofAggregator
})
.value
);
uint32 _roundId = uint32(uint256(roundId) >> ((16 + 5 + 1) * 8));
bytes32 priceSlot = keccak256(abi.encodePacked(uint256(_roundId), uint256(44)));
uint256 answer = uint256(
MerkleTreeProver
.proveStorageSlotValue({
storageRootHash: _accountPoolAggregator.storageRoot,
slot: priceSlot,
storageProof: _storageProofAggregator1
})
.value
);
uint256 timestamp = uint256(uint256(answer) >> 192);
return (answer, timestamp);
}
/// @notice Proves CL Oracle<>Aggregator<>price relationship on L1 and pushed data to L2
/// @dev Proves the storage root using block info from the L2 StateRootOracle.
/// @dev Proof: Oracle ---> Aggregator ---> latestRoundId ---> Price
/// @dev L2 Frax Oracle. L2 Frax Oracle must be configured to accept price data from this contract.
/// @param _fraxOracleLayer2 The Oracle Address on the L2 to push the data too
/// @param _blockNumber The block number
/// @param _accountProofOracle The accountProof of the oracle retrieved from eth_getProof
/// @param _storageProofOracle The storageProof.proof of the oracle retrieved from eth_getProof
/// @param _accountProofAggregator The accountProof for the oracle aggregator from eth_getProof
/// @param _storageProofAggregator The storageProof for `HotVars` slot oracle aggregator from eth_getProof
/// @param _storageProofAggregator The storageProof for calculated price slot oracle aggregator from eth_getProof
function addRoundDataChainlink(
IPriceSourceReceiver _fraxOracleLayer2,
uint256 _blockNumber,
bytes[] memory _accountProofOracle,
bytes[] memory _storageProofOracle,
bytes[] memory _accountProofAggregator,
bytes[] memory _storageProofAggregator,
bytes[] memory _storageProofAggregator1
) external {
// Address of the L1 oracle
address _proofAddress = oracleLookup[address(_fraxOracleLayer2)];
if (_proofAddress == address(0)) revert WrongOracleAddress();
(uint256 answer, uint256 timestamp) = _fetchAndProofChainlinkAnswer(
_proofAddress,
_blockNumber,
_accountProofOracle,
_storageProofOracle,
_accountProofAggregator,
_storageProofAggregator,
_storageProofAggregator1
);
// Push prices to Oracle, handle isBadData return there
_fraxOracleLayer2.addRoundData({
isBadData: false,
priceLow: uint104(answer),
priceHigh: uint104(answer),
timestamp: uint40(timestamp)
});
}
// ====================================================================
// Errors
// ====================================================================
error OraclePairAlreadySet(address fraxOracleLayer1, address fraxOracleLayer2);
error WrongOracleAddress();
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol)
pragma solidity ^0.8.0;
import "./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.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: ISC
pragma solidity ^0.8.19;
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================= MerkleTreeProver =========================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance
// Authors
// Jon Walch: https://github.com/jonwalch
// Dennis: https://github.com/denett
// Reviewers
// Drake Evans: https://github.com/DrakeEvans
// ====================================================================
import { RLPReader } from "rlp/RLPReader.sol";
import { StateProofVerifier as Verifier } from "./StateProofVerifier.sol";
/// @title MerkleTreeProver
/// @author Jon Walch (Frax Finance) https://github.com/jonwalch
/// @notice Helper function library for interacting with StateProofVerifier and RLPReader
library MerkleTreeProver {
using RLPReader for bytes;
using RLPReader for RLPReader.RLPItem;
/// @notice The ```proveStorageRoot``` function is a helper function for StateProofVerifier.extractAccountFromProof()
/// @param stateRootHash The hash of the state root
/// @param proofAddress The address of the contract we're proving
/// @param accountProof The accountProof retrieved from eth_getProof
function proveStorageRoot(
bytes32 stateRootHash,
address proofAddress,
bytes[] memory accountProof
) internal view returns (Verifier.Account memory accountPool) {
RLPReader.RLPItem[] memory accountProofRlp = new RLPReader.RLPItem[](accountProof.length);
for (uint256 i = 0; i < accountProof.length; ++i) {
accountProofRlp[i] = accountProof[i].toRlpItem();
}
accountPool = Verifier.extractAccountFromProof({
_addressHash: keccak256(abi.encodePacked(proofAddress)),
_stateRootHash: stateRootHash,
_proof: accountProofRlp
});
}
/// @notice The ```proveStorageSlotValue``` function is a helper function for StateProofVerifier.extractSlotValueFromProof()
/// @param storageRootHash The hash of the storage root
/// @param slot The slot we want to prove for the contract
/// @param storageProof The storageProof.proof retrieved from eth_getProof
function proveStorageSlotValue(
bytes32 storageRootHash,
bytes32 slot,
bytes[] memory storageProof
) internal view returns (Verifier.SlotValue memory slotValue) {
RLPReader.RLPItem[] memory storageProofRlp = new RLPReader.RLPItem[](storageProof.length);
for (uint256 i = 0; i < storageProof.length; ++i) {
storageProofRlp[i] = storageProof[i].toRlpItem();
}
slotValue = Verifier.extractSlotValueFromProof({
_slotHash: keccak256(abi.encodePacked(slot)),
_storageRootHash: storageRootHash,
_proof: storageProofRlp
});
}
}// SPDX-License-Identifier: MIT
// Copied from https://github.com/lidofinance/curve-merkle-oracle/blob/1033b3e84142317ffd8f366b52e489d5eb49c73f/contracts/StateProofVerifier.sol
pragma solidity ^0.8.19;
import { RLPReader } from "rlp/RLPReader.sol";
import { MerklePatriciaProofVerifier } from "./MerklePatriciaProofVerifier.sol";
/**
* @title A helper library for verification of Merkle Patricia account and state proofs.
*/
library StateProofVerifier {
using RLPReader for RLPReader.RLPItem;
using RLPReader for bytes;
uint256 constant HEADER_STATE_ROOT_INDEX = 3;
uint256 constant HEADER_NUMBER_INDEX = 8;
uint256 constant HEADER_TIMESTAMP_INDEX = 11;
struct BlockHeader {
bytes32 hash;
bytes32 stateRootHash;
uint256 number;
uint256 timestamp;
}
struct Account {
bool exists;
uint256 nonce;
uint256 balance;
bytes32 storageRoot;
bytes32 codeHash;
}
struct SlotValue {
bool exists;
uint256 value;
}
/**
* @notice Parses block header and verifies its presence onchain within the latest 256 blocks.
* @param _headerRlpBytes RLP-encoded block header.
*/
function verifyBlockHeader(bytes memory _headerRlpBytes) internal view returns (BlockHeader memory) {
BlockHeader memory header = parseBlockHeader(_headerRlpBytes);
// ensure that the block is actually in the blockchain
require(header.hash == blockhash(header.number), "blockhash mismatch");
return header;
}
/**
* @notice Parses RLP-encoded block header.
* @param _headerRlpBytes RLP-encoded block header.
*/
function parseBlockHeader(bytes memory _headerRlpBytes) internal pure returns (BlockHeader memory) {
BlockHeader memory result;
RLPReader.RLPItem[] memory headerFields = _headerRlpBytes.toRlpItem().toList();
require(headerFields.length > HEADER_TIMESTAMP_INDEX);
result.stateRootHash = bytes32(headerFields[HEADER_STATE_ROOT_INDEX].toUint());
result.number = headerFields[HEADER_NUMBER_INDEX].toUint();
result.timestamp = headerFields[HEADER_TIMESTAMP_INDEX].toUint();
result.hash = keccak256(_headerRlpBytes);
return result;
}
/**
* @notice Verifies Merkle Patricia proof of an account and extracts the account fields.
*
* @param _addressHash Keccak256 hash of the address corresponding to the account.
* @param _stateRootHash MPT root hash of the Ethereum state trie.
*/
function extractAccountFromProof(
bytes32 _addressHash, // keccak256(abi.encodePacked(address))
bytes32 _stateRootHash,
RLPReader.RLPItem[] memory _proof
) internal pure returns (Account memory) {
bytes memory acctRlpBytes = MerklePatriciaProofVerifier.extractProofValue(
_stateRootHash,
abi.encodePacked(_addressHash),
_proof
);
Account memory account;
if (acctRlpBytes.length == 0) {
return account;
}
RLPReader.RLPItem[] memory acctFields = acctRlpBytes.toRlpItem().toList();
require(acctFields.length == 4);
account.exists = true;
account.nonce = acctFields[0].toUint();
account.balance = acctFields[1].toUint();
account.storageRoot = bytes32(acctFields[2].toUint());
account.codeHash = bytes32(acctFields[3].toUint());
return account;
}
/**
* @notice Verifies Merkle Patricia proof of a slot and extracts the slot's value.
*
* @param _slotHash Keccak256 hash of the slot position.
* @param _storageRootHash MPT root hash of the account's storage trie.
*/
function extractSlotValueFromProof(
bytes32 _slotHash,
bytes32 _storageRootHash,
RLPReader.RLPItem[] memory _proof
) internal pure returns (SlotValue memory) {
bytes memory valueRlpBytes = MerklePatriciaProofVerifier.extractProofValue(
_storageRootHash,
abi.encodePacked(_slotHash),
_proof
);
SlotValue memory value;
if (valueRlpBytes.length != 0) {
value.exists = true;
value.value = valueRlpBytes.toRlpItem().toUint();
}
return value;
}
}// SPDX-License-Identifier: ISC
pragma solidity ^0.8.19;
interface IPriceSourceReceiver {
function addRoundData(bool isBadData, uint104 priceLow, uint104 priceHigh, uint40 timestamp) external;
function getPrices() external view returns (bool isBadData, uint256 priceLow, uint256 priceHigh);
}// SPDX-License-Identifier: ISC
pragma solidity ^0.8.19;
interface IStateRootOracle {
struct BlockInfo {
bytes32 stateRootHash;
uint40 timestamp;
}
function getBlockInfo(uint256 blockNumber) external view returns (BlockInfo memory _blockInfo);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./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);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: Apache-2.0 /* * @author Hamdi Allam [email protected] * Please reach out with any questions or concerns */ pragma solidity >=0.5.10 <0.9.0; library RLPReader { uint8 constant STRING_SHORT_START = 0x80; uint8 constant STRING_LONG_START = 0xb8; uint8 constant LIST_SHORT_START = 0xc0; uint8 constant LIST_LONG_START = 0xf8; uint8 constant WORD_SIZE = 32; struct RLPItem { uint256 len; uint256 memPtr; } struct Iterator { RLPItem item; // Item that's being iterated over. uint256 nextPtr; // Position of the next item in the list. } /* * @dev Returns the next element in the iteration. Reverts if it has not next element. * @param self The iterator. * @return The next element in the iteration. */ function next(Iterator memory self) internal pure returns (RLPItem memory) { require(hasNext(self)); uint256 ptr = self.nextPtr; uint256 itemLength = _itemLength(ptr); self.nextPtr = ptr + itemLength; return RLPItem(itemLength, ptr); } /* * @dev Returns true if the iteration has more elements. * @param self The iterator. * @return true if the iteration has more elements. */ function hasNext(Iterator memory self) internal pure returns (bool) { RLPItem memory item = self.item; return self.nextPtr < item.memPtr + item.len; } /* * @param item RLP encoded bytes */ function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) { uint256 memPtr; assembly { memPtr := add(item, 0x20) } return RLPItem(item.length, memPtr); } /* * @dev Create an iterator. Reverts if item is not a list. * @param self The RLP item. * @return An 'Iterator' over the item. */ function iterator(RLPItem memory self) internal pure returns (Iterator memory) { require(isList(self)); uint256 ptr = self.memPtr + _payloadOffset(self.memPtr); return Iterator(self, ptr); } /* * @param the RLP item. */ function rlpLen(RLPItem memory item) internal pure returns (uint256) { return item.len; } /* * @param the RLP item. * @return (memPtr, len) pair: location of the item's payload in memory. */ function payloadLocation(RLPItem memory item) internal pure returns (uint256, uint256) { uint256 offset = _payloadOffset(item.memPtr); uint256 memPtr = item.memPtr + offset; uint256 len = item.len - offset; // data length return (memPtr, len); } /* * @param the RLP item. */ function payloadLen(RLPItem memory item) internal pure returns (uint256) { (, uint256 len) = payloadLocation(item); return len; } /* * @param the RLP item containing the encoded list. */ function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) { require(isList(item)); uint256 items = numItems(item); RLPItem[] memory result = new RLPItem[](items); uint256 memPtr = item.memPtr + _payloadOffset(item.memPtr); uint256 dataLen; for (uint256 i = 0; i < items; i++) { dataLen = _itemLength(memPtr); result[i] = RLPItem(dataLen, memPtr); memPtr = memPtr + dataLen; } return result; } // @return indicator whether encoded payload is a list. negate this function call for isData. function isList(RLPItem memory item) internal pure returns (bool) { if (item.len == 0) return false; uint8 byte0; uint256 memPtr = item.memPtr; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < LIST_SHORT_START) return false; return true; } /* * @dev A cheaper version of keccak256(toRlpBytes(item)) that avoids copying memory. * @return keccak256 hash of RLP encoded bytes. */ function rlpBytesKeccak256(RLPItem memory item) internal pure returns (bytes32) { uint256 ptr = item.memPtr; uint256 len = item.len; bytes32 result; assembly { result := keccak256(ptr, len) } return result; } /* * @dev A cheaper version of keccak256(toBytes(item)) that avoids copying memory. * @return keccak256 hash of the item payload. */ function payloadKeccak256(RLPItem memory item) internal pure returns (bytes32) { (uint256 memPtr, uint256 len) = payloadLocation(item); bytes32 result; assembly { result := keccak256(memPtr, len) } return result; } /** RLPItem conversions into data types **/ // @returns raw rlp encoding in bytes function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) { bytes memory result = new bytes(item.len); if (result.length == 0) return result; uint256 ptr; assembly { ptr := add(0x20, result) } copy(item.memPtr, ptr, item.len); return result; } // any non-zero byte except "0x80" is considered true function toBoolean(RLPItem memory item) internal pure returns (bool) { require(item.len == 1); uint256 result; uint256 memPtr = item.memPtr; assembly { result := byte(0, mload(memPtr)) } // SEE Github Issue #5. // Summary: Most commonly used RLP libraries (i.e Geth) will encode // "0" as "0x80" instead of as "0". We handle this edge case explicitly // here. if (result == 0 || result == STRING_SHORT_START) { return false; } else { return true; } } function toAddress(RLPItem memory item) internal pure returns (address) { // 1 byte for the length prefix require(item.len == 21); return address(uint160(toUint(item))); } function toUint(RLPItem memory item) internal pure returns (uint256) { require(item.len > 0 && item.len <= 33); (uint256 memPtr, uint256 len) = payloadLocation(item); uint256 result; assembly { result := mload(memPtr) // shift to the correct location if neccesary if lt(len, 32) { result := div(result, exp(256, sub(32, len))) } } return result; } // enforces 32 byte length function toUintStrict(RLPItem memory item) internal pure returns (uint256) { // one byte prefix require(item.len == 33); uint256 result; uint256 memPtr = item.memPtr + 1; assembly { result := mload(memPtr) } return result; } function toBytes(RLPItem memory item) internal pure returns (bytes memory) { require(item.len > 0); (uint256 memPtr, uint256 len) = payloadLocation(item); bytes memory result = new bytes(len); uint256 destPtr; assembly { destPtr := add(0x20, result) } copy(memPtr, destPtr, len); return result; } /* * Private Helpers */ // @return number of payload items inside an encoded list. function numItems(RLPItem memory item) private pure returns (uint256) { if (item.len == 0) return 0; uint256 count = 0; uint256 currPtr = item.memPtr + _payloadOffset(item.memPtr); uint256 endPtr = item.memPtr + item.len; while (currPtr < endPtr) { currPtr = currPtr + _itemLength(currPtr); // skip over an item count++; } return count; } // @return entire rlp item byte length function _itemLength(uint256 memPtr) private pure returns (uint256) { uint256 itemLen; uint256 byte0; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < STRING_SHORT_START) { itemLen = 1; } else if (byte0 < STRING_LONG_START) { itemLen = byte0 - STRING_SHORT_START + 1; } else if (byte0 < LIST_SHORT_START) { assembly { let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is memPtr := add(memPtr, 1) // skip over the first byte /* 32 byte word size */ let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len itemLen := add(dataLen, add(byteLen, 1)) } } else if (byte0 < LIST_LONG_START) { itemLen = byte0 - LIST_SHORT_START + 1; } else { assembly { let byteLen := sub(byte0, 0xf7) memPtr := add(memPtr, 1) let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length itemLen := add(dataLen, add(byteLen, 1)) } } return itemLen; } // @return number of bytes until the data function _payloadOffset(uint256 memPtr) private pure returns (uint256) { uint256 byte0; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < STRING_SHORT_START) { return 0; } else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)) { return 1; } else if (byte0 < LIST_SHORT_START) { // being explicit return byte0 - (STRING_LONG_START - 1) + 1; } else { return byte0 - (LIST_LONG_START - 1) + 1; } } /* * @param src Pointer to source * @param dest Pointer to destination * @param len Amount of memory to copy from the source */ function copy(uint256 src, uint256 dest, uint256 len) private pure { if (len == 0) return; // copy as many word sizes as possible for (; len >= WORD_SIZE; len -= WORD_SIZE) { assembly { mstore(dest, mload(src)) } src += WORD_SIZE; dest += WORD_SIZE; } if (len > 0) { // left over bytes. Mask is used to remove unwanted bytes from the word uint256 mask = 256**(WORD_SIZE - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) // zero out src let destpart := and(mload(dest), mask) // retrieve the bytes mstore(dest, or(destpart, srcpart)) } } } }
// SPDX-License-Identifier: MIT
// Copied from https://github.com/lidofinance/curve-merkle-oracle/blob/1033b3e84142317ffd8f366b52e489d5eb49c73f/contracts/MerklePatriciaProofVerifier.sol
/**
* Copied from https://github.com/lorenzb/proveth/blob/c74b20e/onchain/ProvethVerifier.sol
* with minor performance and code style-related modifications.
*/
pragma solidity ^0.8.19;
import { RLPReader } from "rlp/RLPReader.sol";
library MerklePatriciaProofVerifier {
using RLPReader for RLPReader.RLPItem;
using RLPReader for bytes;
/// @dev Validates a Merkle-Patricia-Trie proof.
/// If the proof proves the inclusion of some key-value pair in the
/// trie, the value is returned. Otherwise, i.e. if the proof proves
/// the exclusion of a key from the trie, an empty byte array is
/// returned.
/// @param rootHash is the Keccak-256 hash of the root node of the MPT.
/// @param path is the key of the node whose inclusion/exclusion we are
/// proving.
/// @param stack is the stack of MPT nodes (starting with the root) that
/// need to be traversed during verification.
/// @return value whose inclusion is proved or an empty byte array for
/// a proof of exclusion
function extractProofValue(
bytes32 rootHash,
bytes memory path,
RLPReader.RLPItem[] memory stack
) internal pure returns (bytes memory value) {
bytes memory mptKey = _decodeNibbles(path, 0);
uint256 mptKeyOffset = 0;
bytes32 nodeHashHash;
RLPReader.RLPItem[] memory node;
RLPReader.RLPItem memory rlpValue;
if (stack.length == 0) {
// Root hash of empty Merkle-Patricia-Trie
require(rootHash == 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421);
return new bytes(0);
}
// Traverse stack of nodes starting at root.
for (uint256 i = 0; i < stack.length; i++) {
// We use the fact that an rlp encoded list consists of some
// encoding of its length plus the concatenation of its
// *rlp-encoded* items.
// The root node is hashed with Keccak-256 ...
if (i == 0 && rootHash != stack[i].rlpBytesKeccak256()) {
revert();
}
// ... whereas all other nodes are hashed with the MPT
// hash function.
if (i != 0 && nodeHashHash != _mptHashHash(stack[i])) {
revert();
}
// We verified that stack[i] has the correct hash, so we
// may safely decode it.
node = stack[i].toList();
if (node.length == 2) {
// Extension or Leaf node
bool isLeaf;
bytes memory nodeKey;
(isLeaf, nodeKey) = _merklePatriciaCompactDecode(node[0].toBytes());
uint256 prefixLength = _sharedPrefixLength(mptKeyOffset, mptKey, nodeKey);
mptKeyOffset += prefixLength;
if (prefixLength < nodeKey.length) {
// Proof claims divergent extension or leaf. (Only
// relevant for proofs of exclusion.)
// An Extension/Leaf node is divergent iff it "skips" over
// the point at which a Branch node should have been had the
// excluded key been included in the trie.
// Example: Imagine a proof of exclusion for path [1, 4],
// where the current node is a Leaf node with
// path [1, 3, 3, 7]. For [1, 4] to be included, there
// should have been a Branch node at [1] with a child
// at 3 and a child at 4.
// Sanity check
if (i < stack.length - 1) {
// divergent node must come last in proof
revert();
}
return new bytes(0);
}
if (isLeaf) {
// Sanity check
if (i < stack.length - 1) {
// leaf node must come last in proof
revert();
}
if (mptKeyOffset < mptKey.length) {
return new bytes(0);
}
rlpValue = node[1];
return rlpValue.toBytes();
} else {
// extension
// Sanity check
if (i == stack.length - 1) {
// shouldn't be at last level
revert();
}
if (!node[1].isList()) {
// rlp(child) was at least 32 bytes. node[1] contains
// Keccak256(rlp(child)).
nodeHashHash = node[1].payloadKeccak256();
} else {
// rlp(child) was less than 32 bytes. node[1] contains
// rlp(child).
nodeHashHash = node[1].rlpBytesKeccak256();
}
}
} else if (node.length == 17) {
// Branch node
if (mptKeyOffset != mptKey.length) {
// we haven't consumed the entire path, so we need to look at a child
uint8 nibble = uint8(mptKey[mptKeyOffset]);
mptKeyOffset += 1;
if (nibble >= 16) {
// each element of the path has to be a nibble
revert();
}
if (_isEmptyBytesequence(node[nibble])) {
// Sanity
if (i != stack.length - 1) {
// leaf node should be at last level
revert();
}
return new bytes(0);
} else if (!node[nibble].isList()) {
nodeHashHash = node[nibble].payloadKeccak256();
} else {
nodeHashHash = node[nibble].rlpBytesKeccak256();
}
} else {
// we have consumed the entire mptKey, so we need to look at what's contained in this node.
// Sanity
if (i != stack.length - 1) {
// should be at last level
revert();
}
return node[16].toBytes();
}
}
}
}
/// @dev Computes the hash of the Merkle-Patricia-Trie hash of the RLP item.
/// Merkle-Patricia-Tries use a weird "hash function" that outputs
/// *variable-length* hashes: If the item is shorter than 32 bytes,
/// the MPT hash is the item. Otherwise, the MPT hash is the
/// Keccak-256 hash of the item.
/// The easiest way to compare variable-length byte sequences is
/// to compare their Keccak-256 hashes.
/// @param item The RLP item to be hashed.
/// @return Keccak-256(MPT-hash(item))
function _mptHashHash(RLPReader.RLPItem memory item) private pure returns (bytes32) {
if (item.len < 32) {
return item.rlpBytesKeccak256();
} else {
return keccak256(abi.encodePacked(item.rlpBytesKeccak256()));
}
}
function _isEmptyBytesequence(RLPReader.RLPItem memory item) private pure returns (bool) {
if (item.len != 1) {
return false;
}
uint8 b;
uint256 memPtr = item.memPtr;
assembly {
b := byte(0, mload(memPtr))
}
return b == 0x80; /* empty byte string */
}
function _merklePatriciaCompactDecode(
bytes memory compact
) private pure returns (bool isLeaf, bytes memory nibbles) {
require(compact.length > 0);
uint256 first_nibble = (uint8(compact[0]) >> 4) & 0xF;
uint256 skipNibbles;
if (first_nibble == 0) {
skipNibbles = 2;
isLeaf = false;
} else if (first_nibble == 1) {
skipNibbles = 1;
isLeaf = false;
} else if (first_nibble == 2) {
skipNibbles = 2;
isLeaf = true;
} else if (first_nibble == 3) {
skipNibbles = 1;
isLeaf = true;
} else {
// Not supposed to happen!
revert();
}
return (isLeaf, _decodeNibbles(compact, skipNibbles));
}
function _decodeNibbles(bytes memory compact, uint256 skipNibbles) private pure returns (bytes memory nibbles) {
require(compact.length > 0);
uint256 length = compact.length * 2;
require(skipNibbles <= length);
length -= skipNibbles;
nibbles = new bytes(length);
uint256 nibblesLength = 0;
for (uint256 i = skipNibbles; i < skipNibbles + length; i += 1) {
if (i % 2 == 0) {
nibbles[nibblesLength] = bytes1((uint8(compact[i / 2]) >> 4) & 0xF);
} else {
nibbles[nibblesLength] = bytes1((uint8(compact[i / 2]) >> 0) & 0xF);
}
nibblesLength += 1;
}
assert(nibblesLength == nibbles.length);
}
function _sharedPrefixLength(uint256 xsOffset, bytes memory xs, bytes memory ys) private pure returns (uint256) {
uint256 i;
for (i = 0; i + xsOffset < xs.length && i < ys.length; i++) {
if (xs[i + xsOffset] != ys[i]) {
return i;
}
}
return i;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @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/",
"@arbitrum/=node_modules/@arbitrum/",
"@chainlink/=node_modules/@chainlink/",
"@eth-optimism/=node_modules/@eth-optimism/",
"@mean-finance/=node_modules/@mean-finance/",
"@offchainlabs/=node_modules/@offchainlabs/",
"@openzeppelin/=node_modules/@openzeppelin/",
"@rari-capital/=node_modules/@rari-capital/",
"@safe-global/=node_modules/@safe-global/",
"@uniswap/=node_modules/@uniswap/",
"base64-sol/=node_modules/base64-sol/",
"frax-standard-solidity/=node_modules/frax-standard-solidity/",
"hardhat/=node_modules/hardhat/",
"prb-math/=node_modules/prb-math/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
"solidity-rlp/=node_modules/solidity-rlp/"
],
"optimizer": {
"enabled": false,
"runs": 1000000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_stateRootOracle","type":"address"},{"internalType":"address","name":"_timelockAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OnlyPendingTimelock","type":"error"},{"inputs":[],"name":"OnlyTimelock","type":"error"},{"inputs":[{"internalType":"address","name":"fraxOracleLayer1","type":"address"},{"internalType":"address","name":"fraxOracleLayer2","type":"address"}],"name":"OraclePairAlreadySet","type":"error"},{"inputs":[],"name":"WrongOracleAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fraxOracleLayer1","type":"address"},{"indexed":true,"internalType":"address","name":"fraxOracleLayer2","type":"address"}],"name":"OraclePairAdded","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":"STATE_ROOT_ORACLE","outputs":[{"internalType":"contract IStateRootOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptTransferTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"layer1FraxOracle","type":"address"},{"internalType":"address","name":"layer2FraxOracle","type":"address"}],"internalType":"struct MerkleProofPriceSourceChainlink.OraclePair[]","name":"_oraclePairs","type":"tuple[]"}],"name":"addOraclePairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPriceSourceReceiver","name":"_fraxOracleLayer2","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"bytes[]","name":"_accountProofOracle","type":"bytes[]"},{"internalType":"bytes[]","name":"_storageProofOracle","type":"bytes[]"},{"internalType":"bytes[]","name":"_accountProofAggregator","type":"bytes[]"},{"internalType":"bytes[]","name":"_storageProofAggregator","type":"bytes[]"},{"internalType":"bytes[]","name":"_storageProofAggregator1","type":"bytes[]"}],"name":"addRoundDataChainlink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"layer2FraxOracle","type":"address"}],"name":"oracleLookup","outputs":[{"internalType":"address","name":"layer1FraxOracle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTimelockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceTimelock","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"}]Contract Creation Code
60a06040523480156200001157600080fd5b50604051620030f0380380620030f08339818101604052810190620000379190620002f7565b33600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200008981620000f660201b60201c565b620000ba7fbe8ff0c400000000000000000000000000000000000000000000000000000000620001b660201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505050620003c1565b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc660405160405180910390a380600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160362000221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000218906200039f565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002bf8262000292565b9050919050565b620002d181620002b2565b8114620002dd57600080fd5b50565b600081519050620002f181620002c6565b92915050565b600080604083850312156200031157620003106200028d565b5b60006200032185828601620002e0565b92505060206200033485828601620002e0565b9150509250929050565b600082825260208201905092915050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b600062000387601c836200033e565b915062000394826200034f565b602082019050919050565b60006020820190508181036000830152620003ba8162000378565b9050919050565b608051612d0c620003e46000396000818161044201526107990152612d0c6000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80634f8b4ae711610076578063a6d7fdf21161005b578063a6d7fdf21461018f578063edb219c0146101ab578063f6ccaad4146101db576100be565b80634f8b4ae7146101675780639378ca5614610171576100be565b8063235f72bc116100a7578063235f72bc14610111578063450140951461012d5780634bc66f3214610149576100be565b806301ffc9a7146100c3578063090f3f50146100f3575b600080fd5b6100dd60048036038101906100d89190611ffa565b6101e5565b6040516100ea9190612042565b60405180910390f35b6100fb61025c565b604051610108919061209e565b60405180910390f35b61012b60048036038101906101269190612359565b610282565b005b610147600480360381019061014291906124b3565b6103e0565b005b6101516103f4565b60405161015e919061209e565b60405180910390f35b61016f61041a565b005b610179610440565b604051610186919061253f565b60405180910390f35b6101a960048036038101906101a491906125b5565b610464565b005b6101c560048036038101906101c091906124b3565b6106e3565b6040516101d2919061209e565b60405180910390f35b6101e3610716565b005b60006101f082610728565b806102555750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361034c576040517f17e740e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061035e838a8a8a8a8a8a610792565b915091508973ffffffffffffffffffffffffffffffffffffffff166345d9f58260008485856040518563ffffffff1660e01b81526004016103a2949392919061264a565b600060405180830381600087803b1580156103bc57600080fd5b505af11580156103d0573d6000803e3d6000fd5b5050505050505050505050505050565b6103e8610910565b6103f181610999565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610422610910565b61042a610a59565b6104346000610999565b61043e6000610ae2565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b61046c610910565b60005b828290508110156106de57600083838381811061048f5761048e61268f565b5b9050604002018036038101906104a59190612713565b9050600073ffffffffffffffffffffffffffffffffffffffff1660036000836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e45760036000826020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681602001516040517f729d6d9c0000000000000000000000000000000000000000000000000000000081526004016105db929190612740565b60405180910390fd5b806000015160036000836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806020015173ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff167fc662d74d8469d456352095edb1ed6a69f64c66ace9fa3598de77edfccfad12a260405160405180910390a350806106d790612798565b905061046f565b505050565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61071e610a59565b610726610ba2565b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb141cf48a6040518263ffffffff1660e01b81526004016107f091906127ef565b6040805180830381865afa15801561080c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083091906128bc565b9050600061084382600001518c8b610bef565b9050600061085a8260600151600260001b8b610cea565b6020015190506000601082901c9050600061087a8560000151838c610bef565b905060006108918260600151602b60001b8c610cea565b602001519050600060b082901c905060008163ffffffff16602c6040516020016108bc92919061290a565b60405160208183030381529060405280519060200120905060006108e58560600151838e610cea565b602001519050600060c082901c905081819b509b505050505050505050505097509795505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610997576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a60405160405180910390a350565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ae0576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc660405160405180910390a380600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bed33610ae2565b565b610bf7611f21565b6000825167ffffffffffffffff811115610c1457610c13612143565b5b604051908082528060200260200182016040528015610c4d57816020015b610c3a611f58565b815260200190600190039081610c325790505b50905060005b8351811015610cae57610c7f848281518110610c7257610c7161268f565b5b6020026020010151610de5565b828281518110610c9257610c9161268f565b5b602002602001018190525080610ca790612798565b9050610c53565b50610ce084604051602001610cc3919061297e565b604051602081830303815290604052805190602001208683610e13565b9150509392505050565b610cf2611f72565b6000825167ffffffffffffffff811115610d0f57610d0e612143565b5b604051908082528060200260200182016040528015610d4857816020015b610d35611f58565b815260200190600190039081610d2d5790505b50905060005b8351811015610da957610d7a848281518110610d6d57610d6c61268f565b5b6020026020010151610de5565b828281518110610d8d57610d8c61268f565b5b602002602001018190525080610da290612798565b9050610d4e565b50610ddb84604051602001610dbe91906129ba565b604051602081830303815290604052805190602001208683610f60565b9150509392505050565b610ded611f58565b600060208301905060405180604001604052808451815260200182815250915050919050565b610e1b611f21565b6000610e478486604051602001610e3291906129ba565b60405160208183030381529060405285610fdf565b9050610e51611f21565b6000825103610e64578092505050610f59565b6000610e77610e7284610de5565b611559565b90506004815114610e8757600080fd5b6001826000019015159081151581525050610ebc81600081518110610eaf57610eae61268f565b5b602002602001015161166e565b826020018181525050610ee981600181518110610edc57610edb61268f565b5b602002602001015161166e565b826040018181525050610f1681600281518110610f0957610f0861268f565b5b602002602001015161166e565b60001b826060018181525050610f4681600381518110610f3957610f3861268f565b5b602002602001015161166e565b60001b8260800181815250508193505050505b9392505050565b610f68611f72565b6000610f948486604051602001610f7f91906129ba565b60405160208183030381529060405285610fdf565b9050610f9e611f72565b6000825114610fd3576001816000019015159081151581525050610fc9610fc483610de5565b61166e565b8160200181815250505b80925050509392505050565b60606000610fee8460006116c8565b90506000806060610ffd611f58565b600087510361108f577f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42160001b891461103557600080fd5b600067ffffffffffffffff8111156110505761104f612143565b5b6040519080825280601f01601f1916602001820160405280156110825781602001600182028036833780820191505090505b5095505050505050611552565b60005b875181101561154b576000811480156110cd57506110c98882815181106110bc576110bb61268f565b5b60200260200101516118bd565b8a14155b156110d757600080fd5b6000811415801561110a57506111068882815181106110f9576110f861268f565b5b60200260200101516118e2565b8414155b1561111457600080fd5b61113788828151811061112a5761112961268f565b5b6020026020010151611559565b92506002835103611371576000606061117261116d866000815181106111605761115f61268f565b5b6020026020010151611938565b6119cb565b80925081935050506000611187888a84611a83565b9050808861119591906129d5565b975081518110156112185760018b516111ae9190612a09565b8410156111ba57600080fd5b600067ffffffffffffffff8111156111d5576111d4612143565b5b6040519080825280601f01601f1916602001820160405280156112075781602001600182028036833780820191505090505b509950505050505050505050611552565b82156112d65760018b5161122c9190612a09565b84101561123857600080fd5b885188101561129f57600067ffffffffffffffff81111561125c5761125b612143565b5b6040519080825280601f01601f19166020018201604052801561128e5781602001600182028036833780820191505090505b509950505050505050505050611552565b856001815181106112b3576112b261268f565b5b602002602001015194506112c685611938565b9950505050505050505050611552565b60018b516112e49190612a09565b84036112ef57600080fd5b611313866001815181106113065761130561268f565b5b6020026020010151611b63565b6113425761133b8660018151811061132e5761132d61268f565b5b6020026020010151611bb0565b9650611369565b611366866001815181106113595761135861268f565b5b60200260200101516118bd565b96505b505050611538565b601183510361153757855185146114ec5760008686815181106113975761139661268f565b5b602001015160f81c60f81b60f81c90506001866113b491906129d5565b955060108160ff16106113c657600080fd5b6113ec848260ff16815181106113df576113de61268f565b5b6020026020010151611bd4565b1561146657600189516113ff9190612a09565b821461140a57600080fd5b600067ffffffffffffffff81111561142557611424612143565b5b6040519080825280601f01601f1916602001820160405280156114575781602001600182028036833780820191505090505b50975050505050505050611552565b61148c848260ff168151811061147f5761147e61268f565b5b6020026020010151611b63565b6114bd576114b6848260ff16815181106114a9576114a861268f565b5b6020026020010151611bb0565b94506114e6565b6114e3848260ff16815181106114d6576114d561268f565b5b60200260200101516118bd565b94505b50611536565b600188516114fa9190612a09565b811461150557600080fd5b6115298360108151811061151c5761151b61268f565b5b6020026020010151611938565b9650505050505050611552565b5b5b808061154390612798565b915050611092565b5050505050505b9392505050565b606061156482611b63565b61156d57600080fd5b600061157883611c0d565b905060008167ffffffffffffffff81111561159657611595612143565b5b6040519080825280602002602001820160405280156115cf57816020015b6115bc611f58565b8152602001906001900390816115b45790505b50905060006115e18560200151611c9a565b85602001516115f091906129d5565b9050600080600090505b848110156116615761160b83611d59565b91506040518060400160405280838152602001848152508482815181106116355761163461268f565b5b6020026020010181905250818361164c91906129d5565b9250808061165990612798565b9150506115fa565b5082945050505050919050565b600080826000015111801561168857506021826000015111155b61169157600080fd5b60008061169d84611e35565b9150915060008251905060208210156116bd57816020036101000a810490505b809350505050919050565b606060008351116116d857600080fd5b6000600284516116e89190612a3d565b9050808311156116f757600080fd5b82816117039190612a09565b90508067ffffffffffffffff81111561171f5761171e612143565b5b6040519080825280601f01601f1916602001820160405280156117515781602001600182028036833780820191505090505b5091506000808490505b828561176791906129d5565b8110156118a357600060028261177d9190612aae565b0361180357600f6004876002846117949190612adf565b815181106117a5576117a461268f565b5b602001015160f81c60f81b60f81c60ff16901c1660f81b8483815181106117cf576117ce61268f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611880565b600f6000876002846118159190612adf565b815181106118265761182561268f565b5b602001015160f81c60f81b60f81c60ff16901c1660f81b8483815181106118505761184f61268f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60018261188d91906129d5565b915060018161189c91906129d5565b905061175b565b50825181146118b5576118b4612b10565b5b505092915050565b6000808260200151905060008360000151905060008183209050809350505050919050565b6000602082600001511015611901576118fa826118bd565b9050611933565b61190a826118bd565b60405160200161191a91906129ba565b6040516020818303038152906040528051906020012090505b919050565b6060600082600001511161194b57600080fd5b60008061195784611e35565b9150915060008167ffffffffffffffff81111561197757611976612143565b5b6040519080825280601f01601f1916602001820160405280156119a95781602001600182028036833780820191505090505b50905060008160200190506119bf848285611e7f565b81945050505050919050565b6000606060008351116119dd57600080fd5b6000600f6004856000815181106119f7576119f661268f565b5b602001015160f81c60f81b60f81c60ff16901c1660ff1690506000808203611a26576002905060009350611a6d565b60018203611a3b576001905060009350611a6c565b60028203611a50576002905060019350611a6b565b60038203611a65576001905060019350611a6a565b600080fd5b5b5b5b83611a7886836116c8565b935093505050915091565b600080600090505b83518582611a9991906129d5565b108015611aa65750825181105b15611b5757828181518110611abe57611abd61268f565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848683611af891906129d5565b81518110611b0957611b0861268f565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b445780915050611b5c565b8080611b4f90612798565b915050611a8b565b809150505b9392505050565b600080826000015103611b795760009050611bab565b60008083602001519050805160001a915060c060ff168260ff161015611ba457600092505050611bab565b6001925050505b919050565b6000806000611bbe84611e35565b9150915060008183209050809350505050919050565b60006001826000015114611beb5760009050611c08565b60008083602001519050805160001a915060808260ff1614925050505b919050565b600080826000015103611c235760009050611c95565b600080611c338460200151611c9a565b8460200151611c4291906129d5565b9050600084600001518560200151611c5a91906129d5565b90505b80821015611c8e57611c6e82611d59565b82611c7991906129d5565b91508280611c8690612798565b935050611c5d565b8293505050505b919050565b600080825160001a9050608060ff16811015611cba576000915050611d54565b60b860ff16811080611cdf575060c060ff168110158015611cde575060f860ff1681105b5b15611cee576001915050611d54565b60c060ff16811015611d295760018060b8611d099190612b4c565b60ff1682611d179190612a09565b611d2191906129d5565b915050611d54565b60018060f8611d389190612b4c565b60ff1682611d469190612a09565b611d5091906129d5565b9150505b919050565b6000806000835160001a9050608060ff16811015611d7a5760019150611e2b565b60b860ff16811015611da9576001608060ff1682611d989190612a09565b611da291906129d5565b9150611e2a565b60c060ff16811015611dd95760b78103600185019450806020036101000a85510460018201810193505050611e29565b60f860ff16811015611e0857600160c060ff1682611df79190612a09565b611e0191906129d5565b9150611e28565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b6000806000611e478460200151611c9a565b90506000818560200151611e5b91906129d5565b90506000828660000151611e6f9190612a09565b9050818194509450505050915091565b6000810315611f1c575b602060ff168110611ed35782518252602060ff1683611ea891906129d5565b9250602060ff1682611eba91906129d5565b9150602060ff1681611ecc9190612a09565b9050611e89565b6000811115611f1b576000600182602060ff16611ef09190612a09565b610100611efd9190612cb4565b611f079190612a09565b905080198451168184511681811785525050505b5b505050565b6040518060a00160405280600015158152602001600081526020016000815260200160008019168152602001600080191681525090565b604051806040016040528060008152602001600081525090565b6040518060400160405280600015158152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fd781611fa2565b8114611fe257600080fd5b50565b600081359050611ff481611fce565b92915050565b6000602082840312156120105761200f611f98565b5b600061201e84828501611fe5565b91505092915050565b60008115159050919050565b61203c81612027565b82525050565b60006020820190506120576000830184612033565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120888261205d565b9050919050565b6120988161207d565b82525050565b60006020820190506120b3600083018461208f565b92915050565b60006120c48261207d565b9050919050565b6120d4816120b9565b81146120df57600080fd5b50565b6000813590506120f1816120cb565b92915050565b6000819050919050565b61210a816120f7565b811461211557600080fd5b50565b60008135905061212781612101565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61217b82612132565b810181811067ffffffffffffffff8211171561219a57612199612143565b5b80604052505050565b60006121ad611f8e565b90506121b98282612172565b919050565b600067ffffffffffffffff8211156121d9576121d8612143565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff82111561220f5761220e612143565b5b61221882612132565b9050602081019050919050565b82818337600083830152505050565b6000612247612242846121f4565b6121a3565b905082815260208101848484011115612263576122626121ef565b5b61226e848285612225565b509392505050565b600082601f83011261228b5761228a61212d565b5b813561229b848260208601612234565b91505092915050565b60006122b76122b2846121be565b6121a3565b905080838252602082019050602084028301858111156122da576122d96121ea565b5b835b8181101561232157803567ffffffffffffffff8111156122ff576122fe61212d565b5b80860161230c8982612276565b855260208501945050506020810190506122dc565b5050509392505050565b600082601f8301126123405761233f61212d565b5b81356123508482602086016122a4565b91505092915050565b600080600080600080600060e0888a03121561237857612377611f98565b5b60006123868a828b016120e2565b97505060206123978a828b01612118565b965050604088013567ffffffffffffffff8111156123b8576123b7611f9d565b5b6123c48a828b0161232b565b955050606088013567ffffffffffffffff8111156123e5576123e4611f9d565b5b6123f18a828b0161232b565b945050608088013567ffffffffffffffff81111561241257612411611f9d565b5b61241e8a828b0161232b565b93505060a088013567ffffffffffffffff81111561243f5761243e611f9d565b5b61244b8a828b0161232b565b92505060c088013567ffffffffffffffff81111561246c5761246b611f9d565b5b6124788a828b0161232b565b91505092959891949750929550565b6124908161207d565b811461249b57600080fd5b50565b6000813590506124ad81612487565b92915050565b6000602082840312156124c9576124c8611f98565b5b60006124d78482850161249e565b91505092915050565b6000819050919050565b60006125056125006124fb8461205d565b6124e0565b61205d565b9050919050565b6000612517826124ea565b9050919050565b60006125298261250c565b9050919050565b6125398161251e565b82525050565b60006020820190506125546000830184612530565b92915050565b600080fd5b60008083601f8401126125755761257461212d565b5b8235905067ffffffffffffffff8111156125925761259161255a565b5b6020830191508360408202830111156125ae576125ad6121ea565b5b9250929050565b600080602083850312156125cc576125cb611f98565b5b600083013567ffffffffffffffff8111156125ea576125e9611f9d565b5b6125f68582860161255f565b92509250509250929050565b60006cffffffffffffffffffffffffff82169050919050565b61262481612602565b82525050565b600064ffffffffff82169050919050565b6126448161262a565b82525050565b600060808201905061265f6000830187612033565b61266c602083018661261b565b612679604083018561261b565b612686606083018461263b565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000604082840312156126d9576126d86126be565b5b6126e360406121a3565b905060006126f38482850161249e565b60008301525060206127078482850161249e565b60208301525092915050565b60006040828403121561272957612728611f98565b5b6000612737848285016126c3565b91505092915050565b6000604082019050612755600083018561208f565b612762602083018461208f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127a3826120f7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036127d5576127d4612769565b5b600182019050919050565b6127e9816120f7565b82525050565b600060208201905061280460008301846127e0565b92915050565b6000819050919050565b61281d8161280a565b811461282857600080fd5b50565b60008151905061283a81612814565b92915050565b6128498161262a565b811461285457600080fd5b50565b60008151905061286681612840565b92915050565b600060408284031215612882576128816126be565b5b61288c60406121a3565b9050600061289c8482850161282b565b60008301525060206128b084828501612857565b60208301525092915050565b6000604082840312156128d2576128d1611f98565b5b60006128e08482850161286c565b91505092915050565b6000819050919050565b6129046128ff826120f7565b6128e9565b82525050565b600061291682856128f3565b60208201915061292682846128f3565b6020820191508190509392505050565b60008160601b9050919050565b600061294e82612936565b9050919050565b600061296082612943565b9050919050565b6129786129738261207d565b612955565b82525050565b600061298a8284612967565b60148201915081905092915050565b6000819050919050565b6129b46129af8261280a565b612999565b82525050565b60006129c682846129a3565b60208201915081905092915050565b60006129e0826120f7565b91506129eb836120f7565b9250828201905080821115612a0357612a02612769565b5b92915050565b6000612a14826120f7565b9150612a1f836120f7565b9250828203905081811115612a3757612a36612769565b5b92915050565b6000612a48826120f7565b9150612a53836120f7565b9250828202612a61816120f7565b91508282048414831517612a7857612a77612769565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ab9826120f7565b9150612ac4836120f7565b925082612ad457612ad3612a7f565b5b828206905092915050565b6000612aea826120f7565b9150612af5836120f7565b925082612b0557612b04612a7f565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600060ff82169050919050565b6000612b5782612b3f565b9150612b6283612b3f565b9250828203905060ff811115612b7b57612b7a612769565b5b92915050565b60008160011c9050919050565b6000808291508390505b6001851115612bd857808604811115612bb457612bb3612769565b5b6001851615612bc35780820291505b8081029050612bd185612b81565b9450612b98565b94509492505050565b600082612bf15760019050612cad565b81612bff5760009050612cad565b8160018114612c155760028114612c1f57612c4e565b6001915050612cad565b60ff841115612c3157612c30612769565b5b8360020a915084821115612c4857612c47612769565b5b50612cad565b5060208310610133831016604e8410600b8410161715612c835782820a905083811115612c7e57612c7d612769565b5b612cad565b612c908484846001612b8e565b92509050818404811115612ca757612ca6612769565b5b81810290505b9392505050565b6000612cbf826120f7565b9150612cca836120f7565b9250612cf77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612be1565b90509291505056fea164736f6c6343000813000a000000000000000000000000ed403d48e2bc946438b5686aa1ad65056ccf951200000000000000000000000031562ae726afebe25417df01bedc72ef489f45b3
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80634f8b4ae711610076578063a6d7fdf21161005b578063a6d7fdf21461018f578063edb219c0146101ab578063f6ccaad4146101db576100be565b80634f8b4ae7146101675780639378ca5614610171576100be565b8063235f72bc116100a7578063235f72bc14610111578063450140951461012d5780634bc66f3214610149576100be565b806301ffc9a7146100c3578063090f3f50146100f3575b600080fd5b6100dd60048036038101906100d89190611ffa565b6101e5565b6040516100ea9190612042565b60405180910390f35b6100fb61025c565b604051610108919061209e565b60405180910390f35b61012b60048036038101906101269190612359565b610282565b005b610147600480360381019061014291906124b3565b6103e0565b005b6101516103f4565b60405161015e919061209e565b60405180910390f35b61016f61041a565b005b610179610440565b604051610186919061253f565b60405180910390f35b6101a960048036038101906101a491906125b5565b610464565b005b6101c560048036038101906101c091906124b3565b6106e3565b6040516101d2919061209e565b60405180910390f35b6101e3610716565b005b60006101f082610728565b806102555750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361034c576040517f17e740e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061035e838a8a8a8a8a8a610792565b915091508973ffffffffffffffffffffffffffffffffffffffff166345d9f58260008485856040518563ffffffff1660e01b81526004016103a2949392919061264a565b600060405180830381600087803b1580156103bc57600080fd5b505af11580156103d0573d6000803e3d6000fd5b5050505050505050505050505050565b6103e8610910565b6103f181610999565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610422610910565b61042a610a59565b6104346000610999565b61043e6000610ae2565b565b7f000000000000000000000000ed403d48e2bc946438b5686aa1ad65056ccf951281565b61046c610910565b60005b828290508110156106de57600083838381811061048f5761048e61268f565b5b9050604002018036038101906104a59190612713565b9050600073ffffffffffffffffffffffffffffffffffffffff1660036000836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e45760036000826020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681602001516040517f729d6d9c0000000000000000000000000000000000000000000000000000000081526004016105db929190612740565b60405180910390fd5b806000015160036000836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806020015173ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff167fc662d74d8469d456352095edb1ed6a69f64c66ace9fa3598de77edfccfad12a260405160405180910390a350806106d790612798565b905061046f565b505050565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61071e610a59565b610726610ba2565b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060007f000000000000000000000000ed403d48e2bc946438b5686aa1ad65056ccf951273ffffffffffffffffffffffffffffffffffffffff1663bb141cf48a6040518263ffffffff1660e01b81526004016107f091906127ef565b6040805180830381865afa15801561080c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083091906128bc565b9050600061084382600001518c8b610bef565b9050600061085a8260600151600260001b8b610cea565b6020015190506000601082901c9050600061087a8560000151838c610bef565b905060006108918260600151602b60001b8c610cea565b602001519050600060b082901c905060008163ffffffff16602c6040516020016108bc92919061290a565b60405160208183030381529060405280519060200120905060006108e58560600151838e610cea565b602001519050600060c082901c905081819b509b505050505050505050505097509795505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610997576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a60405160405180910390a350565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ae0576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc660405160405180910390a380600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bed33610ae2565b565b610bf7611f21565b6000825167ffffffffffffffff811115610c1457610c13612143565b5b604051908082528060200260200182016040528015610c4d57816020015b610c3a611f58565b815260200190600190039081610c325790505b50905060005b8351811015610cae57610c7f848281518110610c7257610c7161268f565b5b6020026020010151610de5565b828281518110610c9257610c9161268f565b5b602002602001018190525080610ca790612798565b9050610c53565b50610ce084604051602001610cc3919061297e565b604051602081830303815290604052805190602001208683610e13565b9150509392505050565b610cf2611f72565b6000825167ffffffffffffffff811115610d0f57610d0e612143565b5b604051908082528060200260200182016040528015610d4857816020015b610d35611f58565b815260200190600190039081610d2d5790505b50905060005b8351811015610da957610d7a848281518110610d6d57610d6c61268f565b5b6020026020010151610de5565b828281518110610d8d57610d8c61268f565b5b602002602001018190525080610da290612798565b9050610d4e565b50610ddb84604051602001610dbe91906129ba565b604051602081830303815290604052805190602001208683610f60565b9150509392505050565b610ded611f58565b600060208301905060405180604001604052808451815260200182815250915050919050565b610e1b611f21565b6000610e478486604051602001610e3291906129ba565b60405160208183030381529060405285610fdf565b9050610e51611f21565b6000825103610e64578092505050610f59565b6000610e77610e7284610de5565b611559565b90506004815114610e8757600080fd5b6001826000019015159081151581525050610ebc81600081518110610eaf57610eae61268f565b5b602002602001015161166e565b826020018181525050610ee981600181518110610edc57610edb61268f565b5b602002602001015161166e565b826040018181525050610f1681600281518110610f0957610f0861268f565b5b602002602001015161166e565b60001b826060018181525050610f4681600381518110610f3957610f3861268f565b5b602002602001015161166e565b60001b8260800181815250508193505050505b9392505050565b610f68611f72565b6000610f948486604051602001610f7f91906129ba565b60405160208183030381529060405285610fdf565b9050610f9e611f72565b6000825114610fd3576001816000019015159081151581525050610fc9610fc483610de5565b61166e565b8160200181815250505b80925050509392505050565b60606000610fee8460006116c8565b90506000806060610ffd611f58565b600087510361108f577f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42160001b891461103557600080fd5b600067ffffffffffffffff8111156110505761104f612143565b5b6040519080825280601f01601f1916602001820160405280156110825781602001600182028036833780820191505090505b5095505050505050611552565b60005b875181101561154b576000811480156110cd57506110c98882815181106110bc576110bb61268f565b5b60200260200101516118bd565b8a14155b156110d757600080fd5b6000811415801561110a57506111068882815181106110f9576110f861268f565b5b60200260200101516118e2565b8414155b1561111457600080fd5b61113788828151811061112a5761112961268f565b5b6020026020010151611559565b92506002835103611371576000606061117261116d866000815181106111605761115f61268f565b5b6020026020010151611938565b6119cb565b80925081935050506000611187888a84611a83565b9050808861119591906129d5565b975081518110156112185760018b516111ae9190612a09565b8410156111ba57600080fd5b600067ffffffffffffffff8111156111d5576111d4612143565b5b6040519080825280601f01601f1916602001820160405280156112075781602001600182028036833780820191505090505b509950505050505050505050611552565b82156112d65760018b5161122c9190612a09565b84101561123857600080fd5b885188101561129f57600067ffffffffffffffff81111561125c5761125b612143565b5b6040519080825280601f01601f19166020018201604052801561128e5781602001600182028036833780820191505090505b509950505050505050505050611552565b856001815181106112b3576112b261268f565b5b602002602001015194506112c685611938565b9950505050505050505050611552565b60018b516112e49190612a09565b84036112ef57600080fd5b611313866001815181106113065761130561268f565b5b6020026020010151611b63565b6113425761133b8660018151811061132e5761132d61268f565b5b6020026020010151611bb0565b9650611369565b611366866001815181106113595761135861268f565b5b60200260200101516118bd565b96505b505050611538565b601183510361153757855185146114ec5760008686815181106113975761139661268f565b5b602001015160f81c60f81b60f81c90506001866113b491906129d5565b955060108160ff16106113c657600080fd5b6113ec848260ff16815181106113df576113de61268f565b5b6020026020010151611bd4565b1561146657600189516113ff9190612a09565b821461140a57600080fd5b600067ffffffffffffffff81111561142557611424612143565b5b6040519080825280601f01601f1916602001820160405280156114575781602001600182028036833780820191505090505b50975050505050505050611552565b61148c848260ff168151811061147f5761147e61268f565b5b6020026020010151611b63565b6114bd576114b6848260ff16815181106114a9576114a861268f565b5b6020026020010151611bb0565b94506114e6565b6114e3848260ff16815181106114d6576114d561268f565b5b60200260200101516118bd565b94505b50611536565b600188516114fa9190612a09565b811461150557600080fd5b6115298360108151811061151c5761151b61268f565b5b6020026020010151611938565b9650505050505050611552565b5b5b808061154390612798565b915050611092565b5050505050505b9392505050565b606061156482611b63565b61156d57600080fd5b600061157883611c0d565b905060008167ffffffffffffffff81111561159657611595612143565b5b6040519080825280602002602001820160405280156115cf57816020015b6115bc611f58565b8152602001906001900390816115b45790505b50905060006115e18560200151611c9a565b85602001516115f091906129d5565b9050600080600090505b848110156116615761160b83611d59565b91506040518060400160405280838152602001848152508482815181106116355761163461268f565b5b6020026020010181905250818361164c91906129d5565b9250808061165990612798565b9150506115fa565b5082945050505050919050565b600080826000015111801561168857506021826000015111155b61169157600080fd5b60008061169d84611e35565b9150915060008251905060208210156116bd57816020036101000a810490505b809350505050919050565b606060008351116116d857600080fd5b6000600284516116e89190612a3d565b9050808311156116f757600080fd5b82816117039190612a09565b90508067ffffffffffffffff81111561171f5761171e612143565b5b6040519080825280601f01601f1916602001820160405280156117515781602001600182028036833780820191505090505b5091506000808490505b828561176791906129d5565b8110156118a357600060028261177d9190612aae565b0361180357600f6004876002846117949190612adf565b815181106117a5576117a461268f565b5b602001015160f81c60f81b60f81c60ff16901c1660f81b8483815181106117cf576117ce61268f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611880565b600f6000876002846118159190612adf565b815181106118265761182561268f565b5b602001015160f81c60f81b60f81c60ff16901c1660f81b8483815181106118505761184f61268f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60018261188d91906129d5565b915060018161189c91906129d5565b905061175b565b50825181146118b5576118b4612b10565b5b505092915050565b6000808260200151905060008360000151905060008183209050809350505050919050565b6000602082600001511015611901576118fa826118bd565b9050611933565b61190a826118bd565b60405160200161191a91906129ba565b6040516020818303038152906040528051906020012090505b919050565b6060600082600001511161194b57600080fd5b60008061195784611e35565b9150915060008167ffffffffffffffff81111561197757611976612143565b5b6040519080825280601f01601f1916602001820160405280156119a95781602001600182028036833780820191505090505b50905060008160200190506119bf848285611e7f565b81945050505050919050565b6000606060008351116119dd57600080fd5b6000600f6004856000815181106119f7576119f661268f565b5b602001015160f81c60f81b60f81c60ff16901c1660ff1690506000808203611a26576002905060009350611a6d565b60018203611a3b576001905060009350611a6c565b60028203611a50576002905060019350611a6b565b60038203611a65576001905060019350611a6a565b600080fd5b5b5b5b83611a7886836116c8565b935093505050915091565b600080600090505b83518582611a9991906129d5565b108015611aa65750825181105b15611b5757828181518110611abe57611abd61268f565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848683611af891906129d5565b81518110611b0957611b0861268f565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611b445780915050611b5c565b8080611b4f90612798565b915050611a8b565b809150505b9392505050565b600080826000015103611b795760009050611bab565b60008083602001519050805160001a915060c060ff168260ff161015611ba457600092505050611bab565b6001925050505b919050565b6000806000611bbe84611e35565b9150915060008183209050809350505050919050565b60006001826000015114611beb5760009050611c08565b60008083602001519050805160001a915060808260ff1614925050505b919050565b600080826000015103611c235760009050611c95565b600080611c338460200151611c9a565b8460200151611c4291906129d5565b9050600084600001518560200151611c5a91906129d5565b90505b80821015611c8e57611c6e82611d59565b82611c7991906129d5565b91508280611c8690612798565b935050611c5d565b8293505050505b919050565b600080825160001a9050608060ff16811015611cba576000915050611d54565b60b860ff16811080611cdf575060c060ff168110158015611cde575060f860ff1681105b5b15611cee576001915050611d54565b60c060ff16811015611d295760018060b8611d099190612b4c565b60ff1682611d179190612a09565b611d2191906129d5565b915050611d54565b60018060f8611d389190612b4c565b60ff1682611d469190612a09565b611d5091906129d5565b9150505b919050565b6000806000835160001a9050608060ff16811015611d7a5760019150611e2b565b60b860ff16811015611da9576001608060ff1682611d989190612a09565b611da291906129d5565b9150611e2a565b60c060ff16811015611dd95760b78103600185019450806020036101000a85510460018201810193505050611e29565b60f860ff16811015611e0857600160c060ff1682611df79190612a09565b611e0191906129d5565b9150611e28565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b6000806000611e478460200151611c9a565b90506000818560200151611e5b91906129d5565b90506000828660000151611e6f9190612a09565b9050818194509450505050915091565b6000810315611f1c575b602060ff168110611ed35782518252602060ff1683611ea891906129d5565b9250602060ff1682611eba91906129d5565b9150602060ff1681611ecc9190612a09565b9050611e89565b6000811115611f1b576000600182602060ff16611ef09190612a09565b610100611efd9190612cb4565b611f079190612a09565b905080198451168184511681811785525050505b5b505050565b6040518060a00160405280600015158152602001600081526020016000815260200160008019168152602001600080191681525090565b604051806040016040528060008152602001600081525090565b6040518060400160405280600015158152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fd781611fa2565b8114611fe257600080fd5b50565b600081359050611ff481611fce565b92915050565b6000602082840312156120105761200f611f98565b5b600061201e84828501611fe5565b91505092915050565b60008115159050919050565b61203c81612027565b82525050565b60006020820190506120576000830184612033565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006120888261205d565b9050919050565b6120988161207d565b82525050565b60006020820190506120b3600083018461208f565b92915050565b60006120c48261207d565b9050919050565b6120d4816120b9565b81146120df57600080fd5b50565b6000813590506120f1816120cb565b92915050565b6000819050919050565b61210a816120f7565b811461211557600080fd5b50565b60008135905061212781612101565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61217b82612132565b810181811067ffffffffffffffff8211171561219a57612199612143565b5b80604052505050565b60006121ad611f8e565b90506121b98282612172565b919050565b600067ffffffffffffffff8211156121d9576121d8612143565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff82111561220f5761220e612143565b5b61221882612132565b9050602081019050919050565b82818337600083830152505050565b6000612247612242846121f4565b6121a3565b905082815260208101848484011115612263576122626121ef565b5b61226e848285612225565b509392505050565b600082601f83011261228b5761228a61212d565b5b813561229b848260208601612234565b91505092915050565b60006122b76122b2846121be565b6121a3565b905080838252602082019050602084028301858111156122da576122d96121ea565b5b835b8181101561232157803567ffffffffffffffff8111156122ff576122fe61212d565b5b80860161230c8982612276565b855260208501945050506020810190506122dc565b5050509392505050565b600082601f8301126123405761233f61212d565b5b81356123508482602086016122a4565b91505092915050565b600080600080600080600060e0888a03121561237857612377611f98565b5b60006123868a828b016120e2565b97505060206123978a828b01612118565b965050604088013567ffffffffffffffff8111156123b8576123b7611f9d565b5b6123c48a828b0161232b565b955050606088013567ffffffffffffffff8111156123e5576123e4611f9d565b5b6123f18a828b0161232b565b945050608088013567ffffffffffffffff81111561241257612411611f9d565b5b61241e8a828b0161232b565b93505060a088013567ffffffffffffffff81111561243f5761243e611f9d565b5b61244b8a828b0161232b565b92505060c088013567ffffffffffffffff81111561246c5761246b611f9d565b5b6124788a828b0161232b565b91505092959891949750929550565b6124908161207d565b811461249b57600080fd5b50565b6000813590506124ad81612487565b92915050565b6000602082840312156124c9576124c8611f98565b5b60006124d78482850161249e565b91505092915050565b6000819050919050565b60006125056125006124fb8461205d565b6124e0565b61205d565b9050919050565b6000612517826124ea565b9050919050565b60006125298261250c565b9050919050565b6125398161251e565b82525050565b60006020820190506125546000830184612530565b92915050565b600080fd5b60008083601f8401126125755761257461212d565b5b8235905067ffffffffffffffff8111156125925761259161255a565b5b6020830191508360408202830111156125ae576125ad6121ea565b5b9250929050565b600080602083850312156125cc576125cb611f98565b5b600083013567ffffffffffffffff8111156125ea576125e9611f9d565b5b6125f68582860161255f565b92509250509250929050565b60006cffffffffffffffffffffffffff82169050919050565b61262481612602565b82525050565b600064ffffffffff82169050919050565b6126448161262a565b82525050565b600060808201905061265f6000830187612033565b61266c602083018661261b565b612679604083018561261b565b612686606083018461263b565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000604082840312156126d9576126d86126be565b5b6126e360406121a3565b905060006126f38482850161249e565b60008301525060206127078482850161249e565b60208301525092915050565b60006040828403121561272957612728611f98565b5b6000612737848285016126c3565b91505092915050565b6000604082019050612755600083018561208f565b612762602083018461208f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127a3826120f7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036127d5576127d4612769565b5b600182019050919050565b6127e9816120f7565b82525050565b600060208201905061280460008301846127e0565b92915050565b6000819050919050565b61281d8161280a565b811461282857600080fd5b50565b60008151905061283a81612814565b92915050565b6128498161262a565b811461285457600080fd5b50565b60008151905061286681612840565b92915050565b600060408284031215612882576128816126be565b5b61288c60406121a3565b9050600061289c8482850161282b565b60008301525060206128b084828501612857565b60208301525092915050565b6000604082840312156128d2576128d1611f98565b5b60006128e08482850161286c565b91505092915050565b6000819050919050565b6129046128ff826120f7565b6128e9565b82525050565b600061291682856128f3565b60208201915061292682846128f3565b6020820191508190509392505050565b60008160601b9050919050565b600061294e82612936565b9050919050565b600061296082612943565b9050919050565b6129786129738261207d565b612955565b82525050565b600061298a8284612967565b60148201915081905092915050565b6000819050919050565b6129b46129af8261280a565b612999565b82525050565b60006129c682846129a3565b60208201915081905092915050565b60006129e0826120f7565b91506129eb836120f7565b9250828201905080821115612a0357612a02612769565b5b92915050565b6000612a14826120f7565b9150612a1f836120f7565b9250828203905081811115612a3757612a36612769565b5b92915050565b6000612a48826120f7565b9150612a53836120f7565b9250828202612a61816120f7565b91508282048414831517612a7857612a77612769565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ab9826120f7565b9150612ac4836120f7565b925082612ad457612ad3612a7f565b5b828206905092915050565b6000612aea826120f7565b9150612af5836120f7565b925082612b0557612b04612a7f565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600060ff82169050919050565b6000612b5782612b3f565b9150612b6283612b3f565b9250828203905060ff811115612b7b57612b7a612769565b5b92915050565b60008160011c9050919050565b6000808291508390505b6001851115612bd857808604811115612bb457612bb3612769565b5b6001851615612bc35780820291505b8081029050612bd185612b81565b9450612b98565b94509492505050565b600082612bf15760019050612cad565b81612bff5760009050612cad565b8160018114612c155760028114612c1f57612c4e565b6001915050612cad565b60ff841115612c3157612c30612769565b5b8360020a915084821115612c4857612c47612769565b5b50612cad565b5060208310610133831016604e8410600b8410161715612c835782820a905083811115612c7e57612c7d612769565b5b612cad565b612c908484846001612b8e565b92509050818404811115612ca757612ca6612769565b5b81810290505b9392505050565b6000612cbf826120f7565b9150612cca836120f7565b9250612cf77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612be1565b90509291505056fea164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ed403d48e2bc946438b5686aa1ad65056ccf951200000000000000000000000031562ae726afebe25417df01bedc72ef489f45b3
-----Decoded View---------------
Arg [0] : _stateRootOracle (address): 0xeD403d48e2bC946438B5686AA1AD65056Ccf9512
Arg [1] : _timelockAddress (address): 0x31562ae726AFEBe25417df01bEdC72EF489F45b3
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ed403d48e2bc946438b5686aa1ad65056ccf9512
Arg [1] : 00000000000000000000000031562ae726afebe25417df01bedc72ef489f45b3
Net Worth in USD
Net Worth in FRAX
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.