Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5130674 | 16 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ChainlinkV3OracleConfig
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.8.28; import {IERC20Metadata} from "openzeppelin5/token/ERC20/extensions/IERC20Metadata.sol"; import {AggregatorV3Interface} from "chainlink/v0.8/interfaces/AggregatorV3Interface.sol"; import {ISiloOracle} from "silo-core/contracts/interfaces/ISiloOracle.sol"; import {IChainlinkV3Oracle} from "../interfaces/IChainlinkV3Oracle.sol"; import {Layer1OracleConfig} from "../_common/Layer1OracleConfig.sol"; contract ChainlinkV3OracleConfig is Layer1OracleConfig { /// @dev Chainlink aggregator AggregatorV3Interface internal immutable _AGGREGATOR; // solhint-disable-line var-name-mixedcase /// @dev secondary Chainlink aggregator to convert price to quote AggregatorV3Interface internal immutable _SECONDARY_AGGREGATOR; // solhint-disable-line var-name-mixedcase /// @dev Threshold used to determine if the price returned by the _SECONDARY_AGGREGATOR is valid uint256 internal immutable _SECONDARY_HEARTBEAT; // solhint-disable-line var-name-mixedcase /// @dev this can be set to true to convert primary price into price denominated in quote /// assuming that both AGGREGATORS providing price in the same token bool internal immutable _CONVERT_TO_QUOTE; // solhint-disable-line var-name-mixedcase /// @dev If TRUE price will be 1/price bool internal immutable _INVERT_SECONDARY_PRICE; // solhint-disable-line var-name-mixedcase /// @dev all verification should be done by factory constructor(IChainlinkV3Oracle.ChainlinkV3DeploymentConfig memory _config) Layer1OracleConfig( _config.baseToken, _config.quoteToken, _config.primaryHeartbeat, _config.normalizationDivider, _config.normalizationMultiplier ) { _AGGREGATOR = _config.primaryAggregator; _SECONDARY_AGGREGATOR = _config.secondaryAggregator; _SECONDARY_HEARTBEAT = _config.secondaryHeartbeat; _CONVERT_TO_QUOTE = address(_config.secondaryAggregator) != address(0); _INVERT_SECONDARY_PRICE = _config.invertSecondPrice; } function getConfig() external view virtual returns (IChainlinkV3Oracle.ChainlinkV3Config memory config) { config.primaryAggregator = _AGGREGATOR; config.secondaryAggregator = _SECONDARY_AGGREGATOR; config.primaryHeartbeat = _HEARTBEAT; config.secondaryHeartbeat = _SECONDARY_HEARTBEAT; config.normalizationDivider = _DECIMALS_NORMALIZATION_DIVIDER; config.normalizationMultiplier = _DECIMALS_NORMALIZATION_MULTIPLIER; config.baseToken = _BASE_TOKEN; config.quoteToken = _QUOTE_TOKEN; config.convertToQuote = _CONVERT_TO_QUOTE; config.invertSecondPrice = _INVERT_SECONDARY_PRICE; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData( uint80 _roundId ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface ISiloOracle { /// @notice Hook function to call before `quote` function reads price /// @dev This hook function can be used to change state right before the price is read. For example it can be used /// for curve read only reentrancy protection. In majority of implementations this will be an empty function. /// WARNING: reverts are propagated to Silo so if `beforeQuote` reverts, Silo reverts as well. /// @param _baseToken Address of priced token function beforeQuote(address _baseToken) external; /// @return quoteAmount Returns quote price for _baseAmount of _baseToken /// @param _baseAmount Amount of priced token /// @param _baseToken Address of priced token function quote(uint256 _baseAmount, address _baseToken) external view returns (uint256 quoteAmount); /// @return address of token in which quote (price) is denominated function quoteToken() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; import {IERC20Metadata} from "openzeppelin5/token/ERC20/extensions/IERC20Metadata.sol"; import {AggregatorV3Interface} from "chainlink/v0.8/interfaces/AggregatorV3Interface.sol"; import {ChainlinkV3OracleConfig} from "../chainlinkV3/ChainlinkV3OracleConfig.sol"; interface IChainlinkV3Oracle { /// @dev config based on which new oracle will be deployed /// @notice there is no way to check if aggregators match tokens, so it is users job to verify config. /// @param primaryAggregator used to read price from chainlink, if it can not provide price in quote token, /// then you have to setup secondary one that will do the job /// @param secondaryAggregator if set, it is used translate primary price into quote price eg: /// primary price is ABC/USD and secondary is ETH/USD, then result will be price in ABC/ETH /// @param baseToken base token address, it must have decimals() method available /// @param quoteToken quote toke address, it must have decimals() method available /// @param primaryHeartbeat heartbeat of primary price /// @param secondaryHeartbeat heartbeat of secondary price /// @param normalizationDivider divider that will be used in oracle to normalize price /// @param normalizationMultiplier multiplier that will be used in oracle to normalize price /// @param invertSecondPrice in case we using second price, this flag will tell us if we need to 1/secondPrice struct ChainlinkV3DeploymentConfig { IERC20Metadata baseToken; IERC20Metadata quoteToken; AggregatorV3Interface primaryAggregator; uint32 primaryHeartbeat; AggregatorV3Interface secondaryAggregator; uint32 secondaryHeartbeat; uint256 normalizationDivider; uint256 normalizationMultiplier; bool invertSecondPrice; } /// @dev config based on which new oracle will be deployed /// @notice there is no way to check if aggregators match tokens, so it is users job to verify config. /// @param primaryAggregator used to read price from chainlink, if it can not provide price in quote token, /// then you have to setup secondary one that will do the job /// @param secondaryAggregator if set, it is used translate primary price into quote price eg: /// primary price is ABC/USD and secondary is ETH/USD, then result will be price in ABC/ETH /// @param baseToken base token address, it must have decimals() method available /// @param quoteToken quote toke address, it must have decimals() method available /// @param primaryHeartbeat heartbeat of primary price /// @param secondaryHeartbeat heartbeat of secondary price /// @param invertSecondPrice in case we using second price, this flag will tell us if we need to 1/secondPrice struct ChainlinkV3Config { AggregatorV3Interface primaryAggregator; AggregatorV3Interface secondaryAggregator; uint256 primaryHeartbeat; uint256 secondaryHeartbeat; uint256 normalizationDivider; uint256 normalizationMultiplier; IERC20Metadata baseToken; IERC20Metadata quoteToken; bool convertToQuote; bool invertSecondPrice; } event ChainlinkV3ConfigDeployed(ChainlinkV3OracleConfig configAddress); event NewAggregator(address indexed asset, AggregatorV3Interface indexed aggregator, bool convertToQuote); event NewHeartbeat(address indexed asset, uint256 heartbeat); event NewQuoteAggregatorHeartbeat(uint256 heartbeat); event AggregatorDisabled(address indexed asset, AggregatorV3Interface indexed aggregator); error AddressZero(); error InvalidPrice(); error ZeroQuote(); error InvalidSecondPrice(); error BaseAmountOverflow(); error TokensAreTheSame(); error AggregatorsAreTheSame(); error QuoteTokenNotMatchEth(); error InvalidEthAggregatorDecimals(); error InvalidHeartbeat(); error InvalidEthHeartbeat(); error AssetNotSupported(); error HugeDivider(); error HugeMultiplier(); error MultiplierAndDividerZero(); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; import {IERC20Metadata} from "openzeppelin5/token/ERC20/extensions/IERC20Metadata.sol"; /// @notice to keep config contract size low (this is the one that will be deployed each time) /// factory contract take over verification. You should not deploy or use config that was not created by factory. /// @dev This is common config for Layer1 oracles abstract contract Layer1OracleConfig { /// @dev price must be updated at least once every `_HEARTBEAT` seconds, otherwise something is wrong uint256 internal immutable _HEARTBEAT; // solhint-disable-line var-name-mixedcase /// @dev constant used for normalising price uint256 internal immutable _DECIMALS_NORMALIZATION_DIVIDER; // solhint-disable-line var-name-mixedcase /// @dev constant used for normalising price uint256 internal immutable _DECIMALS_NORMALIZATION_MULTIPLIER; // solhint-disable-line var-name-mixedcase IERC20Metadata internal immutable _BASE_TOKEN; // solhint-disable-line var-name-mixedcase IERC20Metadata internal immutable _QUOTE_TOKEN; // solhint-disable-line var-name-mixedcase /// @dev all verification should be done by factory constructor( IERC20Metadata _baseToken, IERC20Metadata _quoteToken, uint256 _heartbeat, uint256 _normalizationDivider, uint256 _normalizationMultiplier ) { _DECIMALS_NORMALIZATION_DIVIDER = _normalizationDivider; _DECIMALS_NORMALIZATION_MULTIPLIER = _normalizationMultiplier; _BASE_TOKEN = _baseToken; _QUOTE_TOKEN = _quoteToken; _HEARTBEAT = _heartbeat; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
{ "remappings": [ "forge-std/=gitmodules/forge-std/src/", "silo-foundry-utils/=gitmodules/silo-foundry-utils/contracts/", "properties/=gitmodules/crytic/properties/contracts/", "silo-core/=silo-core/", "silo-oracles/=silo-oracles/", "silo-vaults/=silo-vaults/", "ve-silo/=ve-silo/", "@openzeppelin/=gitmodules/openzeppelin-contracts-5/contracts/", "morpho-blue/=gitmodules/morpho-blue/src/", "openzeppelin5/=gitmodules/openzeppelin-contracts-5/contracts/", "openzeppelin5-upgradeable/=gitmodules/openzeppelin-contracts-upgradeable-5/contracts/", "chainlink/=gitmodules/chainlink/contracts/src/", "chainlink-ccip/=gitmodules/chainlink-ccip/contracts/src/", "uniswap/=gitmodules/uniswap/", "@uniswap/v3-core/=gitmodules/uniswap/v3-core/", "balancer-labs/v2-solidity-utils/=external/balancer-v2-monorepo/pkg/solidity-utils/contracts/", "balancer-labs/v2-interfaces/=external/balancer-v2-monorepo/pkg/interfaces/contracts/", "balancer-labs/v2-liquidity-mining/=external/balancer-v2-monorepo/pkg/liquidity-mining/contracts/", "pyth-sdk-solidity/=gitmodules/pyth-sdk-solidity/target_chains/ethereum/sdk/solidity/", "@balancer-labs/=node_modules/@balancer-labs/", "@ensdomains/=node_modules/@ensdomains/", "@openzeppelin/contracts-upgradeable/=gitmodules/openzeppelin-contracts-upgradeable-5/contracts/", "@openzeppelin/contracts/=gitmodules/openzeppelin-contracts-5/contracts/", "@solidity-parser/=node_modules/@solidity-parser/", "ERC4626/=gitmodules/crytic/properties/lib/ERC4626/contracts/", "aave/=gitmodules/aave/", "createx/=gitmodules/pyth-sdk-solidity/lazer/contracts/evm/lib/createx/src/", "crytic/=gitmodules/crytic/", "ds-test/=gitmodules/openzeppelin-contracts-5/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=gitmodules/openzeppelin-contracts-5/lib/erc4626-tests/", "halmos-cheatcodes/=gitmodules/morpho-blue/lib/halmos-cheatcodes/src/", "hardhat/=node_modules/hardhat/", "layer-zero-examples/=gitmodules/layer-zero-examples/contracts/", "lz_gauges/=gitmodules/lz_gauges/contracts/", "openzeppelin-contracts-5/=gitmodules/openzeppelin-contracts-5/", "openzeppelin-contracts-upgradeable-5/=gitmodules/openzeppelin-contracts-upgradeable-5/", "openzeppelin-contracts-upgradeable/=gitmodules/openzeppelin-contracts-upgradeable/", "[email protected]/=gitmodules/[email protected]/contracts/", "openzeppelin-contracts/=gitmodules/openzeppelin-contracts/", "openzeppelin/=gitmodules/openzeppelin-contracts-upgradeable/contracts/", "prettier-plugin-solidity/=node_modules/prettier-plugin-solidity/", "proposals/=node_modules/proposals/", "solady/=gitmodules/pyth-sdk-solidity/lazer/contracts/evm/lib/createx/lib/solady/", "solmate/=gitmodules/crytic/properties/lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"components":[{"internalType":"contract IERC20Metadata","name":"baseToken","type":"address"},{"internalType":"contract IERC20Metadata","name":"quoteToken","type":"address"},{"internalType":"contract AggregatorV3Interface","name":"primaryAggregator","type":"address"},{"internalType":"uint32","name":"primaryHeartbeat","type":"uint32"},{"internalType":"contract AggregatorV3Interface","name":"secondaryAggregator","type":"address"},{"internalType":"uint32","name":"secondaryHeartbeat","type":"uint32"},{"internalType":"uint256","name":"normalizationDivider","type":"uint256"},{"internalType":"uint256","name":"normalizationMultiplier","type":"uint256"},{"internalType":"bool","name":"invertSecondPrice","type":"bool"}],"internalType":"struct IChainlinkV3Oracle.ChainlinkV3DeploymentConfig","name":"_config","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"getConfig","outputs":[{"components":[{"internalType":"contract AggregatorV3Interface","name":"primaryAggregator","type":"address"},{"internalType":"contract AggregatorV3Interface","name":"secondaryAggregator","type":"address"},{"internalType":"uint256","name":"primaryHeartbeat","type":"uint256"},{"internalType":"uint256","name":"secondaryHeartbeat","type":"uint256"},{"internalType":"uint256","name":"normalizationDivider","type":"uint256"},{"internalType":"uint256","name":"normalizationMultiplier","type":"uint256"},{"internalType":"contract IERC20Metadata","name":"baseToken","type":"address"},{"internalType":"contract IERC20Metadata","name":"quoteToken","type":"address"},{"internalType":"bool","name":"convertToQuote","type":"bool"},{"internalType":"bool","name":"invertSecondPrice","type":"bool"}],"internalType":"struct IChainlinkV3Oracle.ChainlinkV3Config","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101c0604052348015610010575f5ffd5b506040516104fd3803806104fd83398101604081905261002f9161011d565b80516020820151606083015160c08085015160e08087015160a09283529092526001600160a01b0394851690915291831661010090815263ffffffff918216608090815260408601518516610120528501805185166101405292850151909116610160529051909116151561018052015115156101a0526101c6565b60405161012081016001600160401b03811182821017156100da57634e487b7160e01b5f52604160045260245ffd5b60405290565b80516001600160a01b03811681146100f6575f5ffd5b919050565b805163ffffffff811681146100f6575f5ffd5b805180151581146100f6575f5ffd5b5f61012082840312801561012f575f5ffd5b506101386100ab565b610141836100e0565b815261014f602084016100e0565b6020820152610160604084016100e0565b6040820152610171606084016100fb565b6060820152610182608084016100e0565b608082015261019360a084016100fb565b60a082015260c0838101519082015260e080840151908201526101b9610100840161010e565b6101008201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516102cd6102305f395f61019e01525f61017501525f60b401525f606701525f604201525f61014e01525f61012601525f61010001525f60da01525f608f01526102cd5ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063c3f909d41461002d575b5f5ffd5b60408051610140810182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301527f000000000000000000000000000000000000000000000000000000000000000060808301527f000000000000000000000000000000000000000000000000000000000000000060a08301527f0000000000000000000000000000000000000000000000000000000000000000811660c08301527f00000000000000000000000000000000000000000000000000000000000000001660e08201527f000000000000000000000000000000000000000000000000000000000000000015156101008201527f0000000000000000000000000000000000000000000000000000000000000000151561012082015290516101d191906101da565b60405180910390f35b81516001600160a01b031681526101408101602083015161020660208401826001600160a01b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015161024960c08401826001600160a01b03169052565b5060e083015161026460e08401826001600160a01b03169052565b5061010083015161027a61010084018215159052565b5061012083015161029061012084018215159052565b509291505056fea2646970667358221220366e50c3c111297f52ef99b14992a476def50e09f375a143657a8c4f22cf051264736f6c634300081c0033000000000000000000000000d3dce716f3ef535c5ff8d041c1a41c3bd89b97ae000000000000000000000000ad525f341368aa80093672278234ad364efcaf0a000000000000000000000000b81131b6368b3f0a83af09db4e39ac23da96c2db00000000000000000000000000000000000000000000000000000000000055f100000000000000000000000055bca887199d5520b3ce285d41e6dc10c08716c900000000000000000000000000000000000000000000000000000000000153d9000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063c3f909d41461002d575b5f5ffd5b60408051610140810182526001600160a01b037f000000000000000000000000b81131b6368b3f0a83af09db4e39ac23da96c2db811682527f00000000000000000000000055bca887199d5520b3ce285d41e6dc10c08716c9811660208301527f00000000000000000000000000000000000000000000000000000000000055f1828401527f00000000000000000000000000000000000000000000000000000000000153d960608301527f000000000000000000000000000000000000000000000000000000000000271060808301527f000000000000000000000000000000000000000000000000000000000000000060a08301527f000000000000000000000000d3dce716f3ef535c5ff8d041c1a41c3bd89b97ae811660c08301527f000000000000000000000000ad525f341368aa80093672278234ad364efcaf0a1660e08201527f000000000000000000000000000000000000000000000000000000000000000115156101008201527f0000000000000000000000000000000000000000000000000000000000000000151561012082015290516101d191906101da565b60405180910390f35b81516001600160a01b031681526101408101602083015161020660208401826001600160a01b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015161024960c08401826001600160a01b03169052565b5060e083015161026460e08401826001600160a01b03169052565b5061010083015161027a61010084018215159052565b5061012083015161029061012084018215159052565b509291505056fea2646970667358221220366e50c3c111297f52ef99b14992a476def50e09f375a143657a8c4f22cf051264736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d3dce716f3ef535c5ff8d041c1a41c3bd89b97ae000000000000000000000000ad525f341368aa80093672278234ad364efcaf0a000000000000000000000000b81131b6368b3f0a83af09db4e39ac23da96c2db00000000000000000000000000000000000000000000000000000000000055f100000000000000000000000055bca887199d5520b3ce285d41e6dc10c08716c900000000000000000000000000000000000000000000000000000000000153d9000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _config (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000d3dce716f3ef535c5ff8d041c1a41c3bd89b97ae
Arg [1] : 000000000000000000000000ad525f341368aa80093672278234ad364efcaf0a
Arg [2] : 000000000000000000000000b81131b6368b3f0a83af09db4e39ac23da96c2db
Arg [3] : 00000000000000000000000000000000000000000000000000000000000055f1
Arg [4] : 00000000000000000000000055bca887199d5520b3ce285d41e6dc10c08716c9
Arg [5] : 00000000000000000000000000000000000000000000000000000000000153d9
Arg [6] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.