Source Code
Overview
S Balance
S Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xe11eed00...46DaD0176 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
VaultOracleSingle
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 100 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
import "../interfaces/IVaultOracleSingle.sol";
import "../libraries/OracleUtils.sol";
import "@openzeppelin/contracts_5.0.2/token/ERC20/extensions/IERC20Metadata.sol";
contract VaultOracleSingle is IVaultOracleSingle, OracleUtils {
address public feed;
uint128 chainlink_heartbeat;
address public token;
constructor(
address _token,
address _feed,
uint128 _chainlink_heartbeat,
address _uptimeFeedAddress
) OracleUtils(_uptimeFeedAddress) {
feed = _feed;
chainlink_heartbeat = _chainlink_heartbeat;
token = _token;
}
/**
* @dev value in Eth (in wei) of this amount of token
*/
function getTokenPrice(uint256 _amount) external view returns (uint256) {
return
tokenToEth(
_amount,
feed,
chainlink_heartbeat,
IERC20Metadata(token).decimals()
);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
interface IVaultOracleSingle {
//function getTokenPrice() external view returns (uint256,uint256,bool);
function getTokenPrice(uint256 _amount) external view returns (uint256);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.20;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol";
import {IChainlinkAggregator} from "../interfaces/IChainlinkAggregator.sol";
import {IChainlinkPriceFeed} from "../interfaces/IChainlinkPriceFeed.sol";
import "@uniswap/v3-core/contracts/libraries/FullMath.sol";
contract OracleUtils {
uint256 private constant GRACE_PERIOD_TIME = 3600;
error SequencerDown();
error GracePeriodNotOver();
address internal sequencerUptimeFeed;
constructor(address _uptimeFeedAddress) {
sequencerUptimeFeed = _uptimeFeedAddress;
}
modifier checkSequencerActive() {
if (sequencerUptimeFeed != address(0)) {
(
,
/*uint80 roundID*/ int256 answer,
uint256 startedAt /*uint256 updatedAt*/ /*uint80 answeredInRound*/,
,
) = AggregatorV2V3Interface(sequencerUptimeFeed).latestRoundData();
// Answer == 0: Sequencer is up
// Answer == 1: Sequencer is down
bool isSequencerUp = answer == 0;
if (!isSequencerUp) {
revert SequencerDown();
}
// Make sure the grace period has passed after the
// sequencer is back up.
uint256 timeSinceUp = block.timestamp - startedAt;
if (timeSinceUp <= GRACE_PERIOD_TIME) {
revert GracePeriodNotOver();
}
}
_;
}
/**
* @dev chainlink call to a pricefeed with any amount
*/
function ethToToken(
uint256 _ethAmount,
address _pricefeed,
uint128 _chainlink_heartbeat,
uint256 _decimals
) public view checkSequencerActive returns (uint256 tokenAmount) {
(
uint80 roundID,
int256 price,
,
uint256 timeStamp,
uint80 answeredInRound
) = AggregatorV3Interface(_pricefeed).latestRoundData();
// heartbeat check
require(
timeStamp >= block.timestamp - _chainlink_heartbeat,
"Stale pricefeed"
);
// minAnswer/maxAnswer check
IChainlinkAggregator aggregator = IChainlinkAggregator(
IChainlinkPriceFeed(_pricefeed).aggregator()
);
require(
((price > int256(aggregator.minAnswer())) &&
(price < int256(aggregator.maxAnswer()))),
"min/max reached"
);
require(answeredInRound >= roundID, "Answer given before round");
//if ETH is on the left side of the fraction in the price feed
if (ethLeftSide(_pricefeed)) {
tokenAmount = FullMath.mulDiv(
_ethAmount,
uint256(price),
10 ** AggregatorV3Interface(_pricefeed).decimals()
);
} else {
tokenAmount = FullMath.mulDiv(
_ethAmount,
10 ** AggregatorV3Interface(_pricefeed).decimals(),
uint256(price)
);
}
// audit fix
tokenAmount = tokenAmount * 10 ** (18 - _decimals);
}
/**
* @dev chainlink call to a pricefeed with any amount
*/
function ethToTokenRoundUp(
uint256 _ethAmount,
address _pricefeed,
uint128 _chainlink_heartbeat,
uint256 _decimals
) public view checkSequencerActive returns (uint256 tokenAmount) {
(
uint80 roundID,
int256 price,
,
uint256 timeStamp,
uint80 answeredInRound
) = AggregatorV3Interface(_pricefeed).latestRoundData();
// heartbeat check
require(
timeStamp >= block.timestamp - _chainlink_heartbeat,
"Stale pricefeed"
);
// minAnswer/maxAnswer check
IChainlinkAggregator aggregator = IChainlinkAggregator(
IChainlinkPriceFeed(_pricefeed).aggregator()
);
require(
((price > int256(aggregator.minAnswer())) &&
(price < int256(aggregator.maxAnswer()))),
"min/max reached"
);
require(answeredInRound >= roundID, "Answer given before round");
//if ETH is on the left side of the fraction in the price feed
if (ethLeftSide(_pricefeed)) {
tokenAmount = FullMath.mulDivRoundingUp(
_ethAmount,
uint256(price),
10 ** AggregatorV3Interface(_pricefeed).decimals()
);
} else {
tokenAmount = FullMath.mulDivRoundingUp(
_ethAmount,
10 ** AggregatorV3Interface(_pricefeed).decimals(),
uint256(price)
);
}
// audit fix
tokenAmount = tokenAmount * 10 ** (18 - _decimals);
}
/**
* @dev chainlink call to a pricefeed with any amount
*/
function tokenToEth(
uint256 _amount,
address _pricefeed,
uint128 _chainlink_heartbeat,
uint256 _decimals
) public view checkSequencerActive returns (uint256 EthValue) {
(
uint80 roundID,
int256 price,
,
uint256 timeStamp,
uint80 answeredInRound
) = AggregatorV3Interface(_pricefeed).latestRoundData();
// heartbeat check
require(
timeStamp >= block.timestamp - _chainlink_heartbeat,
"Stale pricefeed"
);
// minAnswer/maxAnswer check
IChainlinkAggregator aggregator = IChainlinkAggregator(
IChainlinkPriceFeed(_pricefeed).aggregator()
);
require(
((price > int256(aggregator.minAnswer())) &&
(price < int256(aggregator.maxAnswer()))),
"min/max reached"
);
require(answeredInRound >= roundID, "Answer given before round");
//if ETH is on the left side of the fraction in the price feed
if (ethLeftSide(_pricefeed)) {
EthValue = FullMath.mulDiv(
_amount,
10 ** AggregatorV3Interface(_pricefeed).decimals(),
uint256(price)
);
} else {
EthValue = FullMath.mulDiv(
_amount,
uint256(price),
10 ** AggregatorV3Interface(_pricefeed).decimals()
);
}
// audit fix
EthValue = EthValue * 10 ** (18 - _decimals);
}
/**
* @dev chainlink call to a pricefeed with any amount
*/
function tokenToEthRoundUp(
uint256 _amount,
address _pricefeed,
uint128 _chainlink_heartbeat,
uint256 _decimals
) public view checkSequencerActive returns (uint256 EthValue) {
(
uint80 roundID,
int256 price,
,
uint256 timeStamp,
uint80 answeredInRound
) = AggregatorV3Interface(_pricefeed).latestRoundData();
// heartbeat check
require(
timeStamp >= block.timestamp - _chainlink_heartbeat,
"Stale pricefeed"
);
// minAnswer/maxAnswer check
IChainlinkAggregator aggregator = IChainlinkAggregator(
IChainlinkPriceFeed(_pricefeed).aggregator()
);
require(
((price > int256(aggregator.minAnswer())) &&
(price < int256(aggregator.maxAnswer()))),
"min/max reached"
);
require(answeredInRound >= roundID, "Answer given before round");
//if ETH is on the left side of the fraction in the price feed
if (ethLeftSide(_pricefeed)) {
EthValue = FullMath.mulDivRoundingUp(
_amount,
10 ** AggregatorV3Interface(_pricefeed).decimals(),
uint256(price)
);
} else {
EthValue = FullMath.mulDivRoundingUp(
_amount,
uint256(price),
10 ** AggregatorV3Interface(_pricefeed).decimals()
);
}
// audit fix
EthValue = EthValue * 10 ** (18 - _decimals);
}
function ethLeftSide(address _chainlinkFeed) internal view returns (bool) {
string memory description = AggregatorV3Interface(_chainlinkFeed)
.description();
bytes memory descriptionBytes = bytes(description);
bytes memory ethBytes = bytes("ETH");
for (uint i = 0; i < 3; i++)
if (descriptionBytes[i] != ethBytes[i]) return false;
return true;
}
}// 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 ERC20 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;
import "./AggregatorInterface.sol";
import "./AggregatorV3Interface.sol";
interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
interface IChainlinkAggregator {
function minAnswer() external view returns (int192);
function maxAnswer() external view returns (int192);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
interface IChainlinkPriceFeed {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function latestAnswer() external view returns (int256);
function latestTimestamp() external view returns (uint256);
function latestRound() external view returns (uint256);
function getAnswer(uint256 roundId) external view returns (int256);
function getTimestamp(uint256 roundId) external view returns (uint256);
function latestRoundData()
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
function aggregator() external view returns (address);
event AnswerUpdated(
int256 indexed current,
uint256 indexed roundId,
uint256 timestamp
);
event NewRound(uint256 indexed roundId, address indexed startedBy);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
/// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = a * b
// Compute the product mod 2**256 and mod 2**256 - 1
// then use the Chinese Remainder Theorem to reconstruct
// the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2**256 + prod0
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(a, b, not(0))
prod0 := mul(a, b)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division
if (prod1 == 0) {
require(denominator > 0);
assembly {
result := div(prod0, denominator)
}
return result;
}
// Make sure the result is less than 2**256.
// Also prevents denominator == 0
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0]
// Compute remainder using mulmod
uint256 remainder;
assembly {
remainder := mulmod(a, b, denominator)
}
// Subtract 256 bit number from 512 bit number
assembly {
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator
// Compute largest power of two divisor of denominator.
// Always >= 1.
uint256 twos = (0 - denominator) & denominator;
// Divide denominator by power of two
assembly {
denominator := div(denominator, twos)
}
// Divide [prod1 prod0] by the factors of two
assembly {
prod0 := div(prod0, twos)
}
// Shift in bits from prod1 into prod0. For this we need
// to flip `twos` such that it is 2**256 / twos.
// If twos is zero, then it becomes one
assembly {
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
// Invert denominator mod 2**256
// Now that denominator is an odd number, it has an inverse
// modulo 2**256 such that denominator * inv = 1 mod 2**256.
// Compute the inverse by starting with a seed that is correct
// correct for four bits. That is, denominator * inv = 1 mod 2**4
uint256 inv = (3 * denominator) ^ 2;
// Now use Newton-Raphson iteration to improve the precision.
// Thanks to Hensel's lifting lemma, this also works in modular
// arithmetic, doubling the correct bits in each step.
inv *= 2 - denominator * inv; // inverse mod 2**8
inv *= 2 - denominator * inv; // inverse mod 2**16
inv *= 2 - denominator * inv; // inverse mod 2**32
inv *= 2 - denominator * inv; // inverse mod 2**64
inv *= 2 - denominator * inv; // inverse mod 2**128
inv *= 2 - denominator * inv; // inverse mod 2**256
// Because the division is now exact we can divide by multiplying
// with the modular inverse of denominator. This will give us the
// correct result modulo 2**256. Since the precoditions guarantee
// that the outcome is less than 2**256, this is the final result.
// We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inv;
return result;
}
}
/// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
function mulDivRoundingUp(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
result = mulDiv(a, b, denominator);
if (mulmod(a, b, denominator) > 0) {
require(result < type(uint256).max);
result++;
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
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);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface AggregatorInterface {
function latestAnswer() external view returns (int256);
function latestTimestamp() external view returns (uint256);
function latestRound() external view returns (uint256);
function getAnswer(uint256 roundId) external view returns (int256);
function getTimestamp(uint256 roundId) external view returns (uint256);
event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}// 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);
}{
"remappings": [
"@chainlink/=node_modules/@chainlink/",
"@eth-optimism/=node_modules/@chainlink/contracts/node_modules/@eth-optimism/",
"@layerzerolabs/=node_modules/@layerzerolabs/",
"@openzeppelin/=node_modules/@openzeppelin/",
"@uniswap/=node_modules/@uniswap/",
"base64-sol/=node_modules/base64-sol/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"uniV3periphery/=node_modules/uniV3periphery/",
"uniswap-v3-periphery-0.8/=node_modules/uniswap-v3-periphery-0.8/"
],
"optimizer": {
"enabled": true,
"runs": 100
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": true,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_feed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"address","name":"_uptimeFeedAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"GracePeriodNotOver","type":"error"},{"inputs":[],"name":"SequencerDown","type":"error"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"ethToToken","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"ethToTokenRoundUp","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"tokenToEth","outputs":[{"internalType":"uint256","name":"EthValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"tokenToEthRoundUp","outputs":[{"internalType":"uint256","name":"EthValue","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
0x6080346100cc57601f61135d38819003918201601f19168301916001600160401b038311848410176100d0578084926080946040528339810103126100cc57610047816100e4565b90610054602082016100e4565b60408201519092906001600160801b038116908190036100cc576001600160a01b039283908190610087906060016100e4565b169460018060a01b031995865f5416175f551684600154161760015560018060801b031960025416176002551690600354161760035560405161126490816100f98239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100cc5756fe6080604081815260049182361015610015575f80fd5b5f92833560e01c91826337a7b7d814610a21575081633ac2ba261461078b5781637375416f146104ff578163c457fb3714610468578163e474764114610449578163f3aee97d1461009a575063fc0c546a1461006f575f80fd5b3461009657816003193601126100965760035490516001600160a01b039091168152602090f35b5080fd5b905034610445576100aa36610a46565b93929060018060a09894981b03968488855416806103b4575b50508651633fabe5a360e21b8152818916919060a0818881865afa9081156103aa578690879588918994610365575b50610112919061010b906001600160801b031642610b23565b1115610b44565b89516309169eff60e21b815260209b908c818b81895afa90811561032e578991610338575b50168a51630455b78f60e31b81528c818b81855afa90811561032e57918d9593918b9795938b91610311575b5060170b8813908161028e575b509161019a9161018361019f9594610bba565b69ffffffffffffffffffff80911691161015610bf8565b610fcb565b1561024f57885163313ce56760e01b815292839182905afa908115610245576101db9392916101d5918691610218575b50610c40565b916111ee565b925b6012039160128311610205575050906101f86101fe92610c51565b90610c5f565b9051908152f35b634e487b7160e01b825260119052602490fd5b61023891508a3d8c1161023e575b6102308183610a88565b810190610abe565b5f6101cf565b503d610226565b87513d86823e3d90fd5b885163313ce56760e01b815293949392839182905afa908115610245576102889392916102829186916102185750610c40565b906111ee565b926101dd565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156103075789959361019f936101838f979461019a948d916102da575b5060170b8a12929495505091610170565b6102fa9150893d8b11610300575b6102f28183610a88565b810190610ba1565b5f6102c9565b503d6102e8565b8b513d8a823e3d90fd5b6103289150873d8911610300576102f28183610a88565b5f610163565b8c513d8b823e3d90fd5b61035891508d803d1061035e575b6103508183610a88565b810190610b82565b5f610137565b503d610346565b90935061010b96506101129250610393915060a03d81116103a3575b61038b8183610a88565b810190610aee565b92989295939450929190506100f2565b503d610381565b89513d88823e3d90fd5b60a090895192838092633fabe5a360e21b82525afa90811561043b5785908692610417575b50610408576103eb610e109142610b23565b11156103f857845f6100c3565b865163d15f73b560e01b81528590fd5b875162032b3d60e81b81528690fd5b9050610431915060a03d81116103a35761038b8183610a88565b505091505f6103d9565b88513d87823e3d90fd5b8280fd5b505034610096576020906101fe61045f36610a46565b92919091610c72565b90503461044557602036600319011261044557600154600254600354845163313ce56760e01b81526001600160801b03909216926001600160a01b039081169291602091839187918391165afa9081156104f5576101fe9493929160ff91602098916104d8575b50169235610c72565b6104ef9150883d811161023e576102308183610a88565b5f6104cf565b85513d88823e3d90fd5b9050346104455761050f36610a46565b86546001600160a01b03979195949193908590891680610723575b50508651633fabe5a360e21b8152818916919060a0818881865afa9081156103aa5786908796889189946106ee575b50610572919061010b906001600160801b031642610b23565b89516309169eff60e21b815260209b908c818b81895afa90811561032e5789916106d1575b50168a51630455b78f60e31b81528c818b81855afa90811561032e57918d9593918b9795938b916106b4575b5060170b8913908161064b575b509161019a916101836105e39594610bba565b1561061857885163313ce56760e01b815292839182905afa908115610245576101db9392916102829186916102185750610c40565b885163313ce56760e01b815293949392839182905afa908115610245576102889392916101d59186916102185750610c40565b90508c969294969591939551928380926370da2f6760e01b82525afa908115610307578995936105e3936101838f979461019a948d91610697575b5060170b8b129294955050916105d0565b6106ae9150893d8b11610300576102f28183610a88565b5f610686565b6106cb9150873d8911610300576102f28183610a88565b5f6105c3565b6106e891508d803d1061035e576103508183610a88565b5f610597565b90935061010b97506105729250610713915060a03d81116103a35761038b8183610a88565b9299929593945092919050610559565b60a090895192838092633fabe5a360e21b82525afa90811561043b5785908692610767575b506104085761075a610e109142610b23565b11156103f857845f61052a565b9050610781915060a03d81116103a35761038b8183610a88565b505091505f610748565b9050346104455761079b36610a46565b93929060018060a09894981b03968488855416806109b9575b50508651633fabe5a360e21b8152818916919060a0818881865afa9081156103aa578690879588918994610984575b506107fc919061010b906001600160801b031642610b23565b89516309169eff60e21b815260209b908c818b81895afa90811561032e578991610967575b50168a51630455b78f60e31b81528c818b81855afa90811561032e57918d9593918b9795938b9161094a575b5060170b881390816108e1575b509161019a9161018361086d9594610bba565b156108a857885163313ce56760e01b815292839182905afa908115610245576101db9392916108a29186916102185750610c40565b9161116e565b885163313ce56760e01b815293949392839182905afa908115610245576102889392916108db9186916102185750610c40565b9061116e565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156103075789959361086d936101838f979461019a948d9161092d575b5060170b8a1292949550509161085a565b6109449150893d8b11610300576102f28183610a88565b5f61091c565b6109619150873d8911610300576102f28183610a88565b5f61084d565b61097e91508d803d1061035e576103508183610a88565b5f610821565b90935061010b96506107fc92506109a9915060a03d81116103a35761038b8183610a88565b92989295939450929190506107e3565b60a090895192838092633fabe5a360e21b82525afa90811561043b57859086926109fd575b50610408576109f0610e109142610b23565b11156103f857845f6107b4565b9050610a17915060a03d81116103a35761038b8183610a88565b505091505f6109de565b8490346100965781600319360112610096576001546001600160a01b03168152602090f35b6080906003190112610a8457600435906024356001600160a01b0381168103610a8457906044356001600160801b0381168103610a84579060643590565b5f80fd5b90601f8019910116810190811067ffffffffffffffff821117610aaa57604052565b634e487b7160e01b5f52604160045260245ffd5b90816020910312610a84575160ff81168103610a845790565b519069ffffffffffffffffffff82168203610a8457565b908160a0910312610a8457610b0281610ad7565b91602082015191604081015191610b20608060608401519301610ad7565b90565b91908203918211610b3057565b634e487b7160e01b5f52601160045260245ffd5b15610b4b57565b60405162461bcd60e51b815260206004820152600f60248201526e14dd185b19481c1c9a58d959995959608a1b6044820152606490fd5b90816020910312610a8457516001600160a01b0381168103610a845790565b90816020910312610a8457518060170b8103610a845790565b15610bc157565b60405162461bcd60e51b815260206004820152600f60248201526e1b5a5b8bdb585e081c995858da1959608a1b6044820152606490fd5b15610bff57565b60405162461bcd60e51b8152602060048201526019602482015278105b9cddd95c8819da5d995b881899599bdc99481c9bdd5b99603a1b6044820152606490fd5b60ff16604d8111610b3057600a0a90565b604d8111610b3057600a0a90565b81810292918115918404141715610b3057565b9093929160018060a01b03915f928084541680610f0e575b5060408051633fabe5a360e21b81526004989192918083169160a0818c81865afa908115610f0457889089988a918b94610ecf575b50610cd8919061010b906001600160801b031642610b23565b85516309169eff60e21b81526020959086818f81895afa908115610ea8578b91610eb2575b508751630455b78f60e31b815291169086818f81855afa908115610ea857908e979695949392918c91610e8b575b5060170b8a139081610e19575b509161019a91610183610d4b9594610bba565b15610ddc57819084519384809263313ce56760e01b82525afa928315610dd35750916108db91610d859594938792610db6575b5050610c40565b915b6012039060128211610da35750610b209293506101f890610c51565b634e487b7160e01b815260118552602490fd5b610dcc9250803d1061023e576102308183610a88565b5f80610d7e565b513d87823e3d90fd5b819084969596519384809263313ce56760e01b82525afa928315610dd35750916108a291610e139594938792610db6575050610c40565b91610d87565b8697929394959691508851928380926370da2f6760e01b82525afa908115610e8157928d9695949261018361019a93610d4b968e91610e64575b5060170b8c12929495505091610d38565b610e7b9150893d8b11610300576102f28183610a88565b5f610e53565b87513d8c823e3d90fd5b610ea29150873d8911610300576102f28183610a88565b5f610d2b565b88513d8d823e3d90fd5b610ec99150873d891161035e576103508183610a88565b5f610cfd565b90935061010b9950610cd89250610ef4915060a03d81116103a35761038b8183610a88565b929b929593945092919050610cbf565b85513d8a823e3d90fd5b60a060049160405192838092633fabe5a360e21b82525afa908115610f9b5785908692610f77575b50610f6657610f48610e109142610b23565b1115610f54575f610c8a565b60405163d15f73b560e01b8152600490fd5b60405162032b3d60e81b8152600490fd5b9050610f91915060a03d81116103a35761038b8183610a88565b505091505f610f36565b6040513d87823e3d90fd5b908151811015610fb7570160200190565b634e487b7160e01b5f52603260045260245ffd5b60408051633942720b60e11b8152915f9160049183908590849082906001600160a01b03165afa9384156111645783946110a9575b508051908082019082821067ffffffffffffffff83111761109657526003938482526208aa8960eb1b6020830152835b85811061104257505050505050600190565b6001600160f81b0319806110568385610fa6565b5116906110638386610fa6565b51160361108d575f19811461107a57600101611030565b634e487b7160e01b855260118452602485fd5b50505050905090565b634e487b7160e01b855260418452602485fd5b9093503d8084833e6110bb8183610a88565b810190602090818184031261116057805167ffffffffffffffff9182821161115c570183601f8201121561114557805191821161114957865193611108601f8401601f1916850186610a88565b8285528383830101116111455790859291835b82811061112f57505083010152925f611000565b818101840151868201850152879450830161111b565b8580fd5b634e487b7160e01b865260418552602486fd5b8680fd5b8480fd5b81513d85823e3d90fd5b915f1982840992828102928380861095039480860395146111e05784831115610a845782910981805f0316809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505080925015610a84570490565b9291906111fc82828661116e565b93821561121a570961120a57565b905f19811015610a845760010190565b634e487b7160e01b5f52601260045260245ffdfea26469706673582212207c13f272eea85213bd6904219a96eb4fc6cde55e2c590c86b5d70b371ccf11fd64736f6c63430008140033000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe3955000000000000000000000000f97a2074fccfdcd2ff567faebfe235ecf0091c3d00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604081815260049182361015610015575f80fd5b5f92833560e01c91826337a7b7d814610a21575081633ac2ba261461078b5781637375416f146104ff578163c457fb3714610468578163e474764114610449578163f3aee97d1461009a575063fc0c546a1461006f575f80fd5b3461009657816003193601126100965760035490516001600160a01b039091168152602090f35b5080fd5b905034610445576100aa36610a46565b93929060018060a09894981b03968488855416806103b4575b50508651633fabe5a360e21b8152818916919060a0818881865afa9081156103aa578690879588918994610365575b50610112919061010b906001600160801b031642610b23565b1115610b44565b89516309169eff60e21b815260209b908c818b81895afa90811561032e578991610338575b50168a51630455b78f60e31b81528c818b81855afa90811561032e57918d9593918b9795938b91610311575b5060170b8813908161028e575b509161019a9161018361019f9594610bba565b69ffffffffffffffffffff80911691161015610bf8565b610fcb565b1561024f57885163313ce56760e01b815292839182905afa908115610245576101db9392916101d5918691610218575b50610c40565b916111ee565b925b6012039160128311610205575050906101f86101fe92610c51565b90610c5f565b9051908152f35b634e487b7160e01b825260119052602490fd5b61023891508a3d8c1161023e575b6102308183610a88565b810190610abe565b5f6101cf565b503d610226565b87513d86823e3d90fd5b885163313ce56760e01b815293949392839182905afa908115610245576102889392916102829186916102185750610c40565b906111ee565b926101dd565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156103075789959361019f936101838f979461019a948d916102da575b5060170b8a12929495505091610170565b6102fa9150893d8b11610300575b6102f28183610a88565b810190610ba1565b5f6102c9565b503d6102e8565b8b513d8a823e3d90fd5b6103289150873d8911610300576102f28183610a88565b5f610163565b8c513d8b823e3d90fd5b61035891508d803d1061035e575b6103508183610a88565b810190610b82565b5f610137565b503d610346565b90935061010b96506101129250610393915060a03d81116103a3575b61038b8183610a88565b810190610aee565b92989295939450929190506100f2565b503d610381565b89513d88823e3d90fd5b60a090895192838092633fabe5a360e21b82525afa90811561043b5785908692610417575b50610408576103eb610e109142610b23565b11156103f857845f6100c3565b865163d15f73b560e01b81528590fd5b875162032b3d60e81b81528690fd5b9050610431915060a03d81116103a35761038b8183610a88565b505091505f6103d9565b88513d87823e3d90fd5b8280fd5b505034610096576020906101fe61045f36610a46565b92919091610c72565b90503461044557602036600319011261044557600154600254600354845163313ce56760e01b81526001600160801b03909216926001600160a01b039081169291602091839187918391165afa9081156104f5576101fe9493929160ff91602098916104d8575b50169235610c72565b6104ef9150883d811161023e576102308183610a88565b5f6104cf565b85513d88823e3d90fd5b9050346104455761050f36610a46565b86546001600160a01b03979195949193908590891680610723575b50508651633fabe5a360e21b8152818916919060a0818881865afa9081156103aa5786908796889189946106ee575b50610572919061010b906001600160801b031642610b23565b89516309169eff60e21b815260209b908c818b81895afa90811561032e5789916106d1575b50168a51630455b78f60e31b81528c818b81855afa90811561032e57918d9593918b9795938b916106b4575b5060170b8913908161064b575b509161019a916101836105e39594610bba565b1561061857885163313ce56760e01b815292839182905afa908115610245576101db9392916102829186916102185750610c40565b885163313ce56760e01b815293949392839182905afa908115610245576102889392916101d59186916102185750610c40565b90508c969294969591939551928380926370da2f6760e01b82525afa908115610307578995936105e3936101838f979461019a948d91610697575b5060170b8b129294955050916105d0565b6106ae9150893d8b11610300576102f28183610a88565b5f610686565b6106cb9150873d8911610300576102f28183610a88565b5f6105c3565b6106e891508d803d1061035e576103508183610a88565b5f610597565b90935061010b97506105729250610713915060a03d81116103a35761038b8183610a88565b9299929593945092919050610559565b60a090895192838092633fabe5a360e21b82525afa90811561043b5785908692610767575b506104085761075a610e109142610b23565b11156103f857845f61052a565b9050610781915060a03d81116103a35761038b8183610a88565b505091505f610748565b9050346104455761079b36610a46565b93929060018060a09894981b03968488855416806109b9575b50508651633fabe5a360e21b8152818916919060a0818881865afa9081156103aa578690879588918994610984575b506107fc919061010b906001600160801b031642610b23565b89516309169eff60e21b815260209b908c818b81895afa90811561032e578991610967575b50168a51630455b78f60e31b81528c818b81855afa90811561032e57918d9593918b9795938b9161094a575b5060170b881390816108e1575b509161019a9161018361086d9594610bba565b156108a857885163313ce56760e01b815292839182905afa908115610245576101db9392916108a29186916102185750610c40565b9161116e565b885163313ce56760e01b815293949392839182905afa908115610245576102889392916108db9186916102185750610c40565b9061116e565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156103075789959361086d936101838f979461019a948d9161092d575b5060170b8a1292949550509161085a565b6109449150893d8b11610300576102f28183610a88565b5f61091c565b6109619150873d8911610300576102f28183610a88565b5f61084d565b61097e91508d803d1061035e576103508183610a88565b5f610821565b90935061010b96506107fc92506109a9915060a03d81116103a35761038b8183610a88565b92989295939450929190506107e3565b60a090895192838092633fabe5a360e21b82525afa90811561043b57859086926109fd575b50610408576109f0610e109142610b23565b11156103f857845f6107b4565b9050610a17915060a03d81116103a35761038b8183610a88565b505091505f6109de565b8490346100965781600319360112610096576001546001600160a01b03168152602090f35b6080906003190112610a8457600435906024356001600160a01b0381168103610a8457906044356001600160801b0381168103610a84579060643590565b5f80fd5b90601f8019910116810190811067ffffffffffffffff821117610aaa57604052565b634e487b7160e01b5f52604160045260245ffd5b90816020910312610a84575160ff81168103610a845790565b519069ffffffffffffffffffff82168203610a8457565b908160a0910312610a8457610b0281610ad7565b91602082015191604081015191610b20608060608401519301610ad7565b90565b91908203918211610b3057565b634e487b7160e01b5f52601160045260245ffd5b15610b4b57565b60405162461bcd60e51b815260206004820152600f60248201526e14dd185b19481c1c9a58d959995959608a1b6044820152606490fd5b90816020910312610a8457516001600160a01b0381168103610a845790565b90816020910312610a8457518060170b8103610a845790565b15610bc157565b60405162461bcd60e51b815260206004820152600f60248201526e1b5a5b8bdb585e081c995858da1959608a1b6044820152606490fd5b15610bff57565b60405162461bcd60e51b8152602060048201526019602482015278105b9cddd95c8819da5d995b881899599bdc99481c9bdd5b99603a1b6044820152606490fd5b60ff16604d8111610b3057600a0a90565b604d8111610b3057600a0a90565b81810292918115918404141715610b3057565b9093929160018060a01b03915f928084541680610f0e575b5060408051633fabe5a360e21b81526004989192918083169160a0818c81865afa908115610f0457889089988a918b94610ecf575b50610cd8919061010b906001600160801b031642610b23565b85516309169eff60e21b81526020959086818f81895afa908115610ea8578b91610eb2575b508751630455b78f60e31b815291169086818f81855afa908115610ea857908e979695949392918c91610e8b575b5060170b8a139081610e19575b509161019a91610183610d4b9594610bba565b15610ddc57819084519384809263313ce56760e01b82525afa928315610dd35750916108db91610d859594938792610db6575b5050610c40565b915b6012039060128211610da35750610b209293506101f890610c51565b634e487b7160e01b815260118552602490fd5b610dcc9250803d1061023e576102308183610a88565b5f80610d7e565b513d87823e3d90fd5b819084969596519384809263313ce56760e01b82525afa928315610dd35750916108a291610e139594938792610db6575050610c40565b91610d87565b8697929394959691508851928380926370da2f6760e01b82525afa908115610e8157928d9695949261018361019a93610d4b968e91610e64575b5060170b8c12929495505091610d38565b610e7b9150893d8b11610300576102f28183610a88565b5f610e53565b87513d8c823e3d90fd5b610ea29150873d8911610300576102f28183610a88565b5f610d2b565b88513d8d823e3d90fd5b610ec99150873d891161035e576103508183610a88565b5f610cfd565b90935061010b9950610cd89250610ef4915060a03d81116103a35761038b8183610a88565b929b929593945092919050610cbf565b85513d8a823e3d90fd5b60a060049160405192838092633fabe5a360e21b82525afa908115610f9b5785908692610f77575b50610f6657610f48610e109142610b23565b1115610f54575f610c8a565b60405163d15f73b560e01b8152600490fd5b60405162032b3d60e81b8152600490fd5b9050610f91915060a03d81116103a35761038b8183610a88565b505091505f610f36565b6040513d87823e3d90fd5b908151811015610fb7570160200190565b634e487b7160e01b5f52603260045260245ffd5b60408051633942720b60e11b8152915f9160049183908590849082906001600160a01b03165afa9384156111645783946110a9575b508051908082019082821067ffffffffffffffff83111761109657526003938482526208aa8960eb1b6020830152835b85811061104257505050505050600190565b6001600160f81b0319806110568385610fa6565b5116906110638386610fa6565b51160361108d575f19811461107a57600101611030565b634e487b7160e01b855260118452602485fd5b50505050905090565b634e487b7160e01b855260418452602485fd5b9093503d8084833e6110bb8183610a88565b810190602090818184031261116057805167ffffffffffffffff9182821161115c570183601f8201121561114557805191821161114957865193611108601f8401601f1916850186610a88565b8285528383830101116111455790859291835b82811061112f57505083010152925f611000565b818101840151868201850152879450830161111b565b8580fd5b634e487b7160e01b865260418552602486fd5b8680fd5b8480fd5b81513d85823e3d90fd5b915f1982840992828102928380861095039480860395146111e05784831115610a845782910981805f0316809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505080925015610a84570490565b9291906111fc82828661116e565b93821561121a570961120a57565b905f19811015610a845760010190565b634e487b7160e01b5f52601260045260245ffdfea26469706673582212207c13f272eea85213bd6904219a96eb4fc6cde55e2c590c86b5d70b371ccf11fd64736f6c63430008140033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
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.