Source Code
Overview
GLMR Balance
GLMR Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 5107573 | 769 days ago | Contract Creation | 0 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TokenHandler
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ITokenHandler } from './interfaces/ITokenHandler.sol';
import { IERC20 } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IERC20.sol';
import { SafeTokenTransferFrom, SafeTokenCall } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/libs/SafeTransfer.sol';
import { ReentrancyGuard } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/utils/ReentrancyGuard.sol';
import { ITokenManagerType } from './interfaces/ITokenManagerType.sol';
import { IERC20MintableBurnable } from './interfaces/IERC20MintableBurnable.sol';
import { IERC20BurnableFrom } from './interfaces/IERC20BurnableFrom.sol';
/**
* @title TokenHandler
* @notice This interface is responsible for handling tokens before initiating an interchain token transfer, or after receiving one.
*/
contract TokenHandler is ITokenHandler, ITokenManagerType, ReentrancyGuard {
using SafeTokenTransferFrom for IERC20;
using SafeTokenCall for IERC20;
/**
* @notice This function gives token to a specified address from the token manager.
* @param tokenManagerType The token manager type.
* @param tokenAddress The address of the token to give.
* @param tokenManager The address of the token manager.
* @param to The address to give tokens to.
* @param amount The amount of tokens to give.
* @return uint256 The amount of token actually given, which could be different for certain token type.
*/
// slither-disable-next-line locked-ether
function giveToken(
uint256 tokenManagerType,
address tokenAddress,
address tokenManager,
address to,
uint256 amount
) external payable returns (uint256) {
if (tokenManagerType == uint256(TokenManagerType.MINT_BURN) || tokenManagerType == uint256(TokenManagerType.MINT_BURN_FROM)) {
_giveTokenMintBurn(tokenAddress, to, amount);
return amount;
}
if (tokenManagerType == uint256(TokenManagerType.LOCK_UNLOCK)) {
_transferTokenFrom(tokenAddress, tokenManager, to, amount);
return amount;
}
if (tokenManagerType == uint256(TokenManagerType.LOCK_UNLOCK_FEE)) {
amount = _transferTokenFromWithFee(tokenAddress, tokenManager, to, amount);
return amount;
}
revert UnsupportedTokenManagerType(tokenManagerType);
}
/**
* @notice This function takes token from a specified address to the token manager.
* @param tokenManagerType The token manager type.
* @param tokenAddress The address of the token to give.
* @param tokenManager The address of the token manager.
* @param from The address to take tokens from.
* @param amount The amount of token to take.
* @return uint256 The amount of token actually taken, which could be different for certain token type.
*/
// slither-disable-next-line locked-ether
function takeToken(
uint256 tokenManagerType,
address tokenAddress,
address tokenManager,
address from,
uint256 amount
) external payable returns (uint256) {
if (tokenManagerType == uint256(TokenManagerType.MINT_BURN)) {
_takeTokenMintBurn(tokenAddress, from, amount);
return amount;
}
if (tokenManagerType == uint256(TokenManagerType.MINT_BURN_FROM)) {
_takeTokenMintBurnFrom(tokenAddress, from, amount);
return amount;
}
if (tokenManagerType == uint256(TokenManagerType.LOCK_UNLOCK)) {
_transferTokenFrom(tokenAddress, from, tokenManager, amount);
return amount;
}
if (tokenManagerType == uint256(TokenManagerType.LOCK_UNLOCK_FEE)) {
amount = _transferTokenFromWithFee(tokenAddress, from, tokenManager, amount);
return amount;
}
revert UnsupportedTokenManagerType(tokenManagerType);
}
/**
* @notice This function transfers token from and to a specified address.
* @param tokenManagerType The token manager type.
* @param tokenAddress the address of the token to give.
* @param from The address to transfer tokens from.
* @param to The address to transfer tokens to.
* @param amount The amount of token to transfer.
* @return uint256 The amount of token actually transferred, which could be different for certain token type.
*/
// slither-disable-next-line locked-ether
function transferTokenFrom(
uint256 tokenManagerType,
address tokenAddress,
address from,
address to,
uint256 amount
) external payable returns (uint256) {
if (
tokenManagerType == uint256(TokenManagerType.LOCK_UNLOCK) ||
tokenManagerType == uint256(TokenManagerType.MINT_BURN) ||
tokenManagerType == uint256(TokenManagerType.MINT_BURN_FROM)
) {
_transferTokenFrom(tokenAddress, from, to, amount);
return amount;
}
if (tokenManagerType == uint256(TokenManagerType.LOCK_UNLOCK_FEE)) {
amount = _transferTokenFromWithFee(tokenAddress, from, to, amount);
return amount;
}
revert UnsupportedTokenManagerType(tokenManagerType);
}
function _transferTokenFrom(address tokenAddress, address from, address to, uint256 amount) internal {
// slither-disable-next-line arbitrary-send-erc20
IERC20(tokenAddress).safeTransferFrom(from, to, amount);
}
function _transferTokenFromWithFee(
address tokenAddress,
address from,
address to,
uint256 amount
) internal noReEntrancy returns (uint256) {
uint256 balanceBefore = IERC20(tokenAddress).balanceOf(to);
_transferTokenFrom(tokenAddress, from, to, amount);
uint256 diff = IERC20(tokenAddress).balanceOf(to) - balanceBefore;
if (diff < amount) {
amount = diff;
}
return amount;
}
function _giveTokenMintBurn(address tokenAddress, address to, uint256 amount) internal {
IERC20(tokenAddress).safeCall(abi.encodeWithSelector(IERC20MintableBurnable.mint.selector, to, amount));
}
function _takeTokenMintBurn(address tokenAddress, address from, uint256 amount) internal {
IERC20(tokenAddress).safeCall(abi.encodeWithSelector(IERC20MintableBurnable.burn.selector, from, amount));
}
function _takeTokenMintBurnFrom(address tokenAddress, address from, uint256 amount) internal {
IERC20(tokenAddress).safeCall(abi.encodeWithSelector(IERC20BurnableFrom.burnFrom.selector, from, amount));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
error InvalidAccount();
/**
* @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
pragma solidity ^0.8.0;
/**
* @title ReentrancyGuard
* @notice This contract provides a mechanism to halt the execution of specific functions
* if a pause condition is activated.
*/
interface IReentrancyGuard {
error ReentrantCall();
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IERC20 } from '../interfaces/IERC20.sol';
error TokenTransferFailed();
/*
* @title SafeTokenCall
* @dev This library is used for performing safe token transfers.
*/
library SafeTokenCall {
/*
* @notice Make a safe call to a token contract.
* @param token The token contract to interact with.
* @param callData The function call data.
* @throws TokenTransferFailed error if transfer of token is not successful.
*/
function safeCall(IERC20 token, bytes memory callData) internal {
(bool success, bytes memory returnData) = address(token).call(callData);
bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
if (!transferred || address(token).code.length == 0) revert TokenTransferFailed();
}
}
/*
* @title SafeTokenTransfer
* @dev This library safely transfers tokens from the contract to a recipient.
*/
library SafeTokenTransfer {
/*
* @notice Transfer tokens to a recipient.
* @param token The token contract.
* @param receiver The recipient of the tokens.
* @param amount The amount of tokens to transfer.
*/
function safeTransfer(
IERC20 token,
address receiver,
uint256 amount
) internal {
SafeTokenCall.safeCall(token, abi.encodeWithSelector(IERC20.transfer.selector, receiver, amount));
}
}
/*
* @title SafeTokenTransferFrom
* @dev This library helps to safely transfer tokens on behalf of a token holder.
*/
library SafeTokenTransferFrom {
/*
* @notice Transfer tokens on behalf of a token holder.
* @param token The token contract.
* @param from The address of the token holder.
* @param to The address the tokens are to be sent to.
* @param amount The amount of tokens to be transferred.
*/
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 amount
) internal {
SafeTokenCall.safeCall(token, abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IReentrancyGuard } from '../interfaces/IReentrancyGuard.sol';
/**
* @title ReentrancyGuard
* @notice This contract provides a mechanism to halt the execution of specific functions
* if a pause condition is activated.
*/
contract ReentrancyGuard is IReentrancyGuard {
// uint256(keccak256('ReentrancyGuard:entered')) - 1
uint256 internal constant ENTERED_SLOT = 0x1a771c70cada93a906f955a7dec24a83d7954ba2f75256be4febcf62b395d532;
uint256 internal constant NOT_ENTERED = 1;
uint256 internal constant ENTERED = 2;
/**
* @notice A modifier that throws a ReEntrancy custom error if the contract is entered
* @dev This modifier should be used with functions that can be entered twice
*/
modifier noReEntrancy() {
if (_hasEntered()) revert ReentrantCall();
_setEntered(ENTERED);
_;
_setEntered(NOT_ENTERED);
}
/**
* @notice Check if the contract is already executing.
* @return entered A boolean representing the entered status. True if already executing, false otherwise.
*/
function _hasEntered() internal view returns (bool entered) {
assembly {
entered := eq(sload(ENTERED_SLOT), ENTERED)
}
}
/**
* @notice Sets the entered status of the contract
* @param entered A boolean representing the entered status. True if already executing, false otherwise.
*/
function _setEntered(uint256 entered) internal {
assembly {
sstore(ENTERED_SLOT, entered)
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title IERC20BurnableFrom Interface
* @notice Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20BurnableFrom {
/**
* @notice Function to burn tokens.
* @dev Requires the caller to have allowance for `amount` on `from`.
* Can only be called by the minter address.
* @param from The address that will have its tokens burnt.
* @param amount The amount of tokens to burn.
*/
function burnFrom(address from, uint256 amount) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title IERC20MintableBurnable Interface
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20MintableBurnable {
/**
* @notice Function to mint new tokens.
* @dev Can only be called by the minter address.
* @param to The address that will receive the minted tokens.
* @param amount The amount of tokens to mint.
*/
function mint(address to, uint256 amount) external;
/**
* @notice Function to burn tokens.
* @dev Can only be called by the minter address.
* @param from The address that will have its tokens burnt.
* @param amount The amount of tokens to burn.
*/
function burn(address from, uint256 amount) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title ITokenHandler Interface
* @notice This interface is responsible for handling tokens before initiating an interchain token transfer, or after receiving one.
*/
interface ITokenHandler {
error UnsupportedTokenManagerType(uint256 tokenManagerType);
/**
* @notice This function gives token to a specified address from the token manager.
* @param tokenManagerType The token manager type.
* @param tokenAddress The address of the token to give.
* @param tokenManager The address of the token manager.
* @param to The address to give tokens to.
* @param amount The amount of tokens to give.
* @return uint256 The amount of token actually given, which could be different for certain token type.
*/
function giveToken(
uint256 tokenManagerType,
address tokenAddress,
address tokenManager,
address to,
uint256 amount
) external payable returns (uint256);
/**
* @notice This function takes token from a specified address to the token manager.
* @param tokenManagerType The token manager type.
* @param tokenAddress The address of the token to give.
* @param tokenManager The address of the token manager.
* @param from The address to take tokens from.
* @param amount The amount of token to take.
* @return uint256 The amount of token actually taken, which could be different for certain token type.
*/
function takeToken(
uint256 tokenManagerType,
address tokenAddress,
address tokenManager,
address from,
uint256 amount
) external payable returns (uint256);
/**
* @notice This function transfers token from and to a specified address.
* @param tokenManagerType The token manager type.
* @param tokenAddress the address of the token to give.
* @param from The address to transfer tokens from.
* @param to The address to transfer tokens to.
* @param amount The amount of token to transfer.
* @return uint256 The amount of token actually transferred, which could be different for certain token type.
*/
function transferTokenFrom(
uint256 tokenManagerType,
address tokenAddress,
address from,
address to,
uint256 amount
) external payable returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title ITokenManagerType Interface
* @notice A simple interface that defines all the token manager types.
*/
interface ITokenManagerType {
enum TokenManagerType {
MINT_BURN,
MINT_BURN_FROM,
LOCK_UNLOCK,
LOCK_UNLOCK_FEE
}
}{
"evmVersion": "london",
"optimizer": {
"enabled": true,
"runs": 1000,
"details": {
"peephole": true,
"inliner": true,
"jumpdestRemover": true,
"orderLiterals": true,
"deduplicate": true,
"cse": true,
"constantOptimizer": true,
"yul": true,
"yulDetails": {
"stackAllocation": true
}
}
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"ReentrantCall","type":"error"},{"inputs":[],"name":"TokenTransferFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenManagerType","type":"uint256"}],"name":"UnsupportedTokenManagerType","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenManagerType","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"tokenManager","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"giveToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenManagerType","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"tokenManager","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"takeToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenManagerType","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTokenFrom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5061076e806100206000396000f3fe6080604052600436106100345760003560e01c806345537d7014610039578063726891261461005e578063b2668ef614610071575b600080fd5b61004c610047366004610632565b610084565b60405190815260200160405180910390f35b61004c61006c366004610632565b610116565b61004c61007f366004610632565b610149565b60006002861480610093575085155b8061009e5750600186145b156100b6576100af85858585610196565b508061010d565b600386036100d4576100ca858585856101b1565b915081905061010d565b6040517ff24fcfa10000000000000000000000000000000000000000000000000000000081526004810187905260240160405180910390fd5b95945050505050565b60008515806101255750600186145b15610135576100af85848461036f565b600286036100b6576100af85858585610196565b60008561015b576100af858484610426565b6001860361016e576100af85848461046d565b60028603610182576100af85848685610196565b600386036100d4576100ca858486856101b1565b6101ab6001600160a01b0385168484846104b4565b50505050565b60006101de7f1a771c70cada93a906f955a7dec24a83d7954ba2f75256be4febcf62b395d5325460021490565b15610215576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61023e60027f1a771c70cada93a906f955a7dec24a83d7954ba2f75256be4febcf62b395d53255565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908716906370a0823190602401602060405180830381865afa158015610288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ac9190610687565b90506102ba86868686610196565b6040516370a0823160e01b81526001600160a01b03858116600483015260009183918916906370a0823190602401602060405180830381865afa158015610305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103299190610687565b61033391906106a0565b905083811015610341578093505b505060017f1a771c70cada93a906f955a7dec24a83d7954ba2f75256be4febcf62b395d53255509392505050565b6040516001600160a01b038316602482015260448101829052610421907f40c10f1900000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001600160a01b03851690610538565b505050565b6040516001600160a01b038316602482015260448101829052610421907f9dc29fac00000000000000000000000000000000000000000000000000000000906064016103b2565b6040516001600160a01b038316602482015260448101829052610421907f79cc679000000000000000000000000000000000000000000000000000000000906064016103b2565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526101ab9085905b600080836001600160a01b03168360405161055391906106e0565b6000604051808303816000865af19150503d8060008114610590576040519150601f19603f3d011682016040523d82523d6000602084013e610595565b606091505b509150915060008280156105c15750815115806105c15750818060200190518101906105c1919061070f565b90508015806105d857506001600160a01b0385163b155b1561060f576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b80356001600160a01b038116811461062d57600080fd5b919050565b600080600080600060a0868803121561064a57600080fd5b8535945061065a60208701610616565b935061066860408701610616565b925061067660608701610616565b949793965091946080013592915050565b60006020828403121561069957600080fd5b5051919050565b818103818111156106da577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000825160005b8181101561070157602081860181015185830152016106e7565b506000920191825250919050565b60006020828403121561072157600080fd5b8151801515811461073157600080fd5b939250505056fea2646970667358221220e9f00add8b8243a749c2587cca643ed3f5c5fb1e296ecd194914fb1b73d05e0164736f6c63430008150033
Deployed Bytecode
0x6080604052600436106100345760003560e01c806345537d7014610039578063726891261461005e578063b2668ef614610071575b600080fd5b61004c610047366004610632565b610084565b60405190815260200160405180910390f35b61004c61006c366004610632565b610116565b61004c61007f366004610632565b610149565b60006002861480610093575085155b8061009e5750600186145b156100b6576100af85858585610196565b508061010d565b600386036100d4576100ca858585856101b1565b915081905061010d565b6040517ff24fcfa10000000000000000000000000000000000000000000000000000000081526004810187905260240160405180910390fd5b95945050505050565b60008515806101255750600186145b15610135576100af85848461036f565b600286036100b6576100af85858585610196565b60008561015b576100af858484610426565b6001860361016e576100af85848461046d565b60028603610182576100af85848685610196565b600386036100d4576100ca858486856101b1565b6101ab6001600160a01b0385168484846104b4565b50505050565b60006101de7f1a771c70cada93a906f955a7dec24a83d7954ba2f75256be4febcf62b395d5325460021490565b15610215576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61023e60027f1a771c70cada93a906f955a7dec24a83d7954ba2f75256be4febcf62b395d53255565b6040516370a0823160e01b81526001600160a01b038481166004830152600091908716906370a0823190602401602060405180830381865afa158015610288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ac9190610687565b90506102ba86868686610196565b6040516370a0823160e01b81526001600160a01b03858116600483015260009183918916906370a0823190602401602060405180830381865afa158015610305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103299190610687565b61033391906106a0565b905083811015610341578093505b505060017f1a771c70cada93a906f955a7dec24a83d7954ba2f75256be4febcf62b395d53255509392505050565b6040516001600160a01b038316602482015260448101829052610421907f40c10f1900000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001600160a01b03851690610538565b505050565b6040516001600160a01b038316602482015260448101829052610421907f9dc29fac00000000000000000000000000000000000000000000000000000000906064016103b2565b6040516001600160a01b038316602482015260448101829052610421907f79cc679000000000000000000000000000000000000000000000000000000000906064016103b2565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526101ab9085905b600080836001600160a01b03168360405161055391906106e0565b6000604051808303816000865af19150503d8060008114610590576040519150601f19603f3d011682016040523d82523d6000602084013e610595565b606091505b509150915060008280156105c15750815115806105c15750818060200190518101906105c1919061070f565b90508015806105d857506001600160a01b0385163b155b1561060f576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b80356001600160a01b038116811461062d57600080fd5b919050565b600080600080600060a0868803121561064a57600080fd5b8535945061065a60208701610616565b935061066860408701610616565b925061067660608701610616565b949793965091946080013592915050565b60006020828403121561069957600080fd5b5051919050565b818103818111156106da577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b6000825160005b8181101561070157602081860181015185830152016106e7565b506000920191825250919050565b60006020828403121561072157600080fd5b8151801515811461073157600080fd5b939250505056fea2646970667358221220e9f00add8b8243a749c2587cca643ed3f5c5fb1e296ecd194914fb1b73d05e0164736f6c63430008150033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 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.