Overview
ETH Balance
ETH Value
Less Than $0.01 (@ $3,186.24/ETH)Latest 25 from a total of 58 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Cancel Order | 11549229 | 105 days ago | IN | 0 ETH | 0.00000012 | ||||
| Deposit Token | 11089882 | 116 days ago | IN | 0 ETH | 0.00000031 | ||||
| Cancel Order | 11089744 | 116 days ago | IN | 0 ETH | 0.00000012 | ||||
| Deposit Token | 11089721 | 116 days ago | IN | 0 ETH | 0.00000031 | ||||
| Cancel Order | 11089655 | 116 days ago | IN | 0 ETH | 0.00000012 | ||||
| Deposit Token | 10844251 | 121 days ago | IN | 0 ETH | 0.0000003 | ||||
| Cancel Order | 10844196 | 121 days ago | IN | 0 ETH | 0.00000012 | ||||
| Deposit Token | 10780535 | 123 days ago | IN | 0 ETH | 0.0000003 | ||||
| Deposit Token | 10324422 | 133 days ago | IN | 0 ETH | 0 | ||||
| Multicall | 6447813 | 223 days ago | IN | 0 ETH | 0.00001354 | ||||
| Deposit Token | 6357358 | 225 days ago | IN | 0 ETH | 0.00000957 | ||||
| Deposit Token | 5794205 | 238 days ago | IN | 0 ETH | 0.00000031 | ||||
| Cancel Order | 5392493 | 247 days ago | IN | 0 ETH | 0.00000005 | ||||
| Cancel Order | 5392474 | 247 days ago | IN | 0 ETH | 0.00000005 | ||||
| Cancel Order | 5392465 | 247 days ago | IN | 0 ETH | 0.00000005 | ||||
| Deposit Eth | 5380769 | 248 days ago | IN | 0.001 ETH | 0.00000027 | ||||
| Deposit Eth | 5380733 | 248 days ago | IN | 0.0001 ETH | 0.00000027 | ||||
| Deposit Eth | 5380708 | 248 days ago | IN | 0.0001 ETH | 0.00000027 | ||||
| Cancel Order | 5348921 | 248 days ago | IN | 0 ETH | 0.00000022 | ||||
| Cancel Order | 5348916 | 248 days ago | IN | 0 ETH | 0.00000024 | ||||
| Cancel Order | 5348912 | 248 days ago | IN | 0 ETH | 0.00000022 | ||||
| Deposit Eth | 5313777 | 249 days ago | IN | 0.001 ETH | 0.00000027 | ||||
| Deposit Eth | 5313766 | 249 days ago | IN | 0.001 ETH | 0.00000027 | ||||
| Deposit Eth | 5313752 | 249 days ago | IN | 0.001 ETH | 0.00000027 | ||||
| Cancel Order | 5287166 | 250 days ago | IN | 0 ETH | 0.00000017 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 11549229 | 105 days ago | Contract Creation | 0 ETH | |||
| 11089744 | 116 days ago | Contract Creation | 0 ETH | |||
| 11089655 | 116 days ago | Contract Creation | 0 ETH | |||
| 10844196 | 121 days ago | Contract Creation | 0 ETH | |||
| 6447813 | 223 days ago | Contract Creation | 0 ETH | |||
| 5392493 | 247 days ago | 0.0001 ETH | ||||
| 5392474 | 247 days ago | 0.0001 ETH | ||||
| 5392465 | 247 days ago | 0.001 ETH | ||||
| 5348921 | 248 days ago | 0.001 ETH | ||||
| 5348916 | 248 days ago | 0.001 ETH | ||||
| 5348912 | 248 days ago | 0.001 ETH | ||||
| 5287166 | 250 days ago | 0.001 ETH | ||||
| 5287163 | 250 days ago | 0.001 ETH | ||||
| 5287159 | 250 days ago | 0.01 ETH | ||||
| 5224306 | 251 days ago | 0.001 ETH | ||||
| 5067546 | 255 days ago | 0.001 ETH | ||||
| 4209788 | 275 days ago | Contract Creation | 0 ETH | |||
| 2617254 | 312 days ago | Contract Creation | 0 ETH | |||
| 2617191 | 312 days ago | Contract Creation | 0 ETH | |||
| 2439748 | 316 days ago | Contract Creation | 0 ETH | |||
| 1709647 | 333 days ago | 0.000297 ETH | ||||
| 1436465 | 339 days ago | 0.00001 ETH | ||||
| 651371 | 357 days ago | Contract Creation | 0 ETH | |||
| 648752 | 357 days ago | 0.00001 ETH | ||||
| 648752 | 357 days ago | 0.00001 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.7.6;
pragma abicoder v2;
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
function div(uint256 a, uint256 b) internal pure returns (uint256 c) {
require(b > 0, "ds-math-division-by-zero");
c = a / b;
}
}
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature)
internal
pure
returns (address)
{
// Check the signature length
if (signature.length != 65) {
revert("ECDSA: invalid signature length");
}
// Divide the signature in r, s and v variables
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solhint-disable-next-line no-inline-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (
uint256(s) >
0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
) {
revert("ECDSA: invalid signature 's' value");
}
if (v != 27 && v != 28) {
revert("ECDSA: invalid signature 'v' value");
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* replicates the behavior of the
* https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
* JSON-RPC method.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash)
internal
pure
returns (bytes32)
{
// 32 is the length in bytes of hash,
// enforced by the type signature above
return
keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
);
}
}
interface IERC20 {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
}
/**
* @title Fabric
* @dev Create deterministics vaults.
*
* Original work by Pine.Finance
* - https://github.com/pine-finance
*
* Authors:
* - Agustin Aguilar <agusx1211>
* - Ignacio Mazzara <nachomazzara>
*/
library Fabric {
/*Vault bytecode
def _fallback() payable:
call cd[56] with:
funct call.data[0 len 4]
gas cd[56] wei
args call.data[4 len 64]
selfdestruct(tx.origin)
// Constructor bytecode
0x6012600081600A8239f3
0x60 12 - PUSH1 12 // Size of the contract to return
0x60 00 - PUSH1 00 // Memory offset to return stored code
0x81 - DUP2 12 // Size of code to copy
0x60 0a - PUSH1 0A // Start of the code to copy
0x82 - DUP3 00 // Dest memory for code copy
0x39 - CODECOPY 00 0A 12 // Code copy to memory
0xf3 - RETURN 00 12 // Return code to store
// Deployed contract bytecode
0x60008060448082803781806038355AF132FF
0x60 00 - PUSH1 00 // Size for the call output
0x80 - DUP1 00 // Offset for the call output
0x60 44 - PUSH1 44 // Size for the call input
0x80 - DUP1 44 // Size for copying calldata to memory
0x82 - DUP3 00 // Offset for calldata copy
0x80 - DUP1 00 // Offset for destination of calldata copy
0x37 - CALLDATACOPY 00 00 44 // Execute calldata copy, is going to be used for next call
0x81 - DUP2 00 // Offset for call input
0x80 - DUP1 00 // Amount of ETH to send during call
0x60 38 - PUSH1 38 // calldata pointer to load value into stack
0x35 - CALLDATALOAD 38 (A) // Load value (A), address to call
0x5a - GAS // Remaining gas
0xf1 - CALL (A) (A) 00 00 44 00 00 // Execute call to address (A) with calldata mem[0:64]
0x32 - ORIGIN (B) // Dest funds for selfdestruct
0xff - SELFDESTRUCT (B) // selfdestruct contract, end of execution
*/
bytes public constant code =
hex"6012600081600A8239F360008060448082803781806038355AF132FF";
bytes32 public constant vaultCodeHash =
bytes32(
0xfa3da1081bc86587310fce8f3a5309785fc567b9b20875900cb289302d6bfa97
);
/**
* @dev Get a deterministics vault.
*/
function getVault(bytes32 _key) internal view returns (address) {
return
address(
uint256(
keccak256(
abi.encodePacked(
bytes1(0xff),
address(this),
_key,
vaultCodeHash
)
)
)
);
}
/**
* @dev Create deterministic vault.
*/
function executeVault(
bytes32 _key,
IERC20 _token,
address _to
) internal returns (uint256 value) {
address addr;
bytes memory slotcode = code;
/* solium-disable-next-line */
assembly {
// Create the contract arguments for the constructor
addr := create2(0, add(slotcode, 0x20), mload(slotcode), _key)
}
value = _token.balanceOf(addr);
/* solium-disable-next-line */
(bool success, ) = addr.call(
abi.encodePacked(
abi.encodeWithSelector(_token.transfer.selector, _to, value),
address(_token)
)
);
require(success, "Error pulling tokens");
}
}
/**
* Original work by Pine.Finance
* - https://github.com/pine-finance
*
* Authors:
* - Ignacio Mazzara <nachomazzara>
* - Agustin Aguilar <agusx1211>
*/
interface IModule {
/// @notice receive ETH
receive() external payable;
/**
* @notice Executes an order
* @param _inputToken - Address of the input token
* @param _inputAmount - uint256 of the input token amount (order amount)
* @param _owner - Address of the order's owner
* @param _data - Bytes of the order's data
* @param _auxData - Bytes of the auxiliar data used for the handlers to execute the order
* @return bought - amount of output token bought
* @return fee - amount of fee token
*/
function execute(
IERC20 _inputToken,
uint256 _inputAmount,
address payable _owner,
bytes calldata _data,
bytes calldata _auxData
) external returns (uint256 bought, uint256 fee);
}
abstract contract PineCore {
using SafeMath for uint256;
using Fabric for bytes32;
address public constant ETH_ADDRESS =
address(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
mapping(uint256 => bool) private transactionExecuted;
// ETH orders
mapping(bytes32 => Order) public orders;
struct Order {
address owner;
uint256 amount;
address module;
address inputToken;
address witness;
bytes data;
bytes32 secret;
uint256 expiration;
}
// Events
event OrderCreated(
bytes32 indexed key,
address indexed caller,
uint256 amount,
address module,
address inputToken,
address indexed owner,
address witness,
bytes data,
bytes32 secret,
uint256 _expiration,
uint256 timestamp
);
event OrderExecuted(
bytes32 indexed _key,
address _inputToken,
address _owner,
address _witness,
bytes _data,
bytes _auxData,
uint256 _amount,
uint256 _bought,
uint256 _fee,
uint256 timestamp
);
event OrderCancelled(
bytes32 indexed _key,
uint256 _amount,
uint256 timestamp
);
event OrderExecuteFailed(bytes32 indexed _key, uint256 timestamp);
modifier notInSameBlock() {
require(!transactionExecuted[block.number], "same block!");
transactionExecuted[block.number] = true;
_;
}
/**
* @dev Prevent users to send Ether directly to this contract
*/
receive() external payable {
require(
msg.sender != tx.origin,
"PineCore#receive: NO_SEND_ETH_PLEASE"
);
}
/**
* @notice Create an ETH to token order
* @param _data - Bytes of an ETH to token order. See `encodeEthOrder` for more info
*/
function depositEth(
address _module,
address _inputToken,
address payable _owner,
address _witness,
bytes calldata _data,
bytes32 _secret,
uint256 _expiration
) external payable notInSameBlock {
require(msg.value > 0, "PineCore#depositEth: VALUE_IS_0");
require(
_inputToken == ETH_ADDRESS,
"PineCore#depositEth: WRONG_INPUT_TOKEN"
);
bytes32 key = keyOf(
IModule(uint160(_module)),
IERC20(_inputToken),
_owner,
_witness,
_data
);
orders[key] = Order(
_owner,
msg.value,
_module,
_inputToken,
_witness,
_data,
_secret,
_expiration
);
emit OrderCreated(
key,
msg.sender,
msg.value,
_module,
_inputToken,
_owner,
_witness,
_data,
_secret,
_expiration,
block.timestamp
);
}
function depositToken(
uint256 _amount,
address _module,
address _inputToken,
address payable _owner,
address _witness,
bytes calldata _data,
bytes32 _secret,
uint256 _expiration
) external notInSameBlock {
require(
_inputToken != ETH_ADDRESS,
"PineCore#depositToken: ONLY_ERC20"
);
bytes32 key = keyOf(
IModule(uint160(_module)),
IERC20(_inputToken),
_owner,
_witness,
_data
);
IERC20(_inputToken).transferFrom(
msg.sender,
vaultOfOrder(
IModule(uint160(_module)),
IERC20(_inputToken),
_owner,
_witness,
_data
),
_amount
);
orders[key] = Order(
_owner,
_amount,
_module,
_inputToken,
_witness,
_data,
_secret,
_expiration
);
emit OrderCreated(
key,
msg.sender,
_amount,
_module,
_inputToken,
_owner,
_witness,
_data,
_secret,
_expiration,
block.timestamp
);
}
/**
* @notice Cancel order
* @dev The params should be the same used for the order creation
* @param _module - Address of the module to use for the order execution
* @param _inputToken - Address of the input token
* @param _owner - Address of the order's owner
* @param _witness - Address of the witness
* @param _data - Bytes of the order's data
*/
function cancelOrder(
IModule _module,
IERC20 _inputToken,
address payable _owner,
address _witness,
bytes calldata _data
) external notInSameBlock {
require(msg.sender == _owner, "PineCore#cancelOrder: INVALID_OWNER");
bytes32 key = keyOf(_module, _inputToken, _owner, _witness, _data);
uint256 amount = _pullOrder(_inputToken, key, msg.sender);
emit OrderCancelled(key, amount, block.timestamp);
}
/**
* @notice Get the calldata needed to create a token to token/ETH order
* @dev Returns the input data that the user needs to use to create the order
* The _secret is used to prevent a front-running at the order execution
* The _amount is used as the param `_value` for the ERC20 `transfer` function
* @param _module - Address of the module to use for the order execution
* @param _inputToken - Address of the input token
* @param _owner - Address of the order's owner
* @param _witness - Address of the witness
* @param _data - Bytes of the order's data
* @param _secret - Private key of the _witness
* @param _amount - uint256 of the order amount
* @return bytes - input data to send the transaction
*/
function encodeTokenOrder(
IModule _module,
IERC20 _inputToken,
address payable _owner,
address _witness,
bytes calldata _data,
bytes32 _secret,
uint256 _amount
) external view returns (bytes memory) {
return
abi.encodeWithSelector(
_inputToken.transfer.selector,
vaultOfOrder(_module, _inputToken, _owner, _witness, _data),
_amount,
abi.encode(
_module,
_inputToken,
_owner,
_witness,
_data,
_secret
)
);
}
/**
* @notice Get the calldata needed to create a ETH to token order
* @dev Returns the input data that the user needs to use to create the order
* The _secret is used to prevent a front-running at the order execution
* @param _module - Address of the module to use for the order execution
* @param _inputToken - Address of the input token
* @param _owner - Address of the order's owner
* @param _witness - Address of the witness
* @param _data - Bytes of the order's data
* @param _secret - Private key of the _witness
* @return bytes - input data to send the transaction
*/
function encodeEthOrder(
address _module,
address _inputToken,
address payable _owner,
address _witness,
bytes calldata _data,
bytes32 _secret
) external pure returns (bytes memory) {
return
abi.encode(_module, _inputToken, _owner, _witness, _data, _secret);
}
/**
* @notice Get order's properties
* @param _data - Bytes of the order
* @return module - Address of the module to use for the order execution
* @return inputToken - Address of the input token
* @return owner - Address of the order's owner
* @return witness - Address of the witness
* @return data - Bytes of the order's data
* @return secret - Private key of the _witness
*/
function decodeOrder(bytes memory _data)
public
pure
returns (
address module,
address inputToken,
address payable owner,
address witness,
bytes memory data,
bytes32 secret
)
{
(module, inputToken, owner, witness, data, secret) = abi.decode(
_data,
(address, address, address, address, bytes, bytes32)
);
}
/**
* @notice Get the vault's address of a token to token/ETH order
* @param _module - Address of the module to use for the order execution
* @param _inputToken - Address of the input token
* @param _owner - Address of the order's owner
* @param _witness - Address of the witness
* @param _data - Bytes of the order's data
* @return address - The address of the vault
*/
function vaultOfOrder(
IModule _module,
IERC20 _inputToken,
address payable _owner,
address _witness,
bytes memory _data
) public view returns (address) {
return keyOf(_module, _inputToken, _owner, _witness, _data).getVault();
}
/**
* @notice Executes an order
* @dev The sender should use the _secret to sign its own address
* to prevent front-runnings
* @param _module - Address of the module to use for the order execution
* @param _inputToken - Address of the input token
* @param _owner - Address of the order's owner
* @param _data - Bytes of the order's data
* @param _signature - Signature to calculate the witness
* @param _auxData - Bytes of the auxiliar data used for the handlers to execute the order
*/
function _executeOrder(
IModule _module,
IERC20 _inputToken,
address payable _owner,
bytes calldata _data,
bytes calldata _signature,
bytes calldata _auxData
) internal virtual {
// Calculate witness using signature
address witness = ECDSA.recover(
keccak256(abi.encodePacked(msg.sender)),
_signature
);
bytes32 key = keyOf(_module, _inputToken, _owner, witness, _data);
if (isExpired(orders[key].expiration))
revert("PineCore#executeOrder: ORDER_EXPIRED");
// Pull amount
uint256 amount = _pullOrder(_inputToken, key, address(_module));
require(amount > 0, "PineCore#executeOrder: INVALID_ORDER");
(uint256 bought, uint256 fee) = _module.execute(
_inputToken,
amount,
_owner,
_data,
_auxData
);
emit OrderExecuted(
key,
address(_inputToken),
_owner,
witness,
_data,
_auxData,
amount,
bought,
fee,
block.timestamp
);
}
/**
* @notice Check whether an order exists or not
* @dev Check the balance of the order
* @param _module - Address of the module to use for the order execution
* @param _inputToken - Address of the input token
* @param _owner - Address of the order's owner
* @param _witness - Address of the witness
* @param _data - Bytes of the order's data
* @return bool - whether the order exists or not
*/
function existOrder(
IModule _module,
IERC20 _inputToken,
address payable _owner,
address _witness,
bytes calldata _data
) external view returns (bool) {
bytes32 key = keyOf(_module, _inputToken, _owner, _witness, _data);
if (address(_inputToken) == ETH_ADDRESS) {
return orders[key].amount != 0;
} else {
return _inputToken.balanceOf(key.getVault()) != 0;
}
}
/**
* @notice Transfer the order amount to a recipient.
* @dev For an ETH order, the ETH will be transferred from this contract
* For a token order, its vault will be executed transferring the amount of tokens to
* the recipient
* @param _inputToken - Address of the input token
* @param _key - Order's key
* @param _to - Address of the recipient
* @return amount - amount transferred
*/
function _pullOrder(
IERC20 _inputToken,
bytes32 _key,
address payable _to
) private returns (uint256 amount) {
if (address(_inputToken) == ETH_ADDRESS) {
amount = orders[_key].amount;
orders[_key].amount = 0;
(bool success, ) = _to.call{value: amount}("");
require(success, "PineCore#_pullOrder: PULL_ETHER_FAILED");
} else {
amount = _key.executeVault(_inputToken, _to);
orders[_key].amount = 0;
}
}
function isExpired(uint256 expiration) internal view returns (bool) {
return expiration != 0 && expiration < block.timestamp;
}
/**
* @notice Get the order's key
* @param _module - Address of the module to use for the order execution
* @param _inputToken - Address of the input token
* @param _owner - Address of the order's owner
* @param _witness - Address of the witness
* @param _data - Bytes of the order's data
* @return bytes32 - order's key
*/
function keyOf(
IModule _module,
IERC20 _inputToken,
address payable _owner,
address _witness,
bytes memory _data
) public pure returns (bytes32) {
return
keccak256(
abi.encode(_module, _inputToken, _owner, _witness, _data)
);
}
}
//
// Original work by Pine.Finance
// - https://github.com/pine-finance
//
// Authors:
// - Ignacio Mazzara <@nachomazzara>
// - Agustin Aguilar <@agusx1211>
// solhint-disable-next-line
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract GelatoPineCore is PineCore, Ownable {
// solhint-disable-next-line var-name-mixedcase
address public GELATO;
constructor(address _gelato) public {
GELATO = _gelato;
}
modifier onlyGelato() {
require(GELATO == msg.sender, "GelatoPineCore: only GELATO");
_;
}
function executeOrder(
IModule _module,
IERC20 _inputToken,
address payable _owner,
bytes calldata _data,
bytes calldata _signature,
bytes calldata _auxData
) public onlyGelato {
_executeOrder(
_module,
_inputToken,
_owner,
_data,
_signature,
_auxData
);
}
function multicall(bytes[] calldata data) public payable {
for (uint256 i = 0; i < data.length; i++) {
require(
keccak256(data[i][:4]) == keccak256(hex"e55060c5"),
"function not allowed"
);
(bool success, bytes memory result) = address(this).delegatecall(
data[i]
);
if (!success) {
(
IModule _module,
IERC20 _inputToken,
address payable _owner,
bytes memory _data,
bytes memory _signature,
) = abi.decode(
data[i][4:],
(IModule, IERC20, address, bytes, bytes, bytes)
);
// Calculate witness using signature
address witness = ECDSA.recover(
keccak256(abi.encodePacked(msg.sender)),
_signature
);
bytes32 key = keyOf(
_module,
_inputToken,
_owner,
witness,
_data
);
emit OrderExecuteFailed(key, block.timestamp);
}
}
}
function setGelato(address _gelato) external onlyOwner {
GELATO = _gelato;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": [
"@nomad-xyz/=lib/ExcessivelySafeCall/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@uniswap/=lib/solidity-lib/",
"ExcessivelySafeCall/=lib/ExcessivelySafeCall/src/",
"base64-sol/=lib/base64/",
"base64/=lib/base64/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
"solidity-lib/=lib/solidity-lib/contracts/"
],
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_gelato","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"module","type":"address"},{"indexed":false,"internalType":"address","name":"inputToken","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"witness","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes32","name":"secret","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_expiration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OrderCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OrderExecuteFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_inputToken","type":"address"},{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"address","name":"_witness","type":"address"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_auxData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_bought","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OrderExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GELATO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"decodeOrder","outputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"address","name":"witness","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes32","name":"secret","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"},{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes32","name":"_secret","type":"bytes32"},{"internalType":"uint256","name":"_expiration","type":"uint256"}],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_module","type":"address"},{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes32","name":"_secret","type":"bytes32"},{"internalType":"uint256","name":"_expiration","type":"uint256"}],"name":"depositToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"},{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes32","name":"_secret","type":"bytes32"}],"name":"encodeEthOrder","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes32","name":"_secret","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"encodeTokenOrder","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"bytes","name":"_auxData","type":"bytes"}],"name":"executeOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"existOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"keyOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"orders","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"module","type":"address"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"address","name":"witness","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes32","name":"secret","type":"bytes32"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gelato","type":"address"}],"name":"setGelato","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"vaultOfOrder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002ade38038062002ade8339810160408190526200003491620000b8565b600062000040620000b4565b600280546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600380546001600160a01b0319166001600160a01b0392909216919091179055620000e8565b3390565b600060208284031215620000ca578081fd5b81516001600160a01b0381168114620000e1578182fd5b9392505050565b6129e680620000f86000396000f3fe60806040526004361061010c5760003560e01c8063a734f06e11610095578063d7665a4811610064578063d7665a48146102fc578063e55060c51461031c578063e8ecb1301461033c578063eff557a714610369578063f2fde38b1461037e5761013c565b8063a734f06e14610282578063ac9650d814610297578063b4c07547146102aa578063cdc2b1c5146102dc5761013c565b806345d0508b116100dc57806345d0508b146101f1578063715018a614610211578063775d9655146102265780638da5cb5b146102395780639c3f1e901461024e5761013c565b806286f48f146101415780630d7cf2ad146101775780631b2c4b78146101a45780632bd470d3146101c45761013c565b3661013c573332141561013a5760405162461bcd60e51b815260040161013190612803565b60405180910390fd5b005b600080fd5b34801561014d57600080fd5b5061016161015c366004611d74565b61039e565b60405161016e9190612168565b60405180910390f35b34801561018357600080fd5b50610197610192366004611d74565b6103bf565b60405161016e9190612367565b3480156101b057600080fd5b5061013a6101bf366004611f9a565b6103fb565b3480156101d057600080fd5b506101e46101df366004611a6b565b610732565b60405161016e919061238e565b3480156101fd57600080fd5b506101e461020c366004611d04565b61076d565b34801561021d57600080fd5b5061013a610837565b61013a610234366004611aff565b6108c0565b34801561024557600080fd5b50610161610b4d565b34801561025a57600080fd5b5061026e610269366004611c27565b610b5c565b60405161016e9897969594939291906122d0565b34801561028e57600080fd5b50610161610c38565b61013a6102a5366004611b99565b610c50565b3480156102b657600080fd5b506102ca6102c5366004611c3f565b610e36565b60405161016e96959493929190612268565b3480156102e857600080fd5b5061013a6102f7366004611984565b610e68565b34801561030857600080fd5b5061013a610317366004611c79565b610ec9565b34801561032857600080fd5b5061013a610337366004611df9565b610fd5565b34801561034857600080fd5b5061035c610357366004611c79565b61101b565b60405161016e919061235c565b34801561037557600080fd5b50610161611136565b34801561038a57600080fd5b5061013a610399366004611984565b611145565b60006103b56103b087878787876103bf565b611206565b9695505050505050565b600085858585856040516020016103da9594939291906123f6565b60405160208183030381529060405280519060200120905095945050505050565b4360009081526020819052604090205460ff161561042b5760405162461bcd60e51b815260040161013190612474565b436000908152602081905260409020805460ff191660011790556001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156104825760405162461bcd60e51b815260040161013190612617565b60006104c78989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b9050876001600160a01b03166323b872dd3361051c8c8c8c8c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061039e92505050565b8d6040518463ffffffff1660e01b815260040161053b9392919061217c565b602060405180830381600087803b15801561055557600080fd5b505af1158015610569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058d9190611c07565b50604051806101000160405280886001600160a01b031681526020018b81526020018a6001600160a01b03168152602001896001600160a01b03168152602001876001600160a01b0316815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018790526040928301869052848252600180825291839020845181546001600160a01b03199081166001600160a01b03928316178355868401519483019490945593850151600282018054851691861691909117905560608501516003820180548516918616919091179055608085015160048201805490941694169390931790915560a083015180516106b2926005850192019061184c565b5060c0820151816006015560e08201518160070155905050866001600160a01b0316336001600160a01b0316827f4b1455bfd49e4b8d64d9e14875e981bbeab48014fd107d3a9522a42353a71dd28d8d8d8c8c8c8c8c4260405161071e99989796959493929190612875565b60405180910390a450505050505050505050565b6060878787878787876040516020016107519796959493929190612217565b6040516020818303038152906040529050979650505050505050565b606063a9059cbb60e01b6107ba8a8a8a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061039e92505050565b838b8b8b8b8b8b8b6040516020016107d89796959493929190612217565b60408051601f19818403018152908290526107f793929160240161232c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905098975050505050505050565b61083f611266565b6001600160a01b0316610850610b4d565b6001600160a01b0316146108765760405162461bcd60e51b8152600401610131906127ce565b6002546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b4360009081526020819052604090205460ff16156108f05760405162461bcd60e51b815260040161013190612474565b436000908152602081905260409020805460ff19166001179055346109275760405162461bcd60e51b815260040161013190612797565b6001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146109635760405162461bcd60e51b815260040161013190612658565b60006109a88989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b9050604051806101000160405280886001600160a01b031681526020013481526020018a6001600160a01b03168152602001896001600160a01b03168152602001876001600160a01b0316815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018790526040928301869052848252600180825291839020845181546001600160a01b03199081166001600160a01b03928316178355868401519483019490945593850151600282018054851691861691909117905560608501516003820180548516918616919091179055608085015160048201805490941694169390931790915560a08301518051610ace926005850192019061184c565b5060c0820151816006015560e08201518160070155905050866001600160a01b0316336001600160a01b0316827f4b1455bfd49e4b8d64d9e14875e981bbeab48014fd107d3a9522a42353a71dd2348d8d8c8c8c8c8c42604051610b3a99989796959493929190612875565b60405180910390a4505050505050505050565b6002546001600160a01b031690565b600160208181526000928352604092839020805481840154600280840154600385015460048601546005870180548b516101009b8216159b909b02600019011694909404601f810189900489028a018901909a528989526001600160a01b0395861699949892861697918616969516949391929190830182828015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050908060060154908060070154905088565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60005b81811015610e31577f19356d99304c4126a2b4f93c2584758e1f509d843a3df2bf597db11d0d4c119c838383818110610c8857fe5b9050602002810190610c9a91906128e1565b610ca991600491600091612969565b604051610cb7929190612107565b604051809103902014610cdc5760405162461bcd60e51b81526004016101319061269e565b60008030858585818110610cec57fe5b9050602002810190610cfe91906128e1565b604051610d0c929190612107565b600060405180830381855af49150503d8060008114610d47576040519150601f19603f3d011682016040523d82523d6000602084013e610d4c565b606091505b509150915081610e27576000806000806000898989818110610d6a57fe5b9050602002810190610d7c91906128e1565b610d8a916004908290612969565b810190610d979190611ec8565b50945094509450945094506000610dd433604051602001610db891906120bb565b604051602081830303815290604052805190602001208361126a565b90506000610de587878785886103bf565b9050807f52ab056cc95814a7fe0e3a432201981af03e59d5d94218fde682176cdf37e44e42604051610e179190612367565b60405180910390a2505050505050505b5050600101610c53565b505050565b6000806000806060600086806020019051810190610e5491906119a0565b949c939b5091995097509550909350915050565b610e70611266565b6001600160a01b0316610e81610b4d565b6001600160a01b031614610ea75760405162461bcd60e51b8152600401610131906127ce565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b4360009081526020819052604090205460ff1615610ef95760405162461bcd60e51b815260040161013190612474565b436000908152602081905260409020805460ff19166001179055336001600160a01b03851614610f3b5760405162461bcd60e51b815260040161013190612712565b6000610f808787878787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b90506000610f8f87833361138e565b9050817fe4af7100a356cc424e6939f8c60f26ba0bbcf7908692baacacf6177d847045008242604051610fc39291906128d3565b60405180910390a25050505050505050565b6003546001600160a01b03163314610fff5760405162461bcd60e51b815260040161013190612514565b61101089898989898989898961147b565b505050505050505050565b6000806110618888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b90506001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110a45760009081526001602081905260409091200154151590506103b5565b866001600160a01b03166370a082316110bc83611206565b6040518263ffffffff1660e01b81526004016110d89190612168565b60206040518083038186803b1580156110f057600080fd5b505afa158015611104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111289190611f82565b151598975050505050505050565b6003546001600160a01b031681565b61114d611266565b6001600160a01b031661115e610b4d565b6001600160a01b0316146111845760405162461bcd60e51b8152600401610131906127ce565b6001600160a01b0381166111aa5760405162461bcd60e51b81526004016101319061254b565b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b604051600090611248906001600160f81b031990309085907ffa3da1081bc86587310fce8f3a5309785fc567b9b20875900cb289302d6bfa97906020016120d3565b60408051601f19818403018152919052805160209091012092915050565b3390565b6000815160411461128d5760405162461bcd60e51b8152600401610131906124dd565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156112df5760405162461bcd60e51b8152600401610131906125d5565b8060ff16601b141580156112f757508060ff16601c14155b156113145760405162461bcd60e51b815260040161013190612755565b6000600187838686604051600081526020016040526040516113399493929190612370565b6020604051602081039080840390855afa15801561135b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166103b55760405162461bcd60e51b81526004016101319061243d565b60006001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156114545750600082815260016020819052604080832090910180549083905590519091906001600160a01b0384169083906113eb90612165565b60006040518083038185875af1925050503d8060008114611428576040519150601f19603f3d011682016040523d82523d6000602084013e61142d565b606091505b505090508061144e5760405162461bcd60e51b8152600401610131906126cc565b50611474565b61145f838584611680565b60008481526001602081905260408220015590505b9392505050565b60006114e33360405160200161149191906120bb565b6040516020818303038152906040528051906020012086868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061126a92505050565b9050600061152a8b8b8b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b60008181526001602052604090206007015490915061154890611836565b156115655760405162461bcd60e51b815260040161013190612499565b60006115728b838e61138e565b9050600081116115945760405162461bcd60e51b815260040161013190612591565b6000808d6001600160a01b031663e7ed35e38e858f8f8f8d8d6040518863ffffffff1660e01b81526004016115cf97969594939291906123a1565b6040805180830381600087803b1580156115e857600080fd5b505af11580156115fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116209190612042565b91509150837fa9becbc0457c27d1bf54385cc95a65eb6e9ccb53271b57a875298c735658b09f8e8e888f8f8d8d8b8b8b426040516116689b9a999897969594939291906121a0565b60405180910390a25050505050505050505050505050565b60008060006040518060400160405280601c81526020017f6012600081600a8239f360008060448082803781806038355af132ff000000008152509050858151602083016000f56040516370a0823160e01b81529092506001600160a01b038616906370a08231906116f6908590600401612168565b60206040518083038186803b15801561170e57600080fd5b505afa158015611722573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117469190611f82565b92506000826001600160a01b031663a9059cbb60e01b868660405160240161176f9291906122b7565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352516117af928a9101612133565b60408051601f19818403018152908290526117c991612117565b6000604051808303816000865af19150503d8060008114611806576040519150601f19603f3d011682016040523d82523d6000602084013e61180b565b606091505b505090508061182c5760405162461bcd60e51b815260040161013190612847565b5050509392505050565b6000811580159061184657504282105b92915050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261188257600085556118c8565b82601f1061189b57805160ff19168380011785556118c8565b828001600101855582156118c8579182015b828111156118c85782518255916020019190600101906118ad565b506118d49291506118d8565b5090565b5b808211156118d457600081556001016118d9565b60008083601f8401126118fe578182fd5b5081356001600160401b03811115611914578182fd5b60208301915083602082850101111561192c57600080fd5b9250929050565b600082601f830112611943578081fd5b813561195661195182612948565b612925565b81815284602083860101111561196a578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611995578081fd5b8135611474816129c1565b60008060008060008060c087890312156119b8578182fd5b86516119c3816129c1565b60208801519096506119d4816129c1565b60408801519095506119e5816129c1565b60608801519094506119f6816129c1565b60808801519093506001600160401b03811115611a11578283fd5b8701601f81018913611a21578283fd5b8051611a2f61195182612948565b8181528a6020838501011115611a43578485fd5b611a54826020830160208601612991565b80945050505060a087015190509295509295509295565b600080600080600080600060c0888a031215611a85578081fd5b8735611a90816129c1565b96506020880135611aa0816129c1565b95506040880135611ab0816129c1565b94506060880135611ac0816129c1565b935060808801356001600160401b03811115611ada578182fd5b611ae68a828b016118ed565b989b979a5095989497959660a090950135949350505050565b60008060008060008060008060e0898b031215611b1a578081fd5b8835611b25816129c1565b97506020890135611b35816129c1565b96506040890135611b45816129c1565b95506060890135611b55816129c1565b945060808901356001600160401b03811115611b6f578182fd5b611b7b8b828c016118ed565b999c989b5096999598969760a08701359660c0013595509350505050565b60008060208385031215611bab578182fd5b82356001600160401b0380821115611bc1578384fd5b818501915085601f830112611bd4578384fd5b813581811115611be2578485fd5b8660208083028501011115611bf5578485fd5b60209290920196919550909350505050565b600060208284031215611c18578081fd5b81518015158114611474578182fd5b600060208284031215611c38578081fd5b5035919050565b600060208284031215611c50578081fd5b81356001600160401b03811115611c65578182fd5b611c7184828501611933565b949350505050565b60008060008060008060a08789031215611c91578384fd5b8635611c9c816129c1565b95506020870135611cac816129c1565b94506040870135611cbc816129c1565b93506060870135611ccc816129c1565b925060808701356001600160401b03811115611ce6578283fd5b611cf289828a016118ed565b979a9699509497509295939492505050565b60008060008060008060008060e0898b031215611d1f578182fd5b8835611d2a816129c1565b97506020890135611d3a816129c1565b96506040890135611d4a816129c1565b95506060890135611d5a816129c1565b945060808901356001600160401b03811115611b6f578283fd5b600080600080600060a08688031215611d8b578283fd5b8535611d96816129c1565b94506020860135611da6816129c1565b93506040860135611db6816129c1565b92506060860135611dc6816129c1565b915060808601356001600160401b03811115611de0578182fd5b611dec88828901611933565b9150509295509295909350565b600080600080600080600080600060c08a8c031215611e16578283fd5b8935611e21816129c1565b985060208a0135611e31816129c1565b975060408a0135611e41816129c1565b965060608a01356001600160401b0380821115611e5c578485fd5b611e688d838e016118ed565b909850965060808c0135915080821115611e80578485fd5b611e8c8d838e016118ed565b909650945060a08c0135915080821115611ea4578283fd5b50611eb18c828d016118ed565b915080935050809150509295985092959850929598565b60008060008060008060c08789031215611ee0578384fd5b8635611eeb816129c1565b95506020870135611efb816129c1565b94506040870135611f0b816129c1565b935060608701356001600160401b0380821115611f26578384fd5b611f328a838b01611933565b94506080890135915080821115611f47578384fd5b611f538a838b01611933565b935060a0890135915080821115611f68578283fd5b50611f7589828a01611933565b9150509295509295509295565b600060208284031215611f93578081fd5b5051919050565b60008060008060008060008060006101008a8c031215611fb8578283fd5b8935985060208a0135611fca816129c1565b975060408a0135611fda816129c1565b965060608a0135611fea816129c1565b955060808a0135611ffa816129c1565b945060a08a01356001600160401b03811115612014578384fd5b6120208c828d016118ed565b9a9d999c50979a96999598959660c08101359660e09091013595509350505050565b60008060408385031215612054578182fd5b505080516020909101519092909150565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526120a7816020860160208601612991565b601f01601f19169290920160200192915050565b60609190911b6001600160601b031916815260140190565b6001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b6000828483379101908152919050565b60008251612129818460208701612991565b9190910192915050565b60008351612145818460208801612991565b60609390931b6001600160601b0319169190920190815260140192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038c811682528b811660208301528a166040820152610120606082018190526000906121d68382018b8d612065565b905082810360808401526121eb81898b612065565b9150508560a08301528460c08301528360e0830152826101008301529c9b505050505050505050505050565b6001600160a01b038881168252878116602083015286811660408301528516606082015260c0608082018190526000906122549083018587612065565b90508260a083015298975050505050505050565b6001600160a01b038781168252868116602083015285811660408301528416606082015260c0608082018190526000906122a49083018561208f565b90508260a0830152979650505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03898116825260208201899052878116604083015286811660608301528516608082015261010060a082018190526000906123148382018761208f565b60c0840195909552505060e001529695505050505050565b600060018060a01b038516825283602083015260606040830152612353606083018461208f565b95945050505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252611474602083018461208f565b6001600160a01b038881168252602082018890528616604082015260a0606082018190526000906123d59083018688612065565b82810360808401526123e8818587612065565b9a9950505050505050505050565b6001600160a01b038681168252858116602083015284811660408301528316606082015260a0608082018190526000906124329083018461208f565b979650505050505050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b6020808252600b908201526a73616d6520626c6f636b2160a81b604082015260600190565b60208082526024908201527f50696e65436f726523657865637574654f726465723a204f524445525f4558506040820152631254915160e21b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601b908201527f47656c61746f50696e65436f72653a206f6e6c792047454c41544f0000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f50696e65436f726523657865637574654f726465723a20494e56414c49445f4f604082015263292222a960e11b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526021908201527f50696e65436f7265236465706f736974546f6b656e3a204f4e4c595f455243326040820152600360fc1b606082015260800190565b60208082526026908201527f50696e65436f7265236465706f7369744574683a2057524f4e475f494e5055546040820152652faa27a5a2a760d11b606082015260800190565b602080825260149082015273199d5b98dd1a5bdb881b9bdd08185b1b1bddd95960621b604082015260600190565b60208082526026908201527f50696e65436f7265235f70756c6c4f726465723a2050554c4c5f45544845525f60408201526511905253115160d21b606082015260800190565b60208082526023908201527f50696e65436f72652363616e63656c4f726465723a20494e56414c49445f4f576040820152622722a960e91b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252601f908201527f50696e65436f7265236465706f7369744574683a2056414c55455f49535f3000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f50696e65436f726523726563656976653a204e4f5f53454e445f4554485f504c6040820152634541534560e01b606082015260800190565b6020808252601490820152734572726f722070756c6c696e6720746f6b656e7360601b604082015260600190565b8981526001600160a01b038981166020830152888116604083015287166060820152610100608082018190526000906128b1838201888a612065565b60a0840196909652505060c081019290925260e0909101529695505050505050565b918252602082015260400190565b6000808335601e198436030181126128f7578283fd5b8301803591506001600160401b03821115612910578283fd5b60200191503681900382131561192c57600080fd5b6040518181016001600160401b038111828210171561294057fe5b604052919050565b60006001600160401b0382111561295b57fe5b50601f01601f191660200190565b60008085851115612978578182fd5b83861115612984578182fd5b5050820193919092039150565b60005b838110156129ac578181015183820152602001612994565b838111156129bb576000848401525b50505050565b6001600160a01b03811681146129d657600080fd5b5056fea164736f6c6343000706000a0000000000000000000000007f8a7068c0100881b8514ed798582436fe6aab65
Deployed Bytecode
0x60806040526004361061010c5760003560e01c8063a734f06e11610095578063d7665a4811610064578063d7665a48146102fc578063e55060c51461031c578063e8ecb1301461033c578063eff557a714610369578063f2fde38b1461037e5761013c565b8063a734f06e14610282578063ac9650d814610297578063b4c07547146102aa578063cdc2b1c5146102dc5761013c565b806345d0508b116100dc57806345d0508b146101f1578063715018a614610211578063775d9655146102265780638da5cb5b146102395780639c3f1e901461024e5761013c565b806286f48f146101415780630d7cf2ad146101775780631b2c4b78146101a45780632bd470d3146101c45761013c565b3661013c573332141561013a5760405162461bcd60e51b815260040161013190612803565b60405180910390fd5b005b600080fd5b34801561014d57600080fd5b5061016161015c366004611d74565b61039e565b60405161016e9190612168565b60405180910390f35b34801561018357600080fd5b50610197610192366004611d74565b6103bf565b60405161016e9190612367565b3480156101b057600080fd5b5061013a6101bf366004611f9a565b6103fb565b3480156101d057600080fd5b506101e46101df366004611a6b565b610732565b60405161016e919061238e565b3480156101fd57600080fd5b506101e461020c366004611d04565b61076d565b34801561021d57600080fd5b5061013a610837565b61013a610234366004611aff565b6108c0565b34801561024557600080fd5b50610161610b4d565b34801561025a57600080fd5b5061026e610269366004611c27565b610b5c565b60405161016e9897969594939291906122d0565b34801561028e57600080fd5b50610161610c38565b61013a6102a5366004611b99565b610c50565b3480156102b657600080fd5b506102ca6102c5366004611c3f565b610e36565b60405161016e96959493929190612268565b3480156102e857600080fd5b5061013a6102f7366004611984565b610e68565b34801561030857600080fd5b5061013a610317366004611c79565b610ec9565b34801561032857600080fd5b5061013a610337366004611df9565b610fd5565b34801561034857600080fd5b5061035c610357366004611c79565b61101b565b60405161016e919061235c565b34801561037557600080fd5b50610161611136565b34801561038a57600080fd5b5061013a610399366004611984565b611145565b60006103b56103b087878787876103bf565b611206565b9695505050505050565b600085858585856040516020016103da9594939291906123f6565b60405160208183030381529060405280519060200120905095945050505050565b4360009081526020819052604090205460ff161561042b5760405162461bcd60e51b815260040161013190612474565b436000908152602081905260409020805460ff191660011790556001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156104825760405162461bcd60e51b815260040161013190612617565b60006104c78989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b9050876001600160a01b03166323b872dd3361051c8c8c8c8c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061039e92505050565b8d6040518463ffffffff1660e01b815260040161053b9392919061217c565b602060405180830381600087803b15801561055557600080fd5b505af1158015610569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058d9190611c07565b50604051806101000160405280886001600160a01b031681526020018b81526020018a6001600160a01b03168152602001896001600160a01b03168152602001876001600160a01b0316815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018790526040928301869052848252600180825291839020845181546001600160a01b03199081166001600160a01b03928316178355868401519483019490945593850151600282018054851691861691909117905560608501516003820180548516918616919091179055608085015160048201805490941694169390931790915560a083015180516106b2926005850192019061184c565b5060c0820151816006015560e08201518160070155905050866001600160a01b0316336001600160a01b0316827f4b1455bfd49e4b8d64d9e14875e981bbeab48014fd107d3a9522a42353a71dd28d8d8d8c8c8c8c8c4260405161071e99989796959493929190612875565b60405180910390a450505050505050505050565b6060878787878787876040516020016107519796959493929190612217565b6040516020818303038152906040529050979650505050505050565b606063a9059cbb60e01b6107ba8a8a8a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061039e92505050565b838b8b8b8b8b8b8b6040516020016107d89796959493929190612217565b60408051601f19818403018152908290526107f793929160240161232c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905098975050505050505050565b61083f611266565b6001600160a01b0316610850610b4d565b6001600160a01b0316146108765760405162461bcd60e51b8152600401610131906127ce565b6002546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b4360009081526020819052604090205460ff16156108f05760405162461bcd60e51b815260040161013190612474565b436000908152602081905260409020805460ff19166001179055346109275760405162461bcd60e51b815260040161013190612797565b6001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146109635760405162461bcd60e51b815260040161013190612658565b60006109a88989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b9050604051806101000160405280886001600160a01b031681526020013481526020018a6001600160a01b03168152602001896001600160a01b03168152602001876001600160a01b0316815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018790526040928301869052848252600180825291839020845181546001600160a01b03199081166001600160a01b03928316178355868401519483019490945593850151600282018054851691861691909117905560608501516003820180548516918616919091179055608085015160048201805490941694169390931790915560a08301518051610ace926005850192019061184c565b5060c0820151816006015560e08201518160070155905050866001600160a01b0316336001600160a01b0316827f4b1455bfd49e4b8d64d9e14875e981bbeab48014fd107d3a9522a42353a71dd2348d8d8c8c8c8c8c42604051610b3a99989796959493929190612875565b60405180910390a4505050505050505050565b6002546001600160a01b031690565b600160208181526000928352604092839020805481840154600280840154600385015460048601546005870180548b516101009b8216159b909b02600019011694909404601f810189900489028a018901909a528989526001600160a01b0395861699949892861697918616969516949391929190830182828015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050908060060154908060070154905088565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60005b81811015610e31577f19356d99304c4126a2b4f93c2584758e1f509d843a3df2bf597db11d0d4c119c838383818110610c8857fe5b9050602002810190610c9a91906128e1565b610ca991600491600091612969565b604051610cb7929190612107565b604051809103902014610cdc5760405162461bcd60e51b81526004016101319061269e565b60008030858585818110610cec57fe5b9050602002810190610cfe91906128e1565b604051610d0c929190612107565b600060405180830381855af49150503d8060008114610d47576040519150601f19603f3d011682016040523d82523d6000602084013e610d4c565b606091505b509150915081610e27576000806000806000898989818110610d6a57fe5b9050602002810190610d7c91906128e1565b610d8a916004908290612969565b810190610d979190611ec8565b50945094509450945094506000610dd433604051602001610db891906120bb565b604051602081830303815290604052805190602001208361126a565b90506000610de587878785886103bf565b9050807f52ab056cc95814a7fe0e3a432201981af03e59d5d94218fde682176cdf37e44e42604051610e179190612367565b60405180910390a2505050505050505b5050600101610c53565b505050565b6000806000806060600086806020019051810190610e5491906119a0565b949c939b5091995097509550909350915050565b610e70611266565b6001600160a01b0316610e81610b4d565b6001600160a01b031614610ea75760405162461bcd60e51b8152600401610131906127ce565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b4360009081526020819052604090205460ff1615610ef95760405162461bcd60e51b815260040161013190612474565b436000908152602081905260409020805460ff19166001179055336001600160a01b03851614610f3b5760405162461bcd60e51b815260040161013190612712565b6000610f808787878787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b90506000610f8f87833361138e565b9050817fe4af7100a356cc424e6939f8c60f26ba0bbcf7908692baacacf6177d847045008242604051610fc39291906128d3565b60405180910390a25050505050505050565b6003546001600160a01b03163314610fff5760405162461bcd60e51b815260040161013190612514565b61101089898989898989898961147b565b505050505050505050565b6000806110618888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b90506001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110a45760009081526001602081905260409091200154151590506103b5565b866001600160a01b03166370a082316110bc83611206565b6040518263ffffffff1660e01b81526004016110d89190612168565b60206040518083038186803b1580156110f057600080fd5b505afa158015611104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111289190611f82565b151598975050505050505050565b6003546001600160a01b031681565b61114d611266565b6001600160a01b031661115e610b4d565b6001600160a01b0316146111845760405162461bcd60e51b8152600401610131906127ce565b6001600160a01b0381166111aa5760405162461bcd60e51b81526004016101319061254b565b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b604051600090611248906001600160f81b031990309085907ffa3da1081bc86587310fce8f3a5309785fc567b9b20875900cb289302d6bfa97906020016120d3565b60408051601f19818403018152919052805160209091012092915050565b3390565b6000815160411461128d5760405162461bcd60e51b8152600401610131906124dd565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156112df5760405162461bcd60e51b8152600401610131906125d5565b8060ff16601b141580156112f757508060ff16601c14155b156113145760405162461bcd60e51b815260040161013190612755565b6000600187838686604051600081526020016040526040516113399493929190612370565b6020604051602081039080840390855afa15801561135b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166103b55760405162461bcd60e51b81526004016101319061243d565b60006001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156114545750600082815260016020819052604080832090910180549083905590519091906001600160a01b0384169083906113eb90612165565b60006040518083038185875af1925050503d8060008114611428576040519150601f19603f3d011682016040523d82523d6000602084013e61142d565b606091505b505090508061144e5760405162461bcd60e51b8152600401610131906126cc565b50611474565b61145f838584611680565b60008481526001602081905260408220015590505b9392505050565b60006114e33360405160200161149191906120bb565b6040516020818303038152906040528051906020012086868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061126a92505050565b9050600061152a8b8b8b858c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bf92505050565b60008181526001602052604090206007015490915061154890611836565b156115655760405162461bcd60e51b815260040161013190612499565b60006115728b838e61138e565b9050600081116115945760405162461bcd60e51b815260040161013190612591565b6000808d6001600160a01b031663e7ed35e38e858f8f8f8d8d6040518863ffffffff1660e01b81526004016115cf97969594939291906123a1565b6040805180830381600087803b1580156115e857600080fd5b505af11580156115fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116209190612042565b91509150837fa9becbc0457c27d1bf54385cc95a65eb6e9ccb53271b57a875298c735658b09f8e8e888f8f8d8d8b8b8b426040516116689b9a999897969594939291906121a0565b60405180910390a25050505050505050505050505050565b60008060006040518060400160405280601c81526020017f6012600081600a8239f360008060448082803781806038355af132ff000000008152509050858151602083016000f56040516370a0823160e01b81529092506001600160a01b038616906370a08231906116f6908590600401612168565b60206040518083038186803b15801561170e57600080fd5b505afa158015611722573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117469190611f82565b92506000826001600160a01b031663a9059cbb60e01b868660405160240161176f9291906122b7565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352516117af928a9101612133565b60408051601f19818403018152908290526117c991612117565b6000604051808303816000865af19150503d8060008114611806576040519150601f19603f3d011682016040523d82523d6000602084013e61180b565b606091505b505090508061182c5760405162461bcd60e51b815260040161013190612847565b5050509392505050565b6000811580159061184657504282105b92915050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261188257600085556118c8565b82601f1061189b57805160ff19168380011785556118c8565b828001600101855582156118c8579182015b828111156118c85782518255916020019190600101906118ad565b506118d49291506118d8565b5090565b5b808211156118d457600081556001016118d9565b60008083601f8401126118fe578182fd5b5081356001600160401b03811115611914578182fd5b60208301915083602082850101111561192c57600080fd5b9250929050565b600082601f830112611943578081fd5b813561195661195182612948565b612925565b81815284602083860101111561196a578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611995578081fd5b8135611474816129c1565b60008060008060008060c087890312156119b8578182fd5b86516119c3816129c1565b60208801519096506119d4816129c1565b60408801519095506119e5816129c1565b60608801519094506119f6816129c1565b60808801519093506001600160401b03811115611a11578283fd5b8701601f81018913611a21578283fd5b8051611a2f61195182612948565b8181528a6020838501011115611a43578485fd5b611a54826020830160208601612991565b80945050505060a087015190509295509295509295565b600080600080600080600060c0888a031215611a85578081fd5b8735611a90816129c1565b96506020880135611aa0816129c1565b95506040880135611ab0816129c1565b94506060880135611ac0816129c1565b935060808801356001600160401b03811115611ada578182fd5b611ae68a828b016118ed565b989b979a5095989497959660a090950135949350505050565b60008060008060008060008060e0898b031215611b1a578081fd5b8835611b25816129c1565b97506020890135611b35816129c1565b96506040890135611b45816129c1565b95506060890135611b55816129c1565b945060808901356001600160401b03811115611b6f578182fd5b611b7b8b828c016118ed565b999c989b5096999598969760a08701359660c0013595509350505050565b60008060208385031215611bab578182fd5b82356001600160401b0380821115611bc1578384fd5b818501915085601f830112611bd4578384fd5b813581811115611be2578485fd5b8660208083028501011115611bf5578485fd5b60209290920196919550909350505050565b600060208284031215611c18578081fd5b81518015158114611474578182fd5b600060208284031215611c38578081fd5b5035919050565b600060208284031215611c50578081fd5b81356001600160401b03811115611c65578182fd5b611c7184828501611933565b949350505050565b60008060008060008060a08789031215611c91578384fd5b8635611c9c816129c1565b95506020870135611cac816129c1565b94506040870135611cbc816129c1565b93506060870135611ccc816129c1565b925060808701356001600160401b03811115611ce6578283fd5b611cf289828a016118ed565b979a9699509497509295939492505050565b60008060008060008060008060e0898b031215611d1f578182fd5b8835611d2a816129c1565b97506020890135611d3a816129c1565b96506040890135611d4a816129c1565b95506060890135611d5a816129c1565b945060808901356001600160401b03811115611b6f578283fd5b600080600080600060a08688031215611d8b578283fd5b8535611d96816129c1565b94506020860135611da6816129c1565b93506040860135611db6816129c1565b92506060860135611dc6816129c1565b915060808601356001600160401b03811115611de0578182fd5b611dec88828901611933565b9150509295509295909350565b600080600080600080600080600060c08a8c031215611e16578283fd5b8935611e21816129c1565b985060208a0135611e31816129c1565b975060408a0135611e41816129c1565b965060608a01356001600160401b0380821115611e5c578485fd5b611e688d838e016118ed565b909850965060808c0135915080821115611e80578485fd5b611e8c8d838e016118ed565b909650945060a08c0135915080821115611ea4578283fd5b50611eb18c828d016118ed565b915080935050809150509295985092959850929598565b60008060008060008060c08789031215611ee0578384fd5b8635611eeb816129c1565b95506020870135611efb816129c1565b94506040870135611f0b816129c1565b935060608701356001600160401b0380821115611f26578384fd5b611f328a838b01611933565b94506080890135915080821115611f47578384fd5b611f538a838b01611933565b935060a0890135915080821115611f68578283fd5b50611f7589828a01611933565b9150509295509295509295565b600060208284031215611f93578081fd5b5051919050565b60008060008060008060008060006101008a8c031215611fb8578283fd5b8935985060208a0135611fca816129c1565b975060408a0135611fda816129c1565b965060608a0135611fea816129c1565b955060808a0135611ffa816129c1565b945060a08a01356001600160401b03811115612014578384fd5b6120208c828d016118ed565b9a9d999c50979a96999598959660c08101359660e09091013595509350505050565b60008060408385031215612054578182fd5b505080516020909101519092909150565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526120a7816020860160208601612991565b601f01601f19169290920160200192915050565b60609190911b6001600160601b031916815260140190565b6001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b6000828483379101908152919050565b60008251612129818460208701612991565b9190910192915050565b60008351612145818460208801612991565b60609390931b6001600160601b0319169190920190815260140192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038c811682528b811660208301528a166040820152610120606082018190526000906121d68382018b8d612065565b905082810360808401526121eb81898b612065565b9150508560a08301528460c08301528360e0830152826101008301529c9b505050505050505050505050565b6001600160a01b038881168252878116602083015286811660408301528516606082015260c0608082018190526000906122549083018587612065565b90508260a083015298975050505050505050565b6001600160a01b038781168252868116602083015285811660408301528416606082015260c0608082018190526000906122a49083018561208f565b90508260a0830152979650505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03898116825260208201899052878116604083015286811660608301528516608082015261010060a082018190526000906123148382018761208f565b60c0840195909552505060e001529695505050505050565b600060018060a01b038516825283602083015260606040830152612353606083018461208f565b95945050505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252611474602083018461208f565b6001600160a01b038881168252602082018890528616604082015260a0606082018190526000906123d59083018688612065565b82810360808401526123e8818587612065565b9a9950505050505050505050565b6001600160a01b038681168252858116602083015284811660408301528316606082015260a0608082018190526000906124329083018461208f565b979650505050505050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b6020808252600b908201526a73616d6520626c6f636b2160a81b604082015260600190565b60208082526024908201527f50696e65436f726523657865637574654f726465723a204f524445525f4558506040820152631254915160e21b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601b908201527f47656c61746f50696e65436f72653a206f6e6c792047454c41544f0000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f50696e65436f726523657865637574654f726465723a20494e56414c49445f4f604082015263292222a960e11b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526021908201527f50696e65436f7265236465706f736974546f6b656e3a204f4e4c595f455243326040820152600360fc1b606082015260800190565b60208082526026908201527f50696e65436f7265236465706f7369744574683a2057524f4e475f494e5055546040820152652faa27a5a2a760d11b606082015260800190565b602080825260149082015273199d5b98dd1a5bdb881b9bdd08185b1b1bddd95960621b604082015260600190565b60208082526026908201527f50696e65436f7265235f70756c6c4f726465723a2050554c4c5f45544845525f60408201526511905253115160d21b606082015260800190565b60208082526023908201527f50696e65436f72652363616e63656c4f726465723a20494e56414c49445f4f576040820152622722a960e91b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252601f908201527f50696e65436f7265236465706f7369744574683a2056414c55455f49535f3000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f50696e65436f726523726563656976653a204e4f5f53454e445f4554485f504c6040820152634541534560e01b606082015260800190565b6020808252601490820152734572726f722070756c6c696e6720746f6b656e7360601b604082015260600190565b8981526001600160a01b038981166020830152888116604083015287166060820152610100608082018190526000906128b1838201888a612065565b60a0840196909652505060c081019290925260e0909101529695505050505050565b918252602082015260400190565b6000808335601e198436030181126128f7578283fd5b8301803591506001600160401b03821115612910578283fd5b60200191503681900382131561192c57600080fd5b6040518181016001600160401b038111828210171561294057fe5b604052919050565b60006001600160401b0382111561295b57fe5b50601f01601f191660200190565b60008085851115612978578182fd5b83861115612984578182fd5b5050820193919092039150565b60005b838110156129ac578181015183820152602001612994565b838111156129bb576000848401525b50505050565b6001600160a01b03811681146129d657600080fd5b5056fea164736f6c6343000706000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007f8a7068c0100881b8514ed798582436fe6aab65
-----Decoded View---------------
Arg [0] : _gelato (address): 0x7F8A7068C0100881b8514ED798582436fe6Aab65
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007f8a7068c0100881b8514ed798582436fe6aab65
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| SWELL | 100.00% | $3,186.24 | 0.000001 | $0.003186 |
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.