Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 31209007 | 18 hrs ago | 0 FRAX | |||||
| 31209007 | 18 hrs ago | 0 FRAX | |||||
| 31209007 | 18 hrs ago | 0 FRAX | |||||
| 31206525 | 19 hrs ago | 0 FRAX | |||||
| 31206525 | 19 hrs ago | 0 FRAX | |||||
| 31206525 | 19 hrs ago | 0 FRAX | |||||
| 31203769 | 21 hrs ago | 0 FRAX | |||||
| 31203769 | 21 hrs ago | 0 FRAX | |||||
| 31203769 | 21 hrs ago | 0 FRAX | |||||
| 31196265 | 25 hrs ago | 0 FRAX | |||||
| 31196265 | 25 hrs ago | 0 FRAX | |||||
| 31196265 | 25 hrs ago | 0 FRAX | |||||
| 31190874 | 28 hrs ago | 0 FRAX | |||||
| 31190874 | 28 hrs ago | 0 FRAX | |||||
| 31190874 | 28 hrs ago | 0 FRAX | |||||
| 31122284 | 2 days ago | 0 FRAX | |||||
| 31122284 | 2 days ago | 0 FRAX | |||||
| 31122284 | 2 days ago | 0 FRAX | |||||
| 31116321 | 2 days ago | 0 FRAX | |||||
| 31116321 | 2 days ago | 0 FRAX | |||||
| 31116321 | 2 days ago | 0 FRAX | |||||
| 31103081 | 3 days ago | 0 FRAX | |||||
| 31103081 | 3 days ago | 0 FRAX | |||||
| 31103081 | 3 days ago | 0 FRAX | |||||
| 31099792 | 3 days ago | 0 FRAX |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SfrxEthDualOracle
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: ISC
pragma solidity ^0.8.20;
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ======================== SFrxEthDualOracle =========================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance
// ====================================================================
import { Timelock2Step } from "frax-std/access-control/v1/Timelock2Step.sol";
import { ITimelock2Step } from "frax-std/access-control/v1/interfaces/ITimelock2Step.sol";
import { DualOracleBase, ConstructorParams as DualOracleBaseParams } from "../DualOracleBase.sol";
import { IDualOracle } from "interfaces/IDualOracle.sol";
import { ERC165Storage } from "src/contracts/utils/ERC165Storage.sol";
struct ConstructorParams {
address sfrxEthErc20;
address timelockAddress;
address sfrxEthRateOracle;
address frxEthOracle;
}
contract SfrxEthDualOracle is DualOracleBase, Timelock2Step, ERC165Storage {
address public immutable SFRXETH_ERC20;
IDualOracle public sfrxEthRateOracle;
IDualOracle public frxEthOracle;
constructor(
ConstructorParams memory _params
)
DualOracleBase(
DualOracleBaseParams({
baseToken0: address(840),
baseToken0Decimals: 18,
quoteToken0: _params.sfrxEthErc20,
quoteToken0Decimals: 18,
baseToken1: address(840),
baseToken1Decimals: 18,
quoteToken1: _params.sfrxEthErc20,
quoteToken1Decimals: 18
})
)
Timelock2Step()
{
SFRXETH_ERC20 = _params.sfrxEthErc20;
sfrxEthRateOracle = IDualOracle(_params.sfrxEthRateOracle);
frxEthOracle = IDualOracle(_params.frxEthOracle);
_setTimelock({ _newTimelock: _params.timelockAddress });
_registerInterface({ interfaceId: type(IDualOracle).interfaceId });
_registerInterface({ interfaceId: type(ITimelock2Step).interfaceId });
}
// ====================================================================
// View Helpers
// ====================================================================
function name() external pure returns (string memory) {
return "SfrxEth RedStone Dual Oracle + TWAP";
}
// ====================================================================
// Configuration Setters
// ====================================================================
/// @notice The ```setSfrxEthRateOracle``` function is a timelock gated setter to allow for the
/// `sfrxEthRateOracle` pointer to be updated
/// @param newOracle The address of the new oracle that we wish to update to
function setSfrxEthRateOracle(address newOracle) public {
_requireTimelock();
emit SfrxEthRateOracleUpdated(address(sfrxEthRateOracle), newOracle);
sfrxEthRateOracle = IDualOracle(newOracle);
}
/// @notice The ```setFrxEthOracle`` function is a timelock gated setter to allow for the
/// `frxEthOracle` pointer to be updated
/// @param newOracle The address of the new oracle we wish to update to
function setFrxEthOracle(address newOracle) public {
_requireTimelock();
emit FrxEthOracleUpdated(address(frxEthOracle), newOracle);
frxEthOracle = IDualOracle(newOracle);
}
// ====================================================================
// Price Functions
// ====================================================================
/// @notice The ```getPrices``` function is intended to return two prices from different oracles
/// @return _isBadData is true when data is stale or otherwise bad
/// @return _priceLow is the lower of the two prices
/// @return _priceHigh is the higher of the two prices
function _getPrices() internal view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) {
// Currently only oracle that can return valuable `isBadData` flag
(_isBadData, _priceLow, _priceHigh) = frxEthOracle.getPrices();
(, , uint256 rate18) = sfrxEthRateOracle.getPrices();
_priceLow = (_priceLow * ORACLE_PRECISION) / rate18;
_priceHigh = (_priceHigh * ORACLE_PRECISION) / rate18;
}
/// @notice The ```getPricesNormalized``` function returns the normalized prices in human readable form
/// @return _isBadDataNormal If the Redstone oracle is stale
/// @return _priceLowNormal The normalized low price
/// @return _priceHighNormal The normalized high price
function getPricesNormalized()
external
view
returns (bool _isBadDataNormal, uint256 _priceLowNormal, uint256 _priceHighNormal)
{
(bool _isBadData, uint256 _priceLow, uint256 _priceHigh) = _getPrices();
_isBadDataNormal = _isBadData;
_priceLowNormal = NORMALIZATION_0 > 0
? _priceLow * 10 ** uint256(NORMALIZATION_0)
: _priceLow / 10 ** (uint256(-NORMALIZATION_0));
_priceHighNormal = NORMALIZATION_1 > 0
? _priceHigh * 10 ** uint256(NORMALIZATION_1)
: _priceHigh / 10 ** (uint256(-NORMALIZATION_1));
}
/// @notice The ```getPrices``` function is intended to return two prices from different oracles
/// @return _isBadData is true when data is stale or otherwise bad
/// @return _priceLow is the lower of the two prices
/// @return _priceHigh is the higher of the two prices
function getPrices() external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh) {
return _getPrices();
}
/// @notice The ```SfrxEthRateOracleUpdated``` event is emitted when the oracle that fetches
/// the sfrxEth/frxEth price is changed
/// @param oldOracle The address of the previous oracle
/// @param newOracle The address of the updated oracle
event SfrxEthRateOracleUpdated(address oldOracle, address newOracle);
/// @notice The ```FrxEthOracleUpdated``` event is emitted when the oracle that fetches
/// the usd/frxEth price is changed
/// @param oldOracle The address of the previous oracle
/// @param newOracle The address of the updated oracle
event FrxEthOracleUpdated(address oldOracle, address newOracle);
}// 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.20;
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================== DualOracleBase ==========================
// ====================================================================
// Frax Finance: https://github.com/FraxFinance
// Author
// Drake Evans: https://github.com/DrakeEvans
// ====================================================================
import "interfaces/IDualOracle.sol";
struct ConstructorParams {
address baseToken0;
uint8 baseToken0Decimals;
address quoteToken0;
uint8 quoteToken0Decimals;
address baseToken1;
uint8 baseToken1Decimals;
address quoteToken1;
uint8 quoteToken1Decimals;
}
/// @title DualOracleBase
/// @author Drake Evans (Frax Finance) https://github.com/drakeevans
/// @notice Base Contract for Frax Dual Oracles
abstract contract DualOracleBase is IDualOracle {
/// @notice The precision of the oracle
uint256 public constant ORACLE_PRECISION = 1e18;
/// @notice The first quote token
address public immutable QUOTE_TOKEN_0;
/// @notice The first quote token decimals
uint256 public immutable QUOTE_TOKEN_0_DECIMALS;
/// @notice The second quote token
address public immutable QUOTE_TOKEN_1;
/// @notice The second quote token decimals
uint256 public immutable QUOTE_TOKEN_1_DECIMALS;
/// @notice The first base token
address public immutable BASE_TOKEN_0;
/// @notice The first base token decimals
uint256 public immutable BASE_TOKEN_0_DECIMALS;
/// @notice The second base token
address public immutable BASE_TOKEN_1;
/// @notice The second base token decimals
uint256 public immutable BASE_TOKEN_1_DECIMALS;
/// @notice The first normalization factor which accounts for different decimals across ERC20s
/// @dev Normalization = quoteTokenDecimals - baseTokenDecimals
int256 public immutable NORMALIZATION_0;
/// @notice The second normalization factor which accounts for different decimals across ERC20s
/// @dev Normalization = quoteTokenDecimals - baseTokenDecimals
int256 public immutable NORMALIZATION_1;
constructor(ConstructorParams memory _params) {
QUOTE_TOKEN_0 = _params.quoteToken0;
QUOTE_TOKEN_0_DECIMALS = _params.quoteToken0Decimals;
QUOTE_TOKEN_1 = _params.quoteToken1;
QUOTE_TOKEN_1_DECIMALS = _params.quoteToken1Decimals;
BASE_TOKEN_0 = _params.baseToken0;
BASE_TOKEN_0_DECIMALS = _params.baseToken0Decimals;
BASE_TOKEN_1 = _params.baseToken1;
BASE_TOKEN_1_DECIMALS = _params.baseToken1Decimals;
NORMALIZATION_0 = int256(QUOTE_TOKEN_0_DECIMALS) - int256(BASE_TOKEN_0_DECIMALS);
NORMALIZATION_1 = int256(QUOTE_TOKEN_1_DECIMALS) - int256(BASE_TOKEN_1_DECIMALS);
}
// ====================================================================
// View Helpers
// ====================================================================
function decimals() external pure returns (uint8) {
return 18;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
interface IDualOracle is IERC165 {
function ORACLE_PRECISION() external view returns (uint256);
function BASE_TOKEN_0() external view returns (address);
function BASE_TOKEN_0_DECIMALS() external view returns (uint256);
function BASE_TOKEN_1() external view returns (address);
function BASE_TOKEN_1_DECIMALS() external view returns (uint256);
function decimals() external view returns (uint8);
function getPricesNormalized() external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh);
function getPrices() external view returns (bool _isBadData, uint256 _priceLow, uint256 _priceHigh);
function name() external view returns (string memory);
function NORMALIZATION_0() external view returns (int256);
function NORMALIZATION_1() external view returns (int256);
function QUOTE_TOKEN_0() external view returns (address);
function QUOTE_TOKEN_0_DECIMALS() external view returns (uint256);
function QUOTE_TOKEN_1() external view returns (address);
function QUOTE_TOKEN_1_DECIMALS() external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol)
pragma solidity ^0.8.0;
import { ERC165 } from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
/**
* @dev Storage based implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165Storage is ERC165 {
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId];
}
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
* registering its interface id is not required.
*
* See {IERC165-supportsInterface}.
*
* Requirements:
*
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
*/
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}{
"remappings": [
"ds-test/=node_modules/ds-test/src/",
"forge-std/=node_modules/forge-std/src/",
"frax-std/=node_modules/frax-standard-solidity/src/",
"script/=src/script/",
"src/=src/",
"test/=src/test/",
"interfaces/=src/contracts/interfaces/",
"arbitrum/=node_modules/@arbitrum/",
"rlp/=node_modules/solidity-rlp/contracts/",
"@solmate/=node_modules/@rari-capital/solmate/src/",
"@arbitrum/=node_modules/@arbitrum/",
"@chainlink/=node_modules/@chainlink/",
"@mean-finance/=node_modules/@mean-finance/",
"@openzeppelin/=node_modules/@openzeppelin/",
"@rari-capital/=node_modules/@rari-capital/",
"@uniswap/=node_modules/@uniswap/",
"dev-fraxswap/=node_modules/dev-fraxswap/",
"frax-standard-solidity/=node_modules/frax-standard-solidity/",
"prb-math/=node_modules/prb-math/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
"solidity-rlp/=node_modules/solidity-rlp/"
],
"optimizer": {
"enabled": true,
"runs": 1000000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"components":[{"internalType":"address","name":"sfrxEthErc20","type":"address"},{"internalType":"address","name":"timelockAddress","type":"address"},{"internalType":"address","name":"sfrxEthRateOracle","type":"address"},{"internalType":"address","name":"frxEthOracle","type":"address"}],"internalType":"struct ConstructorParams","name":"_params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OnlyPendingTimelock","type":"error"},{"inputs":[],"name":"OnlyTimelock","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOracle","type":"address"},{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"FrxEthOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOracle","type":"address"},{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"SfrxEthRateOracleUpdated","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":"BASE_TOKEN_0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TOKEN_0_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TOKEN_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_TOKEN_1_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NORMALIZATION_0","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NORMALIZATION_1","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN_0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN_0_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN_1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUOTE_TOKEN_1_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SFRXETH_ERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptTransferTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"frxEthOracle","outputs":[{"internalType":"contract IDualOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrices","outputs":[{"internalType":"bool","name":"_isBadData","type":"bool"},{"internalType":"uint256","name":"_priceLow","type":"uint256"},{"internalType":"uint256","name":"_priceHigh","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricesNormalized","outputs":[{"internalType":"bool","name":"_isBadDataNormal","type":"bool"},{"internalType":"uint256","name":"_priceLowNormal","type":"uint256"},{"internalType":"uint256","name":"_priceHighNormal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"address","name":"newOracle","type":"address"}],"name":"setFrxEthOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOracle","type":"address"}],"name":"setSfrxEthRateOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sfrxEthRateOracle","outputs":[{"internalType":"contract IDualOracle","name":"","type":"address"}],"stateMutability":"view","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
6101e060405234801562000011575f80fd5b50604051620012d0380380620012d0833981016040819052620000349162000275565b60408051610100808201835261034880835260126020840181815286516001600160a01b0390811696860187905260608601838152608080880195865260a08089018681528b51851660c0808c0191825260e0808d01998a529c909452935160ff9081169283905293518516909252945182169098528651821690955290518416610120819052925116610140529351909116610160529091620000d9919062000305565b610180526101605160e051620000f0919062000305565b6101a0525060018054336001600160a01b03199182161790915581516001600160a01b039081166101c05260408301516003805484169183169190911790556060830151600480549093169116179055602081015162000150906200017b565b6200016263415f130360e01b620001d6565b62000174632fa3fc3160e21b620001d6565b5062000338565b6001546040516001600160a01b038084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160e01b03198082169003620002355760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319165f908152600260205260409020805460ff19166001179055565b80516001600160a01b038116811462000270575f80fd5b919050565b5f6080828403121562000286575f80fd5b604051608081016001600160401b0381118282101715620002b557634e487b7160e01b5f52604160045260245ffd5b604052620002c38362000259565b8152620002d36020840162000259565b6020820152620002e66040840162000259565b6040820152620002f96060840162000259565b60608201529392505050565b8181035f8312801583831316838312821617156200033157634e487b7160e01b5f52601160045260245ffd5b5092915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051610ef4620003dc5f395f6102c001525f81816101ad015281816106f30152818161071c015261075f01525f818161041b015281816106520152818161067b01526106be01525f6102e701525f61028a01525f6104b001525f61026301525f6103bd01525f61039601525f61048901525f6104620152610ef45ff3fe608060405234801561000f575f80fd5b50600436106101a4575f3560e01c80634f8b4ae7116100e8578063bd9a548b11610093578063e0d2e7801161006e578063e0d2e7801461045d578063e5a66dfa14610484578063f097486c146104ab578063f6ccaad4146104d2575f80fd5b8063bd9a548b1461040e578063c82f2b1214610416578063d7710f441461043d575f80fd5b8063781097d0116100c3578063781097d0146103b85780639c0d313f146103df5780639ed000e7146103ee575f80fd5b80634f8b4ae71461037657806353974d5f1461037e57806359c909e114610391575f80fd5b8063313ce56711610153578063450140951161012e5780634501409514610309578063492ed1b71461031e5780634bc66f32146103315780634d3375e814610351575f80fd5b8063313ce567146102ac5780633746692e146102bb57806337f85f66146102e2575f80fd5b8063090f3f5011610183578063090f3f501461021a578063116d79761461025e5780632088800414610285575f80fd5b806232e91a146101a857806301ffc9a7146101e257806306fdde0314610205575b5f80fd5b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6101f56101f0366004610bcf565b6104da565b60405190151581526020016101d9565b61020d610561565b6040516101d99190610c15565b5f546102399073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d9565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b604051601281526020016101d9565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b61031c610317366004610c7e565b610581565b005b61031c61032c366004610c7e565b610595565b6001546102399073ffffffffffffffffffffffffffffffffffffffff1681565b610359610638565b6040805193151584526020840192909252908201526060016101d9565b61031c610799565b61031c61038c366004610c7e565b6107bd565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6101cf670de0b6b3a764000081565b6003546102399073ffffffffffffffffffffffffffffffffffffffff1681565b610359610860565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6004546102399073ffffffffffffffffffffffffffffffffffffffff1681565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b61031c610876565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061055b57507fffffffff0000000000000000000000000000000000000000000000000000000082165f9081526002602052604090205460ff165b92915050565b6060604051806060016040528060238152602001610ec560239139905090565b610589610886565b610592816108d7565b50565b61059d610886565b6003546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f3a07253394227ca1e20891bab59e5701b25f82e87a4a03893195d28a6559fdcc910160405180910390a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f805f805f8061064661094b565b9250925092508295505f7f0000000000000000000000000000000000000000000000000000000000000000136106b95761069f7f0000000000000000000000000000000000000000000000000000000000000000610cde565b6106aa90600a610e32565b6106b49083610e3d565b6106ee565b6106e47f0000000000000000000000000000000000000000000000000000000000000000600a610e32565b6106ee9083610e75565b94505f7f00000000000000000000000000000000000000000000000000000000000000001361075a576107407f0000000000000000000000000000000000000000000000000000000000000000610cde565b61074b90600a610e32565b6107559082610e3d565b61078f565b6107857f0000000000000000000000000000000000000000000000000000000000000000600a610e32565b61078f9082610e75565b9350505050909192565b6107a1610886565b6107a9610ac2565b6107b25f6108d7565b6107bb5f610b12565b565b6107c5610886565b6004546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527ff72a7757dc9a9de5d1e9935e61961e5d261c96488503fa4291efe52789431d6e910160405180910390a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f805f61086b61094b565b925092509250909192565b61087e610ac2565b6107bb610b9f565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107bb576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a9190a350565b5f805f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd9a548b6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156109b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109dc9190610e8c565b600354604080517fbd9a548b00000000000000000000000000000000000000000000000000000000815290519497509295509093505f9273ffffffffffffffffffffffffffffffffffffffff9091169163bd9a548b9160048083019260609291908290030181865afa158015610a54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a789190610e8c565b9250505080670de0b6b3a764000084610a919190610e75565b610a9b9190610e3d565b925080610ab0670de0b6b3a764000084610e75565b610aba9190610e3d565b915050909192565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146107bb576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556107bb33610b12565b5f60208284031215610bdf575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c0e575f80fd5b9392505050565b5f6020808352835180828501525f5b81811015610c4057858101830151858201604001528201610c24565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215610c8e575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7f80000000000000000000000000000000000000000000000000000000000000008203610d0e57610d0e610cb1565b505f0390565b600181815b80851115610d6d57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d5357610d53610cb1565b80851615610d6057918102915b93841c9390800290610d19565b509250929050565b5f82610d835750600161055b565b81610d8f57505f61055b565b8160018114610da55760028114610daf57610dcb565b600191505061055b565b60ff841115610dc057610dc0610cb1565b50506001821b61055b565b5060208310610133831016604e8410600b8410161715610dee575081810a61055b565b610df88383610d14565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e2a57610e2a610cb1565b029392505050565b5f610c0e8383610d75565b5f82610e70577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761055b5761055b610cb1565b5f805f60608486031215610e9e575f80fd5b83518015158114610ead575f80fd5b60208501516040909501519096949550939250505056fe536672784574682052656453746f6e65204475616c204f7261636c65202b2054574150a164736f6c6343000814000a000000000000000000000000fc00000000000000000000000000000000000005000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b2000000000000000000000000ee095b7d9191603126da584a1179bb403a027c3a0000000000000000000000004b0ca693e29e5fd2aa39332a0387bbcd0f91a527
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101a4575f3560e01c80634f8b4ae7116100e8578063bd9a548b11610093578063e0d2e7801161006e578063e0d2e7801461045d578063e5a66dfa14610484578063f097486c146104ab578063f6ccaad4146104d2575f80fd5b8063bd9a548b1461040e578063c82f2b1214610416578063d7710f441461043d575f80fd5b8063781097d0116100c3578063781097d0146103b85780639c0d313f146103df5780639ed000e7146103ee575f80fd5b80634f8b4ae71461037657806353974d5f1461037e57806359c909e114610391575f80fd5b8063313ce56711610153578063450140951161012e5780634501409514610309578063492ed1b71461031e5780634bc66f32146103315780634d3375e814610351575f80fd5b8063313ce567146102ac5780633746692e146102bb57806337f85f66146102e2575f80fd5b8063090f3f5011610183578063090f3f501461021a578063116d79761461025e5780632088800414610285575f80fd5b806232e91a146101a857806301ffc9a7146101e257806306fdde0314610205575b5f80fd5b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6101f56101f0366004610bcf565b6104da565b60405190151581526020016101d9565b61020d610561565b6040516101d99190610c15565b5f546102399073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d9565b6102397f000000000000000000000000000000000000000000000000000000000000034881565b6102397f000000000000000000000000000000000000000000000000000000000000034881565b604051601281526020016101d9565b6102397f000000000000000000000000fc0000000000000000000000000000000000000581565b6101cf7f000000000000000000000000000000000000000000000000000000000000001281565b61031c610317366004610c7e565b610581565b005b61031c61032c366004610c7e565b610595565b6001546102399073ffffffffffffffffffffffffffffffffffffffff1681565b610359610638565b6040805193151584526020840192909252908201526060016101d9565b61031c610799565b61031c61038c366004610c7e565b6107bd565b6102397f000000000000000000000000fc0000000000000000000000000000000000000581565b6101cf7f000000000000000000000000000000000000000000000000000000000000001281565b6101cf670de0b6b3a764000081565b6003546102399073ffffffffffffffffffffffffffffffffffffffff1681565b610359610860565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6004546102399073ffffffffffffffffffffffffffffffffffffffff1681565b6102397f000000000000000000000000fc0000000000000000000000000000000000000581565b6101cf7f000000000000000000000000000000000000000000000000000000000000001281565b6101cf7f000000000000000000000000000000000000000000000000000000000000001281565b61031c610876565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061055b57507fffffffff0000000000000000000000000000000000000000000000000000000082165f9081526002602052604090205460ff165b92915050565b6060604051806060016040528060238152602001610ec560239139905090565b610589610886565b610592816108d7565b50565b61059d610886565b6003546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f3a07253394227ca1e20891bab59e5701b25f82e87a4a03893195d28a6559fdcc910160405180910390a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f805f805f8061064661094b565b9250925092508295505f7f0000000000000000000000000000000000000000000000000000000000000000136106b95761069f7f0000000000000000000000000000000000000000000000000000000000000000610cde565b6106aa90600a610e32565b6106b49083610e3d565b6106ee565b6106e47f0000000000000000000000000000000000000000000000000000000000000000600a610e32565b6106ee9083610e75565b94505f7f00000000000000000000000000000000000000000000000000000000000000001361075a576107407f0000000000000000000000000000000000000000000000000000000000000000610cde565b61074b90600a610e32565b6107559082610e3d565b61078f565b6107857f0000000000000000000000000000000000000000000000000000000000000000600a610e32565b61078f9082610e75565b9350505050909192565b6107a1610886565b6107a9610ac2565b6107b25f6108d7565b6107bb5f610b12565b565b6107c5610886565b6004546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527ff72a7757dc9a9de5d1e9935e61961e5d261c96488503fa4291efe52789431d6e910160405180910390a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f805f61086b61094b565b925092509250909192565b61087e610ac2565b6107bb610b9f565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107bb576040517f1c0be90a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917f162998b90abc2507f3953aa797827b03a14c42dbd9a35f09feaf02e0d592773a9190a350565b5f805f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd9a548b6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156109b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109dc9190610e8c565b600354604080517fbd9a548b00000000000000000000000000000000000000000000000000000000815290519497509295509093505f9273ffffffffffffffffffffffffffffffffffffffff9091169163bd9a548b9160048083019260609291908290030181865afa158015610a54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a789190610e8c565b9250505080670de0b6b3a764000084610a919190610e75565b610a9b9190610e3d565b925080610ab0670de0b6b3a764000084610e75565b610aba9190610e3d565b915050909192565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146107bb576040517ff5c49e6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f31b6c5a04b069b6ec1b3cef44c4e7c1eadd721349cda9823d0b1877b3551cdc6905f90a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556107bb33610b12565b5f60208284031215610bdf575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c0e575f80fd5b9392505050565b5f6020808352835180828501525f5b81811015610c4057858101830151858201604001528201610c24565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215610c8e575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610c0e575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7f80000000000000000000000000000000000000000000000000000000000000008203610d0e57610d0e610cb1565b505f0390565b600181815b80851115610d6d57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d5357610d53610cb1565b80851615610d6057918102915b93841c9390800290610d19565b509250929050565b5f82610d835750600161055b565b81610d8f57505f61055b565b8160018114610da55760028114610daf57610dcb565b600191505061055b565b60ff841115610dc057610dc0610cb1565b50506001821b61055b565b5060208310610133831016604e8410600b8410161715610dee575081810a61055b565b610df88383610d14565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e2a57610e2a610cb1565b029392505050565b5f610c0e8383610d75565b5f82610e70577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761055b5761055b610cb1565b5f805f60608486031215610e9e575f80fd5b83518015158114610ead575f80fd5b60208501516040909501519096949550939250505056fe536672784574682052656453746f6e65204475616c204f7261636c65202b2054574150a164736f6c6343000814000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fc00000000000000000000000000000000000005000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b2000000000000000000000000ee095b7d9191603126da584a1179bb403a027c3a0000000000000000000000004b0ca693e29e5fd2aa39332a0387bbcd0f91a527
-----Decoded View---------------
Arg [0] : _params (tuple):
Arg [1] : sfrxEthErc20 (address): 0xFC00000000000000000000000000000000000005
Arg [2] : timelockAddress (address): 0xc16068d1ca7E24E20e56bB70af4D00D92AA4f0b2
Arg [3] : sfrxEthRateOracle (address): 0xEE095b7d9191603126Da584a1179BB403a027c3A
Arg [4] : frxEthOracle (address): 0x4b0Ca693e29e5FD2AA39332a0387BBCD0f91a527
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000fc00000000000000000000000000000000000005
Arg [1] : 000000000000000000000000c16068d1ca7e24e20e56bb70af4d00d92aa4f0b2
Arg [2] : 000000000000000000000000ee095b7d9191603126da584a1179bb403a027c3a
Arg [3] : 0000000000000000000000004b0ca693e29e5fd2aa39332a0387bbcd0f91a527
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.