Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 71018240 | 999 days ago | 0 ETH | ||||
| 67278031 | 1011 days ago | 0 ETH | ||||
| 58695201 | 1038 days ago | 0 ETH | ||||
| 55389581 | 1051 days ago | 0 ETH | ||||
| 46375063 | 1092 days ago | 0 ETH | ||||
| 44856961 | 1098 days ago | 0 ETH | ||||
| 41806110 | 1109 days ago | 0 ETH | ||||
| 41805446 | 1109 days ago | 0 ETH | ||||
| 32936254 | 1141 days ago | 0 ETH | ||||
| 24727321 | 1183 days ago | 0 ETH | ||||
| 22089876 | 1198 days ago | 0 ETH | ||||
| 21942229 | 1199 days ago | 0 ETH | ||||
| 19354843 | 1225 days ago | 0 ETH | ||||
| 19286075 | 1226 days ago | 0 ETH | ||||
| 19195718 | 1227 days ago | 0 ETH | ||||
| 18544556 | 1235 days ago | 0 ETH | ||||
| 18543874 | 1235 days ago | 0 ETH | ||||
| 18543646 | 1235 days ago | 0 ETH | ||||
| 18543510 | 1235 days ago | 0 ETH | ||||
| 18536623 | 1235 days ago | 0 ETH | ||||
| 18305269 | 1238 days ago | 0 ETH | ||||
| 18116116 | 1240 days ago | 0 ETH | ||||
| 17830040 | 1243 days ago | 0 ETH | ||||
| 17254032 | 1252 days ago | 0 ETH | ||||
| 13157496 | 1293 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TokenSpender
Compiler Version
v0.8.5+commit.a4f2e591
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.8.5;
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
import "./base/RegistryManager.sol";
import "../interfaces/IRegistry.sol";
/**
Error codes:
- T1 = ERROR_TOKEN_SPENDER_NOT_WHITELISTED
*/
/// @title Opium.TokenSpender contract holds users ERC20 allowances and allows whitelisted contracts to use ERC20 tokens
contract TokenSpender is RegistryManager {
using SafeERC20Upgradeable for IERC20Upgradeable;
modifier onlyCoreSpenders() {
require(registry.isCoreSpenderWhitelisted(msg.sender), "T1");
_;
}
/// @notice it is called only once upon deployment of the contract
/// @param _registry sets the address of the Opium.Registry
function initialize(address _registry) external initializer {
__RegistryManager__init(_registry);
}
/// @notice Using this function whitelisted contracts could call ERC20 transfers
/// @param _token IERC20 Instance of token
/// @param _from address Address from which tokens are transferred
/// @param _to address Address of tokens receiver
/// @param _amount uint256 Amount of tokens to be transferred
function claimTokens(
IERC20Upgradeable _token,
address _from,
address _to,
uint256 _amount
) external onlyCoreSpenders {
_token.safeTransferFrom(_from, _to, _amount);
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) 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 `amount` 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 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20Upgradeable.sol";
import "../../../utils/AddressUpgradeable.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20Upgradeable {
using AddressUpgradeable for address;
function safeTransfer(
IERC20Upgradeable token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20Upgradeable token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20Upgradeable token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20Upgradeable token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20Upgradeable token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.8.5;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../../interfaces/IRegistry.sol";
/**
Error codes:
- M1 = ERROR_REGISTRY_MANAGER_ONLY_REGISTRY_MANAGER_ROLE
- M2 = ERROR_REGISTRY_MANAGER_ONLY_CORE_CONFIGURATION_UPDATER_ROLE
*/
contract RegistryManager is Initializable {
event LogRegistryChanged(address indexed _changer, address indexed _newRegistryAddress);
IRegistry internal registry;
modifier onlyRegistryManager() {
require(registry.isRegistryManager(msg.sender), "M1");
_;
}
modifier onlyCoreConfigurationUpdater() {
require(registry.isCoreConfigurationUpdater(msg.sender), "M2");
_;
}
function __RegistryManager__init(address _registry) internal initializer {
require(_registry != address(0));
registry = IRegistry(_registry);
emit LogRegistryChanged(msg.sender, _registry);
}
function setRegistry(address _registry) external onlyRegistryManager {
registry = IRegistry(_registry);
emit LogRegistryChanged(msg.sender, _registry);
}
function getRegistry() external view returns (address) {
return address(registry);
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private __gap;
}// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.8.5;
import "../core/registry/RegistryEntities.sol";
interface IRegistry {
function initialize(address _governor) external;
function setProtocolAddresses(
address _opiumProxyFactory,
address _core,
address _oracleAggregator,
address _syntheticAggregator,
address _tokenSpender
) external;
function setNoDataCancellationPeriod(uint32 _noDataCancellationPeriod) external;
function addToWhitelist(address _whitelisted) external;
function removeFromWhitelist(address _whitelisted) external;
function setProtocolExecutionReserveClaimer(address _protocolExecutionReserveClaimer) external;
function setProtocolRedemptionReserveClaimer(address _protocolRedemptionReserveClaimer) external;
function setProtocolExecutionReservePart(uint32 _protocolExecutionReservePart) external;
function setDerivativeAuthorExecutionFeeCap(uint32 _derivativeAuthorExecutionFeeCap) external;
function setProtocolRedemptionReservePart(uint32 _protocolRedemptionReservePart) external;
function setDerivativeAuthorRedemptionReservePart(uint32 _derivativeAuthorRedemptionReservePart) external;
function pause() external;
function pauseProtocolPositionCreation() external;
function pauseProtocolPositionMinting() external;
function pauseProtocolPositionRedemption() external;
function pauseProtocolPositionExecution() external;
function pauseProtocolPositionCancellation() external;
function pauseProtocolReserveClaim() external;
function unpause() external;
function getProtocolParameters() external view returns (RegistryEntities.ProtocolParametersArgs memory);
function getProtocolAddresses() external view returns (RegistryEntities.ProtocolAddressesArgs memory);
function isRegistryManager(address _address) external view returns (bool);
function isCoreConfigurationUpdater(address _address) external view returns (bool);
function getCore() external view returns (address);
function isCoreSpenderWhitelisted(address _address) external view returns (bool);
function isProtocolPaused() external view returns (bool);
function isProtocolPositionCreationPaused() external view returns (bool);
function isProtocolPositionMintingPaused() external view returns (bool);
function isProtocolPositionRedemptionPaused() external view returns (bool);
function isProtocolPositionExecutionPaused() external view returns (bool);
function isProtocolPositionCancellationPaused() external view returns (bool);
function isProtocolReserveClaimPaused() external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)
pragma solidity ^0.8.0;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
* initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() initializer {}
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
// If the contract is initializing we ignore whether _initialized is set in order to support multiple
// inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
// contract may have been reentered.
require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} modifier, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
function _isConstructor() private view returns (bool) {
return !AddressUpgradeable.isContract(address(this));
}
}// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.8.5;
library RegistryEntities {
struct ProtocolParametersArgs {
// Period of time after which ticker could be canceled if no data was provided to the `oracleId`
uint32 noDataCancellationPeriod;
// Max fee that derivative author can set
// it works as an upper bound for when the derivative authors set their synthetic's fee
uint32 derivativeAuthorExecutionFeeCap;
// Fixed part (percentage) that the derivative author receives for each redemption of market neutral positions
// It is not set by the derivative authors themselves
uint32 derivativeAuthorRedemptionReservePart;
// Represents which part of derivative author reserves originated from derivative executions go to the protocol reserves
uint32 protocolExecutionReservePart;
// Represents which part of derivative author reserves originated from redemption of market neutral positions go to the protocol reserves
uint32 protocolRedemptionReservePart;
/// Initially uninitialized variables to allow some flexibility in case of future changes and upgradeability
uint32 __gapOne;
uint32 __gapTwo;
uint32 __gapThree;
}
struct ProtocolAddressesArgs {
// Address of Opium.Core contract
address core;
// Address of Opium.OpiumProxyFactory contract
address opiumProxyFactory;
// Address of Opium.OracleAggregator contract
address oracleAggregator;
// Address of Opium.SyntheticAggregator contract
address syntheticAggregator;
// Address of Opium.TokenSpender contract
address tokenSpender;
// Address of the recipient of execution protocol reserves
address protocolExecutionReserveClaimer;
// Address of the recipient of redemption protocol reserves
address protocolRedemptionReserveClaimer;
/// Initially uninitialized variables to allow some flexibility in case of future changes and upgradeability
uint32 __gapOne;
uint32 __gapTwo;
}
struct ProtocolPausabilityArgs {
// if true, all the protocol's entry-points are paused
bool protocolGlobal;
// if true, no new positions can be created
bool protocolPositionCreation;
// if true, no new positions can be minted
bool protocolPositionMinting;
// if true, no new positions can be redeemed
bool protocolPositionRedemption;
// if true, no new positions can be executed
bool protocolPositionExecution;
// if true, no new positions can be cancelled
bool protocolPositionCancellation;
// if true, no reserves can be claimed
bool protocolReserveClaim;
/// Initially uninitialized variables to allow some flexibility in case of future changes and upgradeability
bool __gapOne;
bool __gapTwo;
bool __gapThree;
bool __gapFour;
}
}{
"optimizer": {
"enabled": true,
"runs": 800
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_changer","type":"address"},{"indexed":true,"internalType":"address","name":"_newRegistryAddress","type":"address"}],"name":"LogRegistryChanged","type":"event"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"_token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b506108cf806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630a5ea466146100515780635ab1bd5314610066578063a91ee0dc14610094578063c4d66de8146100a7575b600080fd5b61006461005f3660046107b5565b6100ba565b005b6000546201000090046001600160a01b03166040516001600160a01b03909116815260200160405180910390f35b6100646100a2366004610776565b61018b565b6100646100b5366004610776565b61029e565b60005460405163bd6962d160e01b8152336004820152620100009091046001600160a01b03169063bd6962d19060240160206040518083038186803b15801561010257600080fd5b505afa158015610116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013a9190610793565b6101705760405162461bcd60e51b8152602060048201526002602482015261543160f01b60448201526064015b60405180910390fd5b6101856001600160a01b038516848484610361565b50505050565b600054604051634048d90960e01b8152336004820152620100009091046001600160a01b031690634048d9099060240160206040518083038186803b1580156101d357600080fd5b505afa1580156101e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020b9190610793565b61023c5760405162461bcd60e51b81526020600482015260026024820152614d3160f01b6044820152606401610167565b6000805475ffffffffffffffffffffffffffffffffffffffff00001916620100006001600160a01b038416908102919091178255604051909133917fec10a16af385903532506d1567380fd8d93d880e8ed4bcacc42b0848e781406a9190a350565b600054610100900460ff166102b95760005460ff16156102bd565b303b155b6103205760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610167565b600054610100900460ff16158015610342576000805461ffff19166101011790555b61034b826103d0565b801561035d576000805461ff00191690555b5050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b1790526101859085906104fb565b600054610100900460ff166103eb5760005460ff16156103ef565b303b155b6104525760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610167565b600054610100900460ff16158015610474576000805461ffff19166101011790555b6001600160a01b03821661048757600080fd5b6000805475ffffffffffffffffffffffffffffffffffffffff00001916620100006001600160a01b038516908102919091178255604051909133917fec10a16af385903532506d1567380fd8d93d880e8ed4bcacc42b0848e781406a9190a3801561035d576000805461ff00191690555050565b6000610550826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166105e59092919063ffffffff16565b8051909150156105e0578080602001905181019061056e9190610793565b6105e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610167565b505050565b60606105f484846000856105fe565b90505b9392505050565b6060824710156106765760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610167565b843b6106c45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610167565b600080866001600160a01b031685876040516106e09190610806565b60006040518083038185875af1925050503d806000811461071d576040519150601f19603f3d011682016040523d82523d6000602084013e610722565b606091505b509150915061073282828661073d565b979650505050505050565b6060831561074c5750816105f7565b82511561075c5782518084602001fd5b8160405162461bcd60e51b81526004016101679190610822565b60006020828403121561078857600080fd5b81356105f781610881565b6000602082840312156107a557600080fd5b815180151581146105f757600080fd5b600080600080608085870312156107cb57600080fd5b84356107d681610881565b935060208501356107e681610881565b925060408501356107f681610881565b9396929550929360600135925050565b60008251610818818460208701610855565b9190910192915050565b6020815260008251806020840152610841816040850160208701610855565b601f01601f19169190910160400192915050565b60005b83811015610870578181015183820152602001610858565b838111156101855750506000910152565b6001600160a01b038116811461089657600080fd5b5056fea26469706673582212204353ce599c6a2ffda95f2e3548403ddad3d6daf551fd678502491dc6e4aacd7964736f6c63430008050033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630a5ea466146100515780635ab1bd5314610066578063a91ee0dc14610094578063c4d66de8146100a7575b600080fd5b61006461005f3660046107b5565b6100ba565b005b6000546201000090046001600160a01b03166040516001600160a01b03909116815260200160405180910390f35b6100646100a2366004610776565b61018b565b6100646100b5366004610776565b61029e565b60005460405163bd6962d160e01b8152336004820152620100009091046001600160a01b03169063bd6962d19060240160206040518083038186803b15801561010257600080fd5b505afa158015610116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013a9190610793565b6101705760405162461bcd60e51b8152602060048201526002602482015261543160f01b60448201526064015b60405180910390fd5b6101856001600160a01b038516848484610361565b50505050565b600054604051634048d90960e01b8152336004820152620100009091046001600160a01b031690634048d9099060240160206040518083038186803b1580156101d357600080fd5b505afa1580156101e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061020b9190610793565b61023c5760405162461bcd60e51b81526020600482015260026024820152614d3160f01b6044820152606401610167565b6000805475ffffffffffffffffffffffffffffffffffffffff00001916620100006001600160a01b038416908102919091178255604051909133917fec10a16af385903532506d1567380fd8d93d880e8ed4bcacc42b0848e781406a9190a350565b600054610100900460ff166102b95760005460ff16156102bd565b303b155b6103205760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610167565b600054610100900460ff16158015610342576000805461ffff19166101011790555b61034b826103d0565b801561035d576000805461ff00191690555b5050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b1790526101859085906104fb565b600054610100900460ff166103eb5760005460ff16156103ef565b303b155b6104525760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610167565b600054610100900460ff16158015610474576000805461ffff19166101011790555b6001600160a01b03821661048757600080fd5b6000805475ffffffffffffffffffffffffffffffffffffffff00001916620100006001600160a01b038516908102919091178255604051909133917fec10a16af385903532506d1567380fd8d93d880e8ed4bcacc42b0848e781406a9190a3801561035d576000805461ff00191690555050565b6000610550826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166105e59092919063ffffffff16565b8051909150156105e0578080602001905181019061056e9190610793565b6105e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610167565b505050565b60606105f484846000856105fe565b90505b9392505050565b6060824710156106765760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610167565b843b6106c45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610167565b600080866001600160a01b031685876040516106e09190610806565b60006040518083038185875af1925050503d806000811461071d576040519150601f19603f3d011682016040523d82523d6000602084013e610722565b606091505b509150915061073282828661073d565b979650505050505050565b6060831561074c5750816105f7565b82511561075c5782518084602001fd5b8160405162461bcd60e51b81526004016101679190610822565b60006020828403121561078857600080fd5b81356105f781610881565b6000602082840312156107a557600080fd5b815180151581146105f757600080fd5b600080600080608085870312156107cb57600080fd5b84356107d681610881565b935060208501356107e681610881565b925060408501356107f681610881565b9396929550929360600135925050565b60008251610818818460208701610855565b9190910192915050565b6020815260008251806020840152610841816040850160208701610855565b601f01601f19169190910160400192915050565b60005b83811015610870578181015183820152602001610858565b838111156101855750506000910152565b6001600160a01b038116811461089657600080fd5b5056fea26469706673582212204353ce599c6a2ffda95f2e3548403ddad3d6daf551fd678502491dc6e4aacd7964736f6c63430008050033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.