Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 4637874 | 1472 days ago | 0 ETH | ||||
| 4637773 | 1472 days ago | 0 ETH | ||||
| 4637004 | 1472 days ago | 0 ETH | ||||
| 4636579 | 1472 days ago | 0 ETH | ||||
| 4636084 | 1472 days ago | 0 ETH | ||||
| 4635853 | 1472 days ago | 0 ETH | ||||
| 4635689 | 1472 days ago | 0 ETH | ||||
| 4635680 | 1472 days ago | 0 ETH | ||||
| 4635323 | 1472 days ago | 0 ETH | ||||
| 4635297 | 1472 days ago | 0 ETH | ||||
| 4635172 | 1472 days ago | 0 ETH | ||||
| 4633154 | 1472 days ago | 0 ETH | ||||
| 4633143 | 1472 days ago | 0 ETH | ||||
| 4632578 | 1472 days ago | 0 ETH | ||||
| 4632564 | 1472 days ago | 0 ETH | ||||
| 4631820 | 1472 days ago | 0 ETH | ||||
| 4631589 | 1472 days ago | 0 ETH | ||||
| 4631455 | 1472 days ago | 0 ETH | ||||
| 4631438 | 1472 days ago | 0 ETH | ||||
| 4631348 | 1472 days ago | 0 ETH | ||||
| 4631218 | 1472 days ago | 0 ETH | ||||
| 4630986 | 1472 days ago | 0 ETH | ||||
| 4630902 | 1472 days ago | 0 ETH | ||||
| 4630837 | 1472 days ago | 0 ETH | ||||
| 4630336 | 1472 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ExecFacet
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import {LibExec} from "../libraries/diamond/LibExec.sol";
import {GelatoBytes} from "../libraries/GelatoBytes.sol";
import {getBalance} from "../functions/FUtils.sol";
import {NATIVE_TOKEN} from "../constants/CTokens.sol";
contract ExecFacet {
using LibExec for address;
using GelatoBytes for bytes;
event LogExecSuccess(
address indexed executor,
address indexed service,
bool indexed wasExecutorPaid,
address creditToken,
uint256 credit,
uint256 creditInNativeToken
);
// ################ Callable by Executor ################
// solhint-disable-next-line code-complexity, function-max-lines
function exec(
address _service,
bytes calldata _data,
address _creditToken
)
external
returns (
uint256 credit,
uint256 creditInNativeToken,
uint256 gasDebitInNativeToken,
uint256 estimatedGasUsed
)
{
uint256 startGas = gasleft();
require(msg.sender.isExecutor(), "ExecFacet.exec: onlyExecutors");
uint256 preCreditTokenBalance = getBalance(_creditToken, address(this));
(bool success, bytes memory returndata) = _service.call(_data);
if (!success) returndata.revertWithError("ExecFacet.exec:");
uint256 postCreditTokenBalance = getBalance(
_creditToken,
address(this)
);
credit = postCreditTokenBalance - preCreditTokenBalance;
if (_creditToken == NATIVE_TOKEN) creditInNativeToken = credit;
if (creditInNativeToken > 0)
(success, ) = msg.sender.call{value: creditInNativeToken}("");
gasDebitInNativeToken; // silence warning (var not needed)
emit LogExecSuccess(
msg.sender,
_service,
creditInNativeToken > 0 ? success : false,
_creditToken,
credit,
creditInNativeToken
);
estimatedGasUsed = startGas - gasleft();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT pragma solidity 0.8.10; address constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import {NATIVE_TOKEN} from "../constants/CTokens.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
function getBalance(address token, address user) view returns (uint256) {
return token == NATIVE_TOKEN ? user.balance : IERC20(token).balanceOf(user);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.10;
library GelatoBytes {
function calldataSliceSelector(bytes calldata _bytes)
internal
pure
returns (bytes4 selector)
{
selector =
_bytes[0] |
(bytes4(_bytes[1]) >> 8) |
(bytes4(_bytes[2]) >> 16) |
(bytes4(_bytes[3]) >> 24);
}
function memorySliceSelector(bytes memory _bytes)
internal
pure
returns (bytes4 selector)
{
selector =
_bytes[0] |
(bytes4(_bytes[1]) >> 8) |
(bytes4(_bytes[2]) >> 16) |
(bytes4(_bytes[3]) >> 24);
}
function revertWithError(bytes memory _bytes, string memory _tracingInfo)
internal
pure
{
// 68: 32-location, 32-length, 4-ErrorSelector, UTF-8 err
if (_bytes.length % 32 == 4) {
bytes4 selector;
assembly {
selector := mload(add(0x20, _bytes))
}
if (selector == 0x08c379a0) {
// Function selector for Error(string)
assembly {
_bytes := add(_bytes, 68)
}
revert(string(abi.encodePacked(_tracingInfo, string(_bytes))));
} else {
revert(
string(abi.encodePacked(_tracingInfo, "NoErrorSelector"))
);
}
} else {
revert(
string(abi.encodePacked(_tracingInfo, "UnexpectedReturndata"))
);
}
}
function returnError(bytes memory _bytes, string memory _tracingInfo)
internal
pure
returns (string memory)
{
// 68: 32-location, 32-length, 4-ErrorSelector, UTF-8 err
if (_bytes.length % 32 == 4) {
bytes4 selector;
assembly {
selector := mload(add(0x20, _bytes))
}
if (selector == 0x08c379a0) {
// Function selector for Error(string)
assembly {
_bytes := add(_bytes, 68)
}
return string(abi.encodePacked(_tracingInfo, string(_bytes)));
} else {
return
string(abi.encodePacked(_tracingInfo, "NoErrorSelector"));
}
} else {
return
string(abi.encodePacked(_tracingInfo, "UnexpectedReturndata"));
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
library LibExec {
using EnumerableSet for EnumerableSet.AddressSet;
struct ExecutorStorage {
EnumerableSet.AddressSet executors;
}
bytes32 private constant _EXECUTOR_STORAGE_POSITION =
keccak256("gelato.diamond.executor.storage");
function addExecutor(address _executor) internal returns (bool) {
return executorStorage().executors.add(_executor);
}
function removeExecutor(address _executor) internal returns (bool) {
return executorStorage().executors.remove(_executor);
}
function canExec(address _executor) internal view returns (bool) {
return isExecutor(_executor);
}
function isExecutor(address _executor) internal view returns (bool) {
return executorStorage().executors.contains(_executor);
}
function executorAt(uint256 _index) internal view returns (address) {
return executorStorage().executors.at(_index);
}
function executors() internal view returns (address[] memory executors_) {
uint256 length = numberOfExecutors();
executors_ = new address[](length);
for (uint256 i; i < length; i++) executors_[i] = executorAt(i);
}
function numberOfExecutors() internal view returns (uint256) {
return executorStorage().executors.length();
}
function executorStorage()
internal
pure
returns (ExecutorStorage storage es)
{
bytes32 position = _EXECUTOR_STORAGE_POSITION;
assembly {
es.slot := position
}
}
}{
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"bool","name":"wasExecutorPaid","type":"bool"},{"indexed":false,"internalType":"address","name":"creditToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"credit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditInNativeToken","type":"uint256"}],"name":"LogExecSuccess","type":"event"},{"inputs":[{"internalType":"address","name":"_service","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"_creditToken","type":"address"}],"name":"exec","outputs":[{"internalType":"uint256","name":"credit","type":"uint256"},{"internalType":"uint256","name":"creditInNativeToken","type":"uint256"},{"internalType":"uint256","name":"gasDebitInNativeToken","type":"uint256"},{"internalType":"uint256","name":"estimatedGasUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5061066a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b87b0b4c14610030575b600080fd5b61004361003e366004610433565b610067565b60408051948552602085019390935291830152606082015260800160405180910390f35b60008060008060005a905061007b3361028b565b6100cc5760405162461bcd60e51b815260206004820152601d60248201527f4578656346616365742e657865633a206f6e6c794578656375746f727300000060448201526064015b60405180910390fd5b60006100d887306102db565b90506000808b6001600160a01b03168b8b6040516100f79291906104c7565b6000604051808303816000865af19150503d8060008114610134576040519150601f19603f3d011682016040523d82523d6000602084013e610139565b606091505b5091509150816101745760408051808201909152600f81526e22bc32b1a330b1b2ba1732bc32b19d60891b6020820152610174908290610383565b60006101808a306102db565b905061018c84826104d7565b98506001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156101b7578897505b87156102085760405133908990600081818185875af1925050503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909350505b60008811610217576000610219565b825b604080516001600160a01b038d81168252602082018d90529181018b905291151591908f169033907f6da4358c1cb5c8393404ca7e0e1378511132ef4243bf40742da1db6789a3e7ec9060600160405180910390a45a61027990866104d7565b95505050505050945094509450949050565b60006102d5827f7ad725e6d99a082d357ed78c93550a4ac89ca228cbbe8e92f3140a9c2a3effa5906001600160a01b0381166000908152600183016020526040812054151561037c565b92915050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610370576040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b91906104fc565b61037c565b816001600160a01b0316315b9392505050565b602082516103919190610515565b6004141561040657602082015162461bcd60e51b6001600160e01b0319821614156103f55760448301925081836040516020016103cf929190610567565b60408051601f198184030181529082905262461bcd60e51b82526100c391600401610596565b816040516020016103cf91906105c9565b806040516020016103cf91906105fc565b80356001600160a01b038116811461042e57600080fd5b919050565b6000806000806060858703121561044957600080fd5b61045285610417565b9350602085013567ffffffffffffffff8082111561046f57600080fd5b818701915087601f83011261048357600080fd5b81358181111561049257600080fd5b8860208285010111156104a457600080fd5b6020830195508094505050506104bc60408601610417565b905092959194509250565b8183823760009101908152919050565b6000828210156104f757634e487b7160e01b600052601160045260246000fd5b500390565b60006020828403121561050e57600080fd5b5051919050565b60008261053257634e487b7160e01b600052601260045260246000fd5b500690565b60005b8381101561055257818101518382015260200161053a565b83811115610561576000848401525b50505050565b60008351610579818460208801610537565b83519083019061058d818360208801610537565b01949350505050565b60208152600082518060208401526105b5816040850160208701610537565b601f01601f19169190910160400192915050565b600082516105db818460208701610537565b6e2737a2b93937b929b2b632b1ba37b960891b920191825250600f01919050565b6000825161060e818460208701610537565b73556e657870656374656452657475726e6461746160601b92019182525060140191905056fea26469706673582212209c5a7f574b305e211b6ae6a75fcc627a6f28607e0e377cc9046d0edb02b4f84364736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b87b0b4c14610030575b600080fd5b61004361003e366004610433565b610067565b60408051948552602085019390935291830152606082015260800160405180910390f35b60008060008060005a905061007b3361028b565b6100cc5760405162461bcd60e51b815260206004820152601d60248201527f4578656346616365742e657865633a206f6e6c794578656375746f727300000060448201526064015b60405180910390fd5b60006100d887306102db565b90506000808b6001600160a01b03168b8b6040516100f79291906104c7565b6000604051808303816000865af19150503d8060008114610134576040519150601f19603f3d011682016040523d82523d6000602084013e610139565b606091505b5091509150816101745760408051808201909152600f81526e22bc32b1a330b1b2ba1732bc32b19d60891b6020820152610174908290610383565b60006101808a306102db565b905061018c84826104d7565b98506001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156101b7578897505b87156102085760405133908990600081818185875af1925050503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909350505b60008811610217576000610219565b825b604080516001600160a01b038d81168252602082018d90529181018b905291151591908f169033907f6da4358c1cb5c8393404ca7e0e1378511132ef4243bf40742da1db6789a3e7ec9060600160405180910390a45a61027990866104d7565b95505050505050945094509450949050565b60006102d5827f7ad725e6d99a082d357ed78c93550a4ac89ca228cbbe8e92f3140a9c2a3effa5906001600160a01b0381166000908152600183016020526040812054151561037c565b92915050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610370576040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b91906104fc565b61037c565b816001600160a01b0316315b9392505050565b602082516103919190610515565b6004141561040657602082015162461bcd60e51b6001600160e01b0319821614156103f55760448301925081836040516020016103cf929190610567565b60408051601f198184030181529082905262461bcd60e51b82526100c391600401610596565b816040516020016103cf91906105c9565b806040516020016103cf91906105fc565b80356001600160a01b038116811461042e57600080fd5b919050565b6000806000806060858703121561044957600080fd5b61045285610417565b9350602085013567ffffffffffffffff8082111561046f57600080fd5b818701915087601f83011261048357600080fd5b81358181111561049257600080fd5b8860208285010111156104a457600080fd5b6020830195508094505050506104bc60408601610417565b905092959194509250565b8183823760009101908152919050565b6000828210156104f757634e487b7160e01b600052601160045260246000fd5b500390565b60006020828403121561050e57600080fd5b5051919050565b60008261053257634e487b7160e01b600052601260045260246000fd5b500690565b60005b8381101561055257818101518382015260200161053a565b83811115610561576000848401525b50505050565b60008351610579818460208801610537565b83519083019061058d818360208801610537565b01949350505050565b60208152600082518060208401526105b5816040850160208701610537565b601f01601f19169190910160400192915050565b600082516105db818460208701610537565b6e2737a2b93937b929b2b632b1ba37b960891b920191825250600f01919050565b6000825161060e818460208701610537565b73556e657870656374656452657475726e6461746160601b92019182525060140191905056fea26469706673582212209c5a7f574b305e211b6ae6a75fcc627a6f28607e0e377cc9046d0edb02b4f84364736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
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.