Source Code
Latest 25 from a total of 29,343 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Rescue Funds | 107685863 | 840 days ago | IN | 0 ETH | 0.000028383212 | ||||
| Rescue Funds | 107685807 | 840 days ago | IN | 0 ETH | 0.000027132813 | ||||
| Transfer Ownersh... | 107685619 | 840 days ago | IN | 0 ETH | 0.000021987789 | ||||
| Swap | 89710231 | 951 days ago | IN | 0.00001 ETH | 0.000208799276 | ||||
| Swap | 85568587 | 962 days ago | IN | 0.00001 ETH | 0.000175900992 | ||||
| Swap | 83596039 | 969 days ago | IN | 0 ETH | 0.000128408377 | ||||
| Swap | 83595848 | 969 days ago | IN | 0.000572146645023 ETH | 0.000130900559 | ||||
| Swap | 79247735 | 986 days ago | IN | 0 ETH | 0.00017205774 | ||||
| Swap | 79247461 | 986 days ago | IN | 0 ETH | 0.000209783851 | ||||
| Swap | 79008045 | 988 days ago | IN | 0.01 ETH | 0.000251844865 | ||||
| Swap | 79007912 | 988 days ago | IN | 0.01 ETH | 0.000247325734 | ||||
| Swap | 77817025 | 994 days ago | IN | 0.0001 ETH | 0.000320090561 | ||||
| Swap | 77816667 | 994 days ago | IN | 0 ETH | 0.000397814977 | ||||
| Swap | 77352439 | 996 days ago | IN | 0 ETH | 0.000244926312 | ||||
| Swap | 76490744 | 999 days ago | IN | 0.2 ETH | 0.000415536411 | ||||
| Swap | 76490213 | 999 days ago | IN | 0.2 ETH | 0.000344614324 | ||||
| Swap | 76489787 | 999 days ago | IN | 0.2 ETH | 0.000369829858 | ||||
| Swap | 76489166 | 999 days ago | IN | 1 ETH | 0.000312415926 | ||||
| Swap | 76487275 | 999 days ago | IN | 1 ETH | 0.000415115821 | ||||
| Swap | 76150394 | 1000 days ago | IN | 0 ETH | 0.00026753912 | ||||
| Swap | 76132899 | 1000 days ago | IN | 0.01 ETH | 0.000438741393 | ||||
| Swap | 76132608 | 1000 days ago | IN | 0.001 ETH | 0.000384370253 | ||||
| Swap | 75007420 | 1005 days ago | IN | 0.9 ETH | 0.000640339686 | ||||
| Swap | 73924299 | 1010 days ago | IN | 0.02 ETH | 0.000140489853 | ||||
| Swap | 72639967 | 1016 days ago | IN | 0.002 ETH | 0.000286493433 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 107685863 | 840 days ago | 0.0061 ETH | ||||
| 89710231 | 951 days ago | 0.00001 ETH | ||||
| 85568587 | 962 days ago | 0.00001 ETH | ||||
| 83595848 | 969 days ago | 0.000572146645023 ETH | ||||
| 79008045 | 988 days ago | 0.01 ETH | ||||
| 79007912 | 988 days ago | 0.01 ETH | ||||
| 77817025 | 994 days ago | 0.0001 ETH | ||||
| 76490744 | 999 days ago | 0.2 ETH | ||||
| 76490213 | 999 days ago | 0.2 ETH | ||||
| 76489787 | 999 days ago | 0.2 ETH | ||||
| 76489166 | 999 days ago | 1 ETH | ||||
| 76487275 | 999 days ago | 1 ETH | ||||
| 76132899 | 1000 days ago | 0.01 ETH | ||||
| 76132608 | 1000 days ago | 0.001 ETH | ||||
| 75007420 | 1005 days ago | 0.9 ETH | ||||
| 73924299 | 1010 days ago | 0.02 ETH | ||||
| 72639967 | 1016 days ago | 0.002 ETH | ||||
| 72639871 | 1016 days ago | 0.003 ETH | ||||
| 50536847 | 1068 days ago | 0.0017 ETH | ||||
| 50536620 | 1068 days ago | 0.0001 ETH | ||||
| 41577511 | 1091 days ago | 0.024 ETH | ||||
| 38641055 | 1099 days ago | 0.1 ETH | ||||
| 38639229 | 1099 days ago | 0.1 ETH | ||||
| 38638705 | 1099 days ago | 0.1 ETH | ||||
| 38635278 | 1099 days ago | 0.1 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
AggregationRouterV3
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at optimistic.etherscan.io on 2021-11-29
*/
/*
,▄▓▓██▌ ,╓▄▄▓▓▓▓▓▓▓▓▄▄▄,,
,▓██▓███▓▄▓███▓╬╬╬╬╬╬╬╬╬╬╬╬╬▓███▓▄,
▄█ ▓██╬╣███████╬▓▀╬╬▓▓▓████████████▓█████▄,
▓██▌ ▓██╬╣██████╬▓▌ ██████████████████████▌╙╙▀ⁿ
▐████████╬▓████▓▓█╨ ▄ ╟█████████▓▓╬╬╬╬╬▓▓█████▓▄
└▀▓▓▄╓ ╟█▓╣█████▓██████▀ ╓█▌ ███████▓▓▓▓▓╬╬╬╬╬╬╬╬╬╬╬╬▓██▓▄
└▀████▓▄╥ ▐██╬╬██████████╙ Æ▀─ ▓███▀╚╠╬╩▀▀███████▓▓╬╬╬╬╬╬╬╬╬██▄
└▀██▓▀▀█████▓╬▓██████▀ ▄█████▒╠" └╙▓██████▓╬╬╬╬╬╬╬╬██▄
└▀██▄,└╙▀▀████▌└╙ ^"▀╙╙╙"╙██ @▄ ╙▀███████╬╬╬╬╬╬╬██µ
└▀██▓▄, ██▌ ╒ ╙█▓ ]▓█▓╔ ▀███████▓╬╬╬╬╬▓█▌
▀█████ ▓ ╟█▌ ]╠██▓░▒╓ ▀████████╬╬╬╬╣█▌
▐████ ╓█▀█▌ ,██▌ ╚Å███▓▒▒╠╓ ╙█████████╬╬╬╣█▌
└████ ▓█░░▓█ ▀▀▀ φ▒╫████▒▒▒▒╠╓ █████████▓╬╬▓█µ
╘███µ ▌▄█▓▄▓▀` ,▀ ,╔╠░▓██████▌╠▒▒▒φ ██████████╬╬██
▐████µ╙▓▀` ,▀╙,╔╔φφφ╠░▄▓███████▌░▓╙▒▒▒╠ └██╬███████╬▓█⌐
╫██ ▓▌ ▌φ▒▒░▓██████████████▌▒░▓╚▒▒▒╠ ▓██╬▓██████╣█▌
██▌ ▌╔▒▒▄████████████████▒▒▒░▌╠▒▒▒≥▐██▓╬╬███████▌
██▌ ,╓φ╠▓«▒▒▓████▀ ▀█████████▌▒▒▒╟░▒▒▒▒▐███╬╬╣████▓█▌
▐██ ╠▒▄▓▓███▓████└ ▀████████▌▒▒░▌╚▒▒▒▐███▓╬╬████ ╙▌
███ ) ╠▒░░░▒░╬████▀ └████████░▒▒░╬∩▒▒▓████╬╬╣███
▓██ ╠╠▒▒▐█▀▀▌`░╫██ ███████▒▒▒▒░▒▒½█████╬╬╣███
███ ,█▄ ╠▒▒▒╫▌,▄▀,▒╫██ ╟██████▒▒▒░╣⌠▒▓█████╬╬╣██▌
╘██µ ██` ╠▒▒░██╬φ╠▄▓██` ██████░░▌φ╠░▓█████▓╬╬▓██
╟██ .φ╠▒░▄█▀░░▄██▀└ █████▌▒╣φ▒░▓██████╬╬╣██
▀██▄▄▄╓▄███████▀ ▐█████░▓φ▒▄███████▓╬╣██
╙▀▀▀██▀└ ████▓▄▀φ▄▓████████╬▓█▀
▓███╬╩╔╣██████████▓██└
╓████▀▄▓████████▀████▀
,▓███████████████─]██╙
,▄▓██████████████▀└ ╙
,╓▄▓███████████████▀╙
`"▀▀▀████████▀▀▀▀`▄███▀▀└
└└
11\ 11\ 11\ 11\ 11\ 11\ 11\
1111 | \__| 11 | 111\ 11 | 11 | 11 |
\_11 | 11\ 1111111\ 1111111\ 1111111\ 1111\ 11 | 111111\ 111111\ 11\ 11\ 11\ 111111\ 111111\ 11 | 11\
11 | 11 |11 __11\ 11 _____|11 __11\ 11 11\11 |11 __11\\_11 _| 11 | 11 | 11 |11 __11\ 11 __11\ 11 | 11 |
11 | 11 |11 | 11 |11 / 11 | 11 | 11 \1111 |11111111 | 11 | 11 | 11 | 11 |11 / 11 |11 | \__|111111 /
11 | 11 |11 | 11 |11 | 11 | 11 | 11 |\111 |11 ____| 11 |11\ 11 | 11 | 11 |11 | 11 |11 | 11 _11<
111111\ 11 |11 | 11 |\1111111\ 11 | 11 | 11 | \11 |\1111111\ \1111 |\11111\1111 |\111111 |11 | 11 | \11\
\______|\__|\__| \__| \_______|\__| \__| \__| \__| \_______| \____/ \_____\____/ \______/ \__| \__| \__|
111111\ 11\ 11\
11 __11\ 11 | \__|
11 / 11 | 111111\ 111111\ 111111\ 111111\ 111111\ 111111\ 111111\ 11\ 111111\ 1111111\
11111111 |11 __11\ 11 __11\ 11 __11\ 11 __11\ 11 __11\ \____11\\_11 _| 11 |11 __11\ 11 __11\
11 __11 |11 / 11 |11 / 11 |11 | \__|11111111 |11 / 11 | 1111111 | 11 | 11 |11 / 11 |11 | 11 |
11 | 11 |11 | 11 |11 | 11 |11 | 11 ____|11 | 11 |11 __11 | 11 |11\ 11 |11 | 11 |11 | 11 |
11 | 11 |\1111111 |\1111111 |11 | \1111111\ \1111111 |\1111111 | \1111 |11 |\111111 |11 | 11 |
\__| \__| \____11 | \____11 |\__| \_______| \____11 | \_______| \____/ \__| \______/ \__| \__|
11\ 11 |11\ 11 | 11\ 11 |
\111111 |\111111 | \111111 |
\______/ \______/ \______/
1111111\ 11\
11 __11\ 11 |
11 | 11 | 111111\ 11\ 11\ 111111\ 111111\ 111111\
1111111 |11 __11\ 11 | 11 |\_11 _| 11 __11\ 11 __11\
11 __11< 11 / 11 |11 | 11 | 11 | 11111111 |11 | \__|
11 | 11 |11 | 11 |11 | 11 | 11 |11\ 11 ____|11 |
11 | 11 |\111111 |\111111 | \1111 |\1111111\ 11 |
\__| \__| \______/ \______/ \____/ \_______|\__|
*/
// File @openzeppelin/contracts/utils/[email protected]
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/*
* @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;
}
}
// File @openzeppelin/contracts/access/[email protected]
pragma solidity >=0.6.0 <0.8.0;
/**
* @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;
}
}
// File @openzeppelin/contracts/token/ERC20/[email protected]
pragma solidity >=0.6.0 <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);
}
// File @openzeppelin/contracts/math/[email protected]
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
// File @openzeppelin/contracts/utils/[email protected]
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File @openzeppelin/contracts/token/ERC20/[email protected]
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File contracts/helpers/UniERC20.sol
pragma solidity ^0.6.12;
library UniERC20 {
using SafeMath for uint256;
IERC20 private constant _ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
IERC20 private constant _ZERO_ADDRESS = IERC20(0);
function isETH(IERC20 token) internal pure returns (bool) {
return (token == _ZERO_ADDRESS || token == _ETH_ADDRESS);
}
function uniBalanceOf(IERC20 token, address account) internal view returns (uint256) {
if (isETH(token)) {
return account.balance;
} else {
return token.balanceOf(account);
}
}
function uniTransfer(IERC20 token, address payable to, uint256 amount) internal {
if (amount > 0) {
if (isETH(token)) {
to.transfer(amount);
} else {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, amount));
}
}
}
function uniApprove(IERC20 token, address to, uint256 amount) internal {
require(!isETH(token), "Approve called on ETH");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(abi.encodeWithSelector(token.approve.selector, to, amount));
if (!success || (returndata.length > 0 && !abi.decode(returndata, (bool)))) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, to, 0));
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, to, amount));
}
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "low-level call failed");
if (returndata.length > 0) { // Return data is optional
require(abi.decode(returndata, (bool)), "ERC20 operation did not succeed");
}
}
}
// File contracts/interfaces/IChi.sol
pragma solidity ^0.6.12;
interface IChi is IERC20 {
function mint(uint256 value) external;
function free(uint256 value) external returns (uint256 freed);
function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);
}
// File contracts/interfaces/IGasDiscountExtension.sol
pragma solidity ^0.6.12;
interface IGasDiscountExtension {
function calculateGas(uint256 gasUsed, uint256 flags, uint256 calldataLength) external view returns (IChi, uint256);
}
// File contracts/interfaces/IAggregationExecutor.sol
pragma solidity ^0.6.12;
interface IAggregationExecutor is IGasDiscountExtension {
function callBytes(bytes calldata data) external payable; // 0xd9c45357
}
// File contracts/helpers/RevertReasonParser.sol
pragma solidity ^0.6.12;
library RevertReasonParser {
function parse(bytes memory data, string memory prefix) internal pure returns (string memory) {
// https://solidity.readthedocs.io/en/latest/control-structures.html#revert
// We assume that revert reason is abi-encoded as Error(string)
// 68 = 4-byte selector 0x08c379a0 + 32 bytes offset + 32 bytes length
if (data.length >= 68 && data[0] == "\x08" && data[1] == "\xc3" && data[2] == "\x79" && data[3] == "\xa0") {
string memory reason;
// solhint-disable no-inline-assembly
assembly {
// 68 = 32 bytes data length + 4-byte selector + 32 bytes offset
reason := add(data, 68)
}
/*
revert reason is padded up to 32 bytes with ABI encoder: Error(string)
also sometimes there is extra 32 bytes of zeros padded in the end:
https://github.com/ethereum/solidity/issues/10170
because of that we can't check for equality and instead check
that string length + extra 68 bytes is less than overall data length
*/
require(data.length >= 68 + bytes(reason).length, "Invalid revert reason");
return string(abi.encodePacked(prefix, "Error(", reason, ")"));
}
// 36 = 4-byte selector 0x4e487b71 + 32 bytes integer
else if (data.length == 36 && data[0] == "\x4e" && data[1] == "\x48" && data[2] == "\x7b" && data[3] == "\x71") {
uint256 code;
// solhint-disable no-inline-assembly
assembly {
// 36 = 32 bytes data length + 4-byte selector
code := mload(add(data, 36))
}
return string(abi.encodePacked(prefix, "Panic(", _toHex(code), ")"));
}
return string(abi.encodePacked(prefix, "Unknown(", _toHex(data), ")"));
}
function _toHex(uint256 value) private pure returns(string memory) {
return _toHex(abi.encodePacked(value));
}
function _toHex(bytes memory data) private pure returns(string memory) {
bytes16 alphabet = 0x30313233343536373839616263646566;
bytes memory str = new bytes(2 + data.length * 2);
str[0] = "0";
str[1] = "x";
for (uint256 i = 0; i < data.length; i++) {
str[2 * i + 2] = alphabet[uint8(data[i] >> 4)];
str[2 * i + 3] = alphabet[uint8(data[i] & 0x0f)];
}
return string(str);
}
}
// File contracts/interfaces/IERC20Permit.sol
pragma solidity ^0.6.12;
interface IERC20Permit {
function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
}
// File contracts/helpers/Permitable.sol
pragma solidity ^0.6.12;
contract Permitable {
event Error(
string reason
);
function _permit(IERC20 token, uint256 amount, bytes calldata permit) internal {
if (permit.length == 32 * 7) {
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory result) = address(token).call(abi.encodePacked(IERC20Permit.permit.selector, permit));
if (!success) {
string memory reason = RevertReasonParser.parse(result, "Permit call failed: ");
if (token.allowance(msg.sender, address(this)) < amount) {
revert(reason);
} else {
emit Error(reason);
}
}
}
}
}
// File contracts/UnoswapRouter.sol
pragma solidity ^0.6.12;
contract UnoswapRouter is Permitable {
uint256 private constant _TRANSFER_FROM_CALL_SELECTOR_32 = 0x23b872dd00000000000000000000000000000000000000000000000000000000;
uint256 private constant _WETH_DEPOSIT_CALL_SELECTOR_32 = 0xd0e30db000000000000000000000000000000000000000000000000000000000;
uint256 private constant _WETH_WITHDRAW_CALL_SELECTOR_32 = 0x2e1a7d4d00000000000000000000000000000000000000000000000000000000;
uint256 private constant _ERC20_TRANSFER_CALL_SELECTOR_32 = 0xa9059cbb00000000000000000000000000000000000000000000000000000000;
uint256 private constant _ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;
uint256 private constant _REVERSE_MASK = 0x8000000000000000000000000000000000000000000000000000000000000000;
uint256 private constant _WETH_MASK = 0x4000000000000000000000000000000000000000000000000000000000000000;
uint256 private constant _NUMERATOR_MASK = 0x0000000000000000ffffffff0000000000000000000000000000000000000000;
uint256 private constant _WETH = 0x0000000000000000000000004200000000000000000000000000000000000006;
uint256 private constant _UNISWAP_PAIR_RESERVES_CALL_SELECTOR_32 = 0x0902f1ac00000000000000000000000000000000000000000000000000000000;
uint256 private constant _UNISWAP_PAIR_SWAP_CALL_SELECTOR_32 = 0x022c0d9f00000000000000000000000000000000000000000000000000000000;
uint256 private constant _DENOMINATOR = 1000000000;
uint256 private constant _NUMERATOR_OFFSET = 160;
receive() external payable {
// solhint-disable-next-line avoid-tx-origin
require(msg.sender != tx.origin, "ETH deposit rejected");
}
function unoswapWithPermit(
IERC20 srcToken,
uint256 amount,
uint256 minReturn,
bytes32[] calldata pools,
bytes calldata permit
) external payable returns(uint256 returnAmount) {
_permit(srcToken, amount, permit);
return unoswap(srcToken, amount, minReturn, pools);
}
function unoswap(
IERC20 srcToken,
uint256 amount,
uint256 minReturn,
bytes32[] calldata /* pools */
) public payable returns(uint256 returnAmount) {
assembly { // solhint-disable-line no-inline-assembly
function reRevert() {
returndatacopy(0, 0, returndatasize())
revert(0, returndatasize())
}
function revertWithReason(m, len) {
mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
mstore(0x20, 0x0000002000000000000000000000000000000000000000000000000000000000)
mstore(0x40, m)
revert(0, len)
}
function swap(emptyPtr, swapAmount, pair, reversed, numerator, dst) -> ret {
mstore(emptyPtr, _UNISWAP_PAIR_RESERVES_CALL_SELECTOR_32)
if iszero(staticcall(gas(), pair, emptyPtr, 0x4, emptyPtr, 0x40)) {
reRevert()
}
let reserve0 := mload(emptyPtr)
let reserve1 := mload(add(emptyPtr, 0x20))
if reversed {
let tmp := reserve0
reserve0 := reserve1
reserve1 := tmp
}
ret := mul(swapAmount, numerator)
ret := div(mul(ret, reserve1), add(ret, mul(reserve0, _DENOMINATOR)))
mstore(emptyPtr, _UNISWAP_PAIR_SWAP_CALL_SELECTOR_32)
switch reversed
case 0 {
mstore(add(emptyPtr, 0x04), 0)
mstore(add(emptyPtr, 0x24), ret)
}
default {
mstore(add(emptyPtr, 0x04), ret)
mstore(add(emptyPtr, 0x24), 0)
}
mstore(add(emptyPtr, 0x44), dst)
mstore(add(emptyPtr, 0x64), 0x80)
mstore(add(emptyPtr, 0x84), 0)
if iszero(call(gas(), pair, 0, emptyPtr, 0xa4, 0, 0)) {
reRevert()
}
}
let emptyPtr := mload(0x40)
mstore(0x40, add(emptyPtr, 0xc0))
let poolsOffset := add(calldataload(0x64), 0x4)
let poolsEndOffset := calldataload(poolsOffset)
poolsOffset := add(poolsOffset, 0x20)
poolsEndOffset := add(poolsOffset, mul(0x20, poolsEndOffset))
let rawPair := calldataload(poolsOffset)
switch srcToken
case 0 {
if iszero(eq(amount, callvalue())) {
revertWithReason(0x00000011696e76616c6964206d73672e76616c75650000000000000000000000, 0x55) // "invalid msg.value"
}
mstore(emptyPtr, _WETH_DEPOSIT_CALL_SELECTOR_32)
if iszero(call(gas(), _WETH, amount, emptyPtr, 0x4, 0, 0)) {
reRevert()
}
mstore(emptyPtr, _ERC20_TRANSFER_CALL_SELECTOR_32)
mstore(add(emptyPtr, 0x4), and(rawPair, _ADDRESS_MASK))
mstore(add(emptyPtr, 0x24), amount)
if iszero(call(gas(), _WETH, 0, emptyPtr, 0x44, 0, 0)) {
reRevert()
}
}
default {
if callvalue() {
revertWithReason(0x00000011696e76616c6964206d73672e76616c75650000000000000000000000, 0x55) // "invalid msg.value"
}
mstore(emptyPtr, _TRANSFER_FROM_CALL_SELECTOR_32)
mstore(add(emptyPtr, 0x4), caller())
mstore(add(emptyPtr, 0x24), and(rawPair, _ADDRESS_MASK))
mstore(add(emptyPtr, 0x44), amount)
if iszero(call(gas(), srcToken, 0, emptyPtr, 0x64, 0, 0)) {
reRevert()
}
}
returnAmount := amount
for {let i := add(poolsOffset, 0x20)} lt(i, poolsEndOffset) {i := add(i, 0x20)} {
let nextRawPair := calldataload(i)
returnAmount := swap(
emptyPtr,
returnAmount,
and(rawPair, _ADDRESS_MASK),
and(rawPair, _REVERSE_MASK),
shr(_NUMERATOR_OFFSET, and(rawPair, _NUMERATOR_MASK)),
and(nextRawPair, _ADDRESS_MASK)
)
rawPair := nextRawPair
}
switch and(rawPair, _WETH_MASK)
case 0 {
returnAmount := swap(
emptyPtr,
returnAmount,
and(rawPair, _ADDRESS_MASK),
and(rawPair, _REVERSE_MASK),
shr(_NUMERATOR_OFFSET, and(rawPair, _NUMERATOR_MASK)),
caller()
)
}
default {
returnAmount := swap(
emptyPtr,
returnAmount,
and(rawPair, _ADDRESS_MASK),
and(rawPair, _REVERSE_MASK),
shr(_NUMERATOR_OFFSET, and(rawPair, _NUMERATOR_MASK)),
address()
)
mstore(emptyPtr, _WETH_WITHDRAW_CALL_SELECTOR_32)
mstore(add(emptyPtr, 0x04), returnAmount)
if iszero(call(gas(), _WETH, 0, emptyPtr, 0x24, 0, 0)) {
reRevert()
}
if iszero(call(gas(), caller(), returnAmount, 0, 0, 0, 0)) {
reRevert()
}
}
if lt(returnAmount, minReturn) {
revertWithReason(0x000000164d696e2072657475726e206e6f742072656163686564000000000000, 0x5a) // "Min return not reached"
}
}
}
}
// File contracts/AggregationRouterV3.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
contract AggregationRouterV3 is Ownable, UnoswapRouter {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using UniERC20 for IERC20;
uint256 private constant _PARTIAL_FILL = 0x01;
uint256 private constant _REQUIRES_EXTRA_ETH = 0x02;
uint256 private constant _SHOULD_CLAIM = 0x04;
uint256 private constant _BURN_FROM_MSG_SENDER = 0x08;
uint256 private constant _BURN_FROM_TX_ORIGIN = 0x10;
struct SwapDescription {
IERC20 srcToken;
IERC20 dstToken;
address srcReceiver;
address dstReceiver;
uint256 amount;
uint256 minReturnAmount;
uint256 flags;
bytes permit;
}
event Swapped(
address sender,
IERC20 srcToken,
IERC20 dstToken,
address dstReceiver,
uint256 spentAmount,
uint256 returnAmount
);
function discountedSwap(
IAggregationExecutor caller,
SwapDescription calldata desc,
bytes calldata data
)
external
payable
returns (uint256 returnAmount, uint256 gasLeft, uint256 chiSpent)
{
uint256 initialGas = gasleft();
address chiSource = address(0);
if (desc.flags & _BURN_FROM_MSG_SENDER != 0) {
chiSource = msg.sender;
} else if (desc.flags & _BURN_FROM_TX_ORIGIN != 0) {
chiSource = tx.origin; // solhint-disable-line avoid-tx-origin
} else {
revert("Incorrect CHI burn flags");
}
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returnData) = address(this).delegatecall(abi.encodeWithSelector(this.swap.selector, caller, desc, data));
if (success) {
(returnAmount,) = abi.decode(returnData, (uint256, uint256));
} else {
if (msg.value > 0) {
msg.sender.transfer(msg.value);
}
emit Error(RevertReasonParser.parse(returnData, "Swap failed: "));
}
(IChi chi, uint256 amount) = caller.calculateGas(initialGas.sub(gasleft()), desc.flags, msg.data.length);
if (amount > 0) {
chiSpent = chi.freeFromUpTo(chiSource, amount);
}
gasLeft = gasleft();
}
function swap(
IAggregationExecutor caller,
SwapDescription calldata desc,
bytes calldata data
)
external
payable
returns (uint256 returnAmount, uint256 gasLeft)
{
require(desc.minReturnAmount > 0, "Min return should not be 0");
require(data.length > 0, "data should be not zero");
uint256 flags = desc.flags;
IERC20 srcToken = desc.srcToken;
IERC20 dstToken = desc.dstToken;
if (flags & _REQUIRES_EXTRA_ETH != 0) {
require(msg.value > (srcToken.isETH() ? desc.amount : 0), "Invalid msg.value");
} else {
require(msg.value == (srcToken.isETH() ? desc.amount : 0), "Invalid msg.value");
}
if (flags & _SHOULD_CLAIM != 0) {
require(!srcToken.isETH(), "Claim token is ETH");
_permit(srcToken, desc.amount, desc.permit);
srcToken.safeTransferFrom(msg.sender, desc.srcReceiver, desc.amount);
}
address dstReceiver = (desc.dstReceiver == address(0)) ? msg.sender : desc.dstReceiver;
uint256 initialSrcBalance = (flags & _PARTIAL_FILL != 0) ? srcToken.uniBalanceOf(msg.sender) : 0;
uint256 initialDstBalance = dstToken.uniBalanceOf(dstReceiver);
{
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory result) = address(caller).call{value: msg.value}(abi.encodePacked(caller.callBytes.selector, data));
if (!success) {
revert(RevertReasonParser.parse(result, "callBytes failed: "));
}
}
uint256 spentAmount = desc.amount;
returnAmount = dstToken.uniBalanceOf(dstReceiver).sub(initialDstBalance);
if (flags & _PARTIAL_FILL != 0) {
spentAmount = initialSrcBalance.add(desc.amount).sub(srcToken.uniBalanceOf(msg.sender));
require(returnAmount.mul(desc.amount) >= desc.minReturnAmount.mul(spentAmount), "Return amount is not enough");
} else {
require(returnAmount >= desc.minReturnAmount, "Return amount is not enough");
}
emit Swapped(
msg.sender,
srcToken,
dstToken,
dstReceiver,
spentAmount,
returnAmount
);
gasLeft = gasleft();
}
function rescueFunds(IERC20 token, uint256 amount) external onlyOwner {
token.uniTransfer(msg.sender, amount);
}
function destroy() external onlyOwner {
selfdestruct(msg.sender);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"Error","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"srcToken","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"dstToken","type":"address"},{"indexed":false,"internalType":"address","name":"dstReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"spentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAggregationExecutor","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct AggregationRouterV3.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"discountedSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"gasLeft","type":"uint256"},{"internalType":"uint256","name":"chiSpent","type":"uint256"}],"stateMutability":"payable","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":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAggregationExecutor","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct AggregationRouterV3.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"},{"internalType":"uint256","name":"gasLeft","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"name":"unoswap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturn","type":"uint256"},{"internalType":"bytes32[]","name":"pools","type":"bytes32[]"},{"internalType":"bytes","name":"permit","type":"bytes"}],"name":"unoswapWithPermit","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b612fa8806200007e6000396000f3fe60806040526004361061009a5760003560e01c80637c025200116100695780638da5cb5b1161004e5780638da5cb5b1461019f578063a1251d75146101c1578063f2fde38b146101d4576100e4565b80637c0252001461016957806383197ef01461018a576100e4565b80632e95b6c8146100e95780636c4a483e14610112578063715018a61461013457806378e3214f14610149576100e4565b366100e457333214156100e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612a81565b60405180910390fd5b005b600080fd5b6100fc6100f736600461244f565b6101f4565b604051610109919061278f565b60405180910390f35b610125610120366004612379565b610715565b60405161010993929190612e38565b34801561014057600080fd5b506100e2610ab6565b34801561015557600080fd5b506100e2610164366004612424565b610b98565b61017c610177366004612379565b610c30565b604051610109929190612e2a565b34801561019657600080fd5b506100e2611190565b3480156101ab57600080fd5b506101b4611206565b6040516101099190612798565b6100fc6101cf3660046124b7565b611222565b3480156101e057600080fd5b506100e26101ef36600461233d565b611249565b600061032f565b3d6000803e3d6000fd5b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c200000000000000000000000000000000000000000000000000000000060205280604052816000fd5b60007f0902f1ac000000000000000000000000000000000000000000000000000000008252604082600484875afa61028d5761028d6101fb565b81516020830151861561029c57905b7f022c0d9f000000000000000000000000000000000000000000000000000000008452878502633b9aca0092909202820191020490508480156102eb57816004840152600060248401526102f9565b600060048401528160248401525b50866044830152608060648301526000608483015260008060a4846000885af1610325576103256101fb565b9695505050505050565b60405160c0810160405260046064350180356020820191508060200282019050813589600081146103ef5734156103885761038860557c11696e76616c6964206d73672e76616c75650000000000000000000000610205565b7f23b872dd00000000000000000000000000000000000000000000000000000000855233600486015273ffffffffffffffffffffffffffffffffffffffff8216602486015289604486015260008060648760008f5af16103ea576103ea6101fb565b6104db565b348a1461041e5761041e60557c11696e76616c6964206d73672e76616c75650000000000000000000000610205565b7fd0e30db00000000000000000000000000000000000000000000000000000000085526000806004878d7342000000000000000000000000000000000000065af161046b5761046b6101fb565b7fa9059cbb00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff8216600486015289602486015260008060448760007342000000000000000000000000000000000000065af16104db576104db6101fb565b50889450602083015b8281101561057357803561056773ffffffffffffffffffffffffffffffffffffffff821677ffffffff0000000000000000000000000000000000000000851660a01c7f8000000000000000000000000000000000000000000000000000000000000000861673ffffffffffffffffffffffffffffffffffffffff87168b8b610253565b965091506020016104e4565b507f400000000000000000000000000000000000000000000000000000000000000081168015610671576106003077ffffffff0000000000000000000000000000000000000000841660a01c7f8000000000000000000000000000000000000000000000000000000000000000851673ffffffffffffffffffffffffffffffffffffffff86168a8a610253565b95507f2e1a7d4d00000000000000000000000000000000000000000000000000000000855285600486015260008060248760007342000000000000000000000000000000000000065af1610656576106566101fb565b60008060008089335af161066c5761066c6101fb565b6106d7565b6106d43377ffffffff0000000000000000000000000000000000000000841660a01c7f8000000000000000000000000000000000000000000000000000000000000000851673ffffffffffffffffffffffffffffffffffffffff86168a8a610253565b95505b50505050508381101561070c5761070c605a7c164d696e2072657475726e206e6f742072656163686564000000000000610205565b95945050505050565b6000806000805a9050600060c08801356008161561073457503361077a565b60c08801356010161561074857503261077a565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612b83565b600060603073ffffffffffffffffffffffffffffffffffffffff16637c02520060e01b8c8c8c8c6040516024016107b4949392919061287e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161083d9190612623565b600060405180830381855af49150503d8060008114610878576040519150601f19603f3d011682016040523d82523d6000602084013e61087d565b606091505b509150915081156108a4578080602001905181019061089c9190612562565b50965061094e565b34156108d85760405133903480156108fc02916000818181858888f193505050501580156108d6573d6000803e3d6000fd5b505b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa610938826040518060400160405280600d81526020017f53776170206661696c65643a2000000000000000000000000000000000000000815250611396565b6040516109459190612965565b60405180910390a15b6000808c73ffffffffffffffffffffffffffffffffffffffff16631d97832e6109785a8990611769565b8e60c0013560003690506040518463ffffffff1660e01b81526004016109a093929190612e38565b604080518083038186803b1580156109b757600080fd5b505afa1580156109cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ef91906123f7565b90925090508015610aa3576040517f079d229f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063079d229f90610a4e9088908590600401612827565b602060405180830381600087803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa0919061254a565b96505b5a97505050505050509450945094915050565b610abe6117ab565b73ffffffffffffffffffffffffffffffffffffffff16610adc611206565b73ffffffffffffffffffffffffffffffffffffffff1614610b29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c85565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b610ba06117ab565b73ffffffffffffffffffffffffffffffffffffffff16610bbe611206565b73ffffffffffffffffffffffffffffffffffffffff1614610c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c85565b610c2c73ffffffffffffffffffffffffffffffffffffffff831633836117af565b5050565b60008060008560a0013511610c71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612bf1565b82610ca8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612cf1565b60c08501356000610cbc602088018861233d565b90506000610cd06040890160208a0161233d565b90506002831615610d4857610cfa8273ffffffffffffffffffffffffffffffffffffffff166118b2565b610d05576000610d0b565b87608001355b3411610d43576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612ab8565b610db0565b610d678273ffffffffffffffffffffffffffffffffffffffff166118b2565b610d72576000610d78565b87608001355b3414610db0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612ab8565b6004831615610e6157610dd88273ffffffffffffffffffffffffffffffffffffffff166118b2565b15610e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d9906129b6565b610e2a8260808a0135610e2560e08c018c612e4e565b611905565b610e6133610e3e60608b0160408c0161233d565b73ffffffffffffffffffffffffffffffffffffffff8516919060808c0135611b14565b600080610e7460808b0160608c0161233d565b73ffffffffffffffffffffffffffffffffffffffff1614610ea457610e9f60808a0160608b0161233d565b610ea6565b335b9050600060018516610eb9576000610ed9565b610ed973ffffffffffffffffffffffffffffffffffffffff851633611bb7565b90506000610efd73ffffffffffffffffffffffffffffffffffffffff851684611bb7565b9050600060608d73ffffffffffffffffffffffffffffffffffffffff163463d9c4535760e01b8e8e604051602001610f37939291906125e7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610f6f91612623565b60006040518083038185875af1925050503d8060008114610fac576040519150601f19603f3d011682016040523d82523d6000602084013e610fb1565b606091505b50915091508161102d57610ffa816040518060400160405280601281526020017f63616c6c4279746573206661696c65643a200000000000000000000000000000815250611396565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d99190612965565b505060808b013561105e8261105873ffffffffffffffffffffffffffffffffffffffff881687611bb7565b90611769565b985060018716156110fe576110a361108c73ffffffffffffffffffffffffffffffffffffffff881633611bb7565b6110588e6080013586611c8e90919063ffffffff16565b90506110b360a08d013582611cd4565b6110c18a60808f0135611cd4565b10156110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612bba565b61113c565b8b60a0013589101561113c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612bba565b7fd6d4f5681c246c9f42c203e287975af1601f8df8035a9251f79aab5c8f09e2f833878787858e604051611175969594939291906127e0565b60405180910390a15a97505050505050505094509492505050565b6111986117ab565b73ffffffffffffffffffffffffffffffffffffffff166111b6611206565b73ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c85565b33ff5b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600061123088888585611905565b61123d88888888886101f4565b98975050505050505050565b6112516117ab565b73ffffffffffffffffffffffffffffffffffffffff1661126f611206565b73ffffffffffffffffffffffffffffffffffffffff16146112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c85565b73ffffffffffffffffffffffffffffffffffffffff8116611309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d9906129ed565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060448351101580156113fd5750826000815181106113b257fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0800000000000000000000000000000000000000000000000000000000000000145b801561145c57508260018151811061141157fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fc300000000000000000000000000000000000000000000000000000000000000145b80156114bb57508260028151811061147057fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7900000000000000000000000000000000000000000000000000000000000000145b801561151a5750826003815181106114cf57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fa000000000000000000000000000000000000000000000000000000000000000145b15611590576060604484019050805160440184511015611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612d28565b8281604051602001611579929190612743565b604051602081830303815290604052915050611763565b825160241480156115f45750826000815181106115a957fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4e00000000000000000000000000000000000000000000000000000000000000145b801561165357508260018151811061160857fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4800000000000000000000000000000000000000000000000000000000000000145b80156116b257508260028151811061166757fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7b00000000000000000000000000000000000000000000000000000000000000145b80156117115750826003815181106116c657fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7100000000000000000000000000000000000000000000000000000000000000145b156117365760248301518261172582611d28565b60405160200161157992919061263f565b8161174084611d4e565b6040516020016117519291906126c1565b60405160208183030381529060405290505b92915050565b6000828211156117a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612aef565b50900390565b3390565b80156118ad576117be836118b2565b1561180c5760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015611806573d6000803e3d6000fd5b506118ad565b6118ad8363a9059cbb60e01b848460405160240161182b929190612827565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f89565b505050565b600073ffffffffffffffffffffffffffffffffffffffff82161580611763575073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b60e0811415611b0e57600060608573ffffffffffffffffffffffffffffffffffffffff1663d505accf60e01b8585604051602001611945939291906125e7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261197d91612623565b6000604051808303816000865af19150503d80600081146119ba576040519150601f19603f3d011682016040523d82523d6000602084013e6119bf565b606091505b509150915081611b0b576060611a0a826040518060400160405280601481526020017f5065726d69742063616c6c206661696c65643a20000000000000000000000000815250611396565b9050858773ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611a489291906127b9565b60206040518083038186803b158015611a6057600080fd5b505afa158015611a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a98919061254a565b1015611ad257806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d99190612965565b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa81604051611b019190612965565b60405180910390a1505b50505b50505050565b611b0e846323b872dd60e01b858585604051602401611b359392919061284d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612081565b6000611bc2836118b2565b15611be5575073ffffffffffffffffffffffffffffffffffffffff811631611763565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190611c37908590600401612798565b60206040518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c87919061254a565b9050611763565b600082820183811015611ccd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612a4a565b9392505050565b600082611ce357506000611763565b82820282848281611cf057fe5b0414611ccd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c28565b606061176382604051602001611d3e919061278f565b6040516020818303038152906040525b80516060907f303132333435363738396162636465660000000000000000000000000000000090829060029081020167ffffffffffffffff81118015611d9357600080fd5b506040519080825280601f01601f191660200182016040528015611dbe576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611def57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611e4c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b8451811015611f8157826004868381518110611e9657fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c60f81c60108110611ecc57fe5b1a60f81b828260020260020181518110611ee257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535082858281518110611f1e57fe5b60209101015160f81c600f1660108110611f3457fe5b1a60f81b828260020260030181518110611f4a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611e7e565b509392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051611fb29190612623565b6000604051808303816000865af19150503d8060008114611fef576040519150601f19603f3d011682016040523d82523d6000602084013e611ff4565b606091505b509150915081612030576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612d5f565b805115611b0e578080602001905181019061204b9190612359565b611b0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612cba565b60606120e3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121379092919063ffffffff16565b8051909150156118ad57808060200190518101906121019190612359565b6118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612dcd565b6060612146848460008561214e565b949350505050565b60608247101561218a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612b26565b61219385612250565b6121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612d96565b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516121f39190612623565b60006040518083038185875af1925050503d8060008114612230576040519150601f19603f3d011682016040523d82523d6000602084013e612235565b606091505b5091509150612245828286612256565b979650505050505050565b3b151590565b60608315612265575081611ccd565b8251156122755782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d99190612965565b60008083601f8401126122ba578182fd5b50813567ffffffffffffffff8111156122d1578182fd5b60208301915083602080830285010111156122eb57600080fd5b9250929050565b60008083601f840112612303578182fd5b50813567ffffffffffffffff81111561231a578182fd5b6020830191508360208285010111156122eb57600080fd5b803561176381612f4d565b60006020828403121561234e578081fd5b8135611ccd81612f4d565b60006020828403121561236a578081fd5b81518015158114611ccd578182fd5b6000806000806060858703121561238e578283fd5b843561239981612f4d565b9350602085013567ffffffffffffffff808211156123b5578485fd5b9086019061010082890312156123c9578485fd5b909350604086013590808211156123de578384fd5b506123eb878288016122f2565b95989497509550505050565b60008060408385031215612409578182fd5b825161241481612f4d565b6020939093015192949293505050565b60008060408385031215612436578182fd5b823561244181612f4d565b946020939093013593505050565b600080600080600060808688031215612466578081fd5b853561247181612f4d565b94506020860135935060408601359250606086013567ffffffffffffffff81111561249a578182fd5b6124a6888289016122a9565b969995985093965092949392505050565b600080600080600080600060a0888a0312156124d1578182fd5b87356124dc81612f4d565b96506020880135955060408801359450606088013567ffffffffffffffff80821115612506578384fd5b6125128b838c016122a9565b909650945060808a013591508082111561252a578384fd5b506125378a828b016122f2565b989b979a50959850939692959293505050565b60006020828403121561255b578081fd5b5051919050565b60008060408385031215612574578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60007fffffffff000000000000000000000000000000000000000000000000000000008516825282846004840137910160040190815292915050565b60008251612635818460208701612f21565b9190910192915050565b60008351612651818460208801612f21565b7f50616e6963280000000000000000000000000000000000000000000000000000908301908152835161268b816006840160208801612f21565b7f290000000000000000000000000000000000000000000000000000000000000060069290910191820152600701949350505050565b600083516126d3818460208801612f21565b7f556e6b6e6f776e28000000000000000000000000000000000000000000000000908301908152835161270d816008840160208801612f21565b7f290000000000000000000000000000000000000000000000000000000000000060089290910191820152600901949350505050565b60008351612755818460208801612f21565b7f4572726f72280000000000000000000000000000000000000000000000000000908301908152835161268b816006840160208801612f21565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152928516604085015293166060830152608082019290925260a081019190915260c00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8616825260606020830152602085016128ba606084016128b58389612332565b612585565b6128c48187612eb1565b90506128d36080840182612585565b506128e16040860186612eb1565b6128ee60a0840182612585565b506128fc6060860186612eb1565b61290960c0840182612585565b50608085013560e083015261010060a08601358184015260c086013561012084015261293860e0870187612ebe565b8261014086015261294e6101608601828461259f565b92505050828103604084015261224581858761259f565b6000602082528251806020840152612984816040850160208701612f21565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526012908201527f436c61696d20746f6b656e206973204554480000000000000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526014908201527f455448206465706f7369742072656a6563746564000000000000000000000000604082015260600190565b60208082526011908201527f496e76616c6964206d73672e76616c7565000000000000000000000000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f496e636f727265637420434849206275726e20666c6167730000000000000000604082015260600190565b6020808252601b908201527f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000604082015260600190565b6020808252601a908201527f4d696e2072657475726e2073686f756c64206e6f742062652030000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f4552433230206f7065726174696f6e20646964206e6f74207375636365656400604082015260600190565b60208082526017908201527f646174612073686f756c64206265206e6f74207a65726f000000000000000000604082015260600190565b60208082526015908201527f496e76616c69642072657665727420726561736f6e0000000000000000000000604082015260600190565b60208082526015908201527f6c6f772d6c6576656c2063616c6c206661696c65640000000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612e82578283fd5b83018035915067ffffffffffffffff821115612e9c578283fd5b6020019150368190038213156122eb57600080fd5b60008235611ccd81612f4d565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612ef2578283fd5b830160208101925035905067ffffffffffffffff811115612f1257600080fd5b8036038313156122eb57600080fd5b60005b83811015612f3c578181015183820152602001612f24565b83811115611b0e5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114612f6f57600080fd5b5056fea264697066735822122053d248c414dbc03456cea7326e25d10f4bcbf3bf68f355488fc1f7cf8c0d2c3b64736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061009a5760003560e01c80637c025200116100695780638da5cb5b1161004e5780638da5cb5b1461019f578063a1251d75146101c1578063f2fde38b146101d4576100e4565b80637c0252001461016957806383197ef01461018a576100e4565b80632e95b6c8146100e95780636c4a483e14610112578063715018a61461013457806378e3214f14610149576100e4565b366100e457333214156100e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612a81565b60405180910390fd5b005b600080fd5b6100fc6100f736600461244f565b6101f4565b604051610109919061278f565b60405180910390f35b610125610120366004612379565b610715565b60405161010993929190612e38565b34801561014057600080fd5b506100e2610ab6565b34801561015557600080fd5b506100e2610164366004612424565b610b98565b61017c610177366004612379565b610c30565b604051610109929190612e2a565b34801561019657600080fd5b506100e2611190565b3480156101ab57600080fd5b506101b4611206565b6040516101099190612798565b6100fc6101cf3660046124b7565b611222565b3480156101e057600080fd5b506100e26101ef36600461233d565b611249565b600061032f565b3d6000803e3d6000fd5b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c200000000000000000000000000000000000000000000000000000000060205280604052816000fd5b60007f0902f1ac000000000000000000000000000000000000000000000000000000008252604082600484875afa61028d5761028d6101fb565b81516020830151861561029c57905b7f022c0d9f000000000000000000000000000000000000000000000000000000008452878502633b9aca0092909202820191020490508480156102eb57816004840152600060248401526102f9565b600060048401528160248401525b50866044830152608060648301526000608483015260008060a4846000885af1610325576103256101fb565b9695505050505050565b60405160c0810160405260046064350180356020820191508060200282019050813589600081146103ef5734156103885761038860557c11696e76616c6964206d73672e76616c75650000000000000000000000610205565b7f23b872dd00000000000000000000000000000000000000000000000000000000855233600486015273ffffffffffffffffffffffffffffffffffffffff8216602486015289604486015260008060648760008f5af16103ea576103ea6101fb565b6104db565b348a1461041e5761041e60557c11696e76616c6964206d73672e76616c75650000000000000000000000610205565b7fd0e30db00000000000000000000000000000000000000000000000000000000085526000806004878d7342000000000000000000000000000000000000065af161046b5761046b6101fb565b7fa9059cbb00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff8216600486015289602486015260008060448760007342000000000000000000000000000000000000065af16104db576104db6101fb565b50889450602083015b8281101561057357803561056773ffffffffffffffffffffffffffffffffffffffff821677ffffffff0000000000000000000000000000000000000000851660a01c7f8000000000000000000000000000000000000000000000000000000000000000861673ffffffffffffffffffffffffffffffffffffffff87168b8b610253565b965091506020016104e4565b507f400000000000000000000000000000000000000000000000000000000000000081168015610671576106003077ffffffff0000000000000000000000000000000000000000841660a01c7f8000000000000000000000000000000000000000000000000000000000000000851673ffffffffffffffffffffffffffffffffffffffff86168a8a610253565b95507f2e1a7d4d00000000000000000000000000000000000000000000000000000000855285600486015260008060248760007342000000000000000000000000000000000000065af1610656576106566101fb565b60008060008089335af161066c5761066c6101fb565b6106d7565b6106d43377ffffffff0000000000000000000000000000000000000000841660a01c7f8000000000000000000000000000000000000000000000000000000000000000851673ffffffffffffffffffffffffffffffffffffffff86168a8a610253565b95505b50505050508381101561070c5761070c605a7c164d696e2072657475726e206e6f742072656163686564000000000000610205565b95945050505050565b6000806000805a9050600060c08801356008161561073457503361077a565b60c08801356010161561074857503261077a565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612b83565b600060603073ffffffffffffffffffffffffffffffffffffffff16637c02520060e01b8c8c8c8c6040516024016107b4949392919061287e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161083d9190612623565b600060405180830381855af49150503d8060008114610878576040519150601f19603f3d011682016040523d82523d6000602084013e61087d565b606091505b509150915081156108a4578080602001905181019061089c9190612562565b50965061094e565b34156108d85760405133903480156108fc02916000818181858888f193505050501580156108d6573d6000803e3d6000fd5b505b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa610938826040518060400160405280600d81526020017f53776170206661696c65643a2000000000000000000000000000000000000000815250611396565b6040516109459190612965565b60405180910390a15b6000808c73ffffffffffffffffffffffffffffffffffffffff16631d97832e6109785a8990611769565b8e60c0013560003690506040518463ffffffff1660e01b81526004016109a093929190612e38565b604080518083038186803b1580156109b757600080fd5b505afa1580156109cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ef91906123f7565b90925090508015610aa3576040517f079d229f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063079d229f90610a4e9088908590600401612827565b602060405180830381600087803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa0919061254a565b96505b5a97505050505050509450945094915050565b610abe6117ab565b73ffffffffffffffffffffffffffffffffffffffff16610adc611206565b73ffffffffffffffffffffffffffffffffffffffff1614610b29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c85565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b610ba06117ab565b73ffffffffffffffffffffffffffffffffffffffff16610bbe611206565b73ffffffffffffffffffffffffffffffffffffffff1614610c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c85565b610c2c73ffffffffffffffffffffffffffffffffffffffff831633836117af565b5050565b60008060008560a0013511610c71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612bf1565b82610ca8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612cf1565b60c08501356000610cbc602088018861233d565b90506000610cd06040890160208a0161233d565b90506002831615610d4857610cfa8273ffffffffffffffffffffffffffffffffffffffff166118b2565b610d05576000610d0b565b87608001355b3411610d43576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612ab8565b610db0565b610d678273ffffffffffffffffffffffffffffffffffffffff166118b2565b610d72576000610d78565b87608001355b3414610db0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612ab8565b6004831615610e6157610dd88273ffffffffffffffffffffffffffffffffffffffff166118b2565b15610e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d9906129b6565b610e2a8260808a0135610e2560e08c018c612e4e565b611905565b610e6133610e3e60608b0160408c0161233d565b73ffffffffffffffffffffffffffffffffffffffff8516919060808c0135611b14565b600080610e7460808b0160608c0161233d565b73ffffffffffffffffffffffffffffffffffffffff1614610ea457610e9f60808a0160608b0161233d565b610ea6565b335b9050600060018516610eb9576000610ed9565b610ed973ffffffffffffffffffffffffffffffffffffffff851633611bb7565b90506000610efd73ffffffffffffffffffffffffffffffffffffffff851684611bb7565b9050600060608d73ffffffffffffffffffffffffffffffffffffffff163463d9c4535760e01b8e8e604051602001610f37939291906125e7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610f6f91612623565b60006040518083038185875af1925050503d8060008114610fac576040519150601f19603f3d011682016040523d82523d6000602084013e610fb1565b606091505b50915091508161102d57610ffa816040518060400160405280601281526020017f63616c6c4279746573206661696c65643a200000000000000000000000000000815250611396565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d99190612965565b505060808b013561105e8261105873ffffffffffffffffffffffffffffffffffffffff881687611bb7565b90611769565b985060018716156110fe576110a361108c73ffffffffffffffffffffffffffffffffffffffff881633611bb7565b6110588e6080013586611c8e90919063ffffffff16565b90506110b360a08d013582611cd4565b6110c18a60808f0135611cd4565b10156110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612bba565b61113c565b8b60a0013589101561113c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612bba565b7fd6d4f5681c246c9f42c203e287975af1601f8df8035a9251f79aab5c8f09e2f833878787858e604051611175969594939291906127e0565b60405180910390a15a97505050505050505094509492505050565b6111986117ab565b73ffffffffffffffffffffffffffffffffffffffff166111b6611206565b73ffffffffffffffffffffffffffffffffffffffff1614611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c85565b33ff5b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600061123088888585611905565b61123d88888888886101f4565b98975050505050505050565b6112516117ab565b73ffffffffffffffffffffffffffffffffffffffff1661126f611206565b73ffffffffffffffffffffffffffffffffffffffff16146112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c85565b73ffffffffffffffffffffffffffffffffffffffff8116611309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d9906129ed565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060448351101580156113fd5750826000815181106113b257fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0800000000000000000000000000000000000000000000000000000000000000145b801561145c57508260018151811061141157fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fc300000000000000000000000000000000000000000000000000000000000000145b80156114bb57508260028151811061147057fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7900000000000000000000000000000000000000000000000000000000000000145b801561151a5750826003815181106114cf57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fa000000000000000000000000000000000000000000000000000000000000000145b15611590576060604484019050805160440184511015611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612d28565b8281604051602001611579929190612743565b604051602081830303815290604052915050611763565b825160241480156115f45750826000815181106115a957fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4e00000000000000000000000000000000000000000000000000000000000000145b801561165357508260018151811061160857fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4800000000000000000000000000000000000000000000000000000000000000145b80156116b257508260028151811061166757fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7b00000000000000000000000000000000000000000000000000000000000000145b80156117115750826003815181106116c657fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7100000000000000000000000000000000000000000000000000000000000000145b156117365760248301518261172582611d28565b60405160200161157992919061263f565b8161174084611d4e565b6040516020016117519291906126c1565b60405160208183030381529060405290505b92915050565b6000828211156117a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612aef565b50900390565b3390565b80156118ad576117be836118b2565b1561180c5760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015611806573d6000803e3d6000fd5b506118ad565b6118ad8363a9059cbb60e01b848460405160240161182b929190612827565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f89565b505050565b600073ffffffffffffffffffffffffffffffffffffffff82161580611763575073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b60e0811415611b0e57600060608573ffffffffffffffffffffffffffffffffffffffff1663d505accf60e01b8585604051602001611945939291906125e7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261197d91612623565b6000604051808303816000865af19150503d80600081146119ba576040519150601f19603f3d011682016040523d82523d6000602084013e6119bf565b606091505b509150915081611b0b576060611a0a826040518060400160405280601481526020017f5065726d69742063616c6c206661696c65643a20000000000000000000000000815250611396565b9050858773ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611a489291906127b9565b60206040518083038186803b158015611a6057600080fd5b505afa158015611a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a98919061254a565b1015611ad257806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d99190612965565b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa81604051611b019190612965565b60405180910390a1505b50505b50505050565b611b0e846323b872dd60e01b858585604051602401611b359392919061284d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612081565b6000611bc2836118b2565b15611be5575073ffffffffffffffffffffffffffffffffffffffff811631611763565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190611c37908590600401612798565b60206040518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c87919061254a565b9050611763565b600082820183811015611ccd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612a4a565b9392505050565b600082611ce357506000611763565b82820282848281611cf057fe5b0414611ccd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612c28565b606061176382604051602001611d3e919061278f565b6040516020818303038152906040525b80516060907f303132333435363738396162636465660000000000000000000000000000000090829060029081020167ffffffffffffffff81118015611d9357600080fd5b506040519080825280601f01601f191660200182016040528015611dbe576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611def57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611e4c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b8451811015611f8157826004868381518110611e9657fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c60f81c60108110611ecc57fe5b1a60f81b828260020260020181518110611ee257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535082858281518110611f1e57fe5b60209101015160f81c600f1660108110611f3457fe5b1a60f81b828260020260030181518110611f4a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611e7e565b509392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051611fb29190612623565b6000604051808303816000865af19150503d8060008114611fef576040519150601f19603f3d011682016040523d82523d6000602084013e611ff4565b606091505b509150915081612030576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612d5f565b805115611b0e578080602001905181019061204b9190612359565b611b0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612cba565b60606120e3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121379092919063ffffffff16565b8051909150156118ad57808060200190518101906121019190612359565b6118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612dcd565b6060612146848460008561214e565b949350505050565b60608247101561218a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612b26565b61219385612250565b6121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d990612d96565b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516121f39190612623565b60006040518083038185875af1925050503d8060008114612230576040519150601f19603f3d011682016040523d82523d6000602084013e612235565b606091505b5091509150612245828286612256565b979650505050505050565b3b151590565b60608315612265575081611ccd565b8251156122755782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d99190612965565b60008083601f8401126122ba578182fd5b50813567ffffffffffffffff8111156122d1578182fd5b60208301915083602080830285010111156122eb57600080fd5b9250929050565b60008083601f840112612303578182fd5b50813567ffffffffffffffff81111561231a578182fd5b6020830191508360208285010111156122eb57600080fd5b803561176381612f4d565b60006020828403121561234e578081fd5b8135611ccd81612f4d565b60006020828403121561236a578081fd5b81518015158114611ccd578182fd5b6000806000806060858703121561238e578283fd5b843561239981612f4d565b9350602085013567ffffffffffffffff808211156123b5578485fd5b9086019061010082890312156123c9578485fd5b909350604086013590808211156123de578384fd5b506123eb878288016122f2565b95989497509550505050565b60008060408385031215612409578182fd5b825161241481612f4d565b6020939093015192949293505050565b60008060408385031215612436578182fd5b823561244181612f4d565b946020939093013593505050565b600080600080600060808688031215612466578081fd5b853561247181612f4d565b94506020860135935060408601359250606086013567ffffffffffffffff81111561249a578182fd5b6124a6888289016122a9565b969995985093965092949392505050565b600080600080600080600060a0888a0312156124d1578182fd5b87356124dc81612f4d565b96506020880135955060408801359450606088013567ffffffffffffffff80821115612506578384fd5b6125128b838c016122a9565b909650945060808a013591508082111561252a578384fd5b506125378a828b016122f2565b989b979a50959850939692959293505050565b60006020828403121561255b578081fd5b5051919050565b60008060408385031215612574578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60007fffffffff000000000000000000000000000000000000000000000000000000008516825282846004840137910160040190815292915050565b60008251612635818460208701612f21565b9190910192915050565b60008351612651818460208801612f21565b7f50616e6963280000000000000000000000000000000000000000000000000000908301908152835161268b816006840160208801612f21565b7f290000000000000000000000000000000000000000000000000000000000000060069290910191820152600701949350505050565b600083516126d3818460208801612f21565b7f556e6b6e6f776e28000000000000000000000000000000000000000000000000908301908152835161270d816008840160208801612f21565b7f290000000000000000000000000000000000000000000000000000000000000060089290910191820152600901949350505050565b60008351612755818460208801612f21565b7f4572726f72280000000000000000000000000000000000000000000000000000908301908152835161268b816006840160208801612f21565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152928516604085015293166060830152608082019290925260a081019190915260c00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8616825260606020830152602085016128ba606084016128b58389612332565b612585565b6128c48187612eb1565b90506128d36080840182612585565b506128e16040860186612eb1565b6128ee60a0840182612585565b506128fc6060860186612eb1565b61290960c0840182612585565b50608085013560e083015261010060a08601358184015260c086013561012084015261293860e0870187612ebe565b8261014086015261294e6101608601828461259f565b92505050828103604084015261224581858761259f565b6000602082528251806020840152612984816040850160208701612f21565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526012908201527f436c61696d20746f6b656e206973204554480000000000000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526014908201527f455448206465706f7369742072656a6563746564000000000000000000000000604082015260600190565b60208082526011908201527f496e76616c6964206d73672e76616c7565000000000000000000000000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f496e636f727265637420434849206275726e20666c6167730000000000000000604082015260600190565b6020808252601b908201527f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000604082015260600190565b6020808252601a908201527f4d696e2072657475726e2073686f756c64206e6f742062652030000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f4552433230206f7065726174696f6e20646964206e6f74207375636365656400604082015260600190565b60208082526017908201527f646174612073686f756c64206265206e6f74207a65726f000000000000000000604082015260600190565b60208082526015908201527f496e76616c69642072657665727420726561736f6e0000000000000000000000604082015260600190565b60208082526015908201527f6c6f772d6c6576656c2063616c6c206661696c65640000000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612e82578283fd5b83018035915067ffffffffffffffff821115612e9c578283fd5b6020019150368190038213156122eb57600080fd5b60008235611ccd81612f4d565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612ef2578283fd5b830160208101925035905067ffffffffffffffff811115612f1257600080fd5b8036038313156122eb57600080fd5b60005b83811015612f3c578181015183820152602001612f24565b83811115611b0e5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114612f6f57600080fd5b5056fea264697066735822122053d248c414dbc03456cea7326e25d10f4bcbf3bf68f355488fc1f7cf8c0d2c3b64736f6c634300060c0033
Deployed Bytecode Sourcemap
50456:4938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43989:10;44003:9;43989:23;;43981:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50456:4938;;;;;44401:5924;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51355:1412;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;13028:148::-;;;;;;;;;;;;;:::i;55176:126::-;;;;;;;;;;-1:-1:-1;55176:126:0;;;;;:::i;:::-;;:::i;52775:2393::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;55310:81::-;;;;;;;;;;;;;:::i;12377:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44053:340::-;;;;;;:::i;:::-;;:::i;13331:244::-;;;;;;;;;;-1:-1:-1;13331:244:0;;;;;:::i;:::-;;:::i;44401:5924::-;44568:20;44669:137;;;44729:16;44726:1;44723;44708:38;44774:16;44771:1;44764:27;44822:308;44885:66;44882:1;44875:77;44983:66;44977:4;44970:80;45081:1;45075:4;45068:15;45111:3;45108:1;45101:14;45146:1403;;45257:39;45247:8;45240:57;45374:4;45364:8;45359:3;45349:8;45343:4;45336:5;45325:54;45315:2;;45404:10;;:::i;:::-;45475:8;45469:15;45538:4;45528:8;45524:19;45518:26;45565:8;45562:2;;;45650:8;45562:2;45889:35;45872:53;;45739:26;;;45837:12;45823:27;;;;45814:37;;45794:18;;45790:62;;-1:-1:-1;45950:8:0;45976:133;;;;46186:3;46179:4;46169:8;46165:19;46158:32;46240:1;46233:4;46223:8;46219:19;46212:30;45943:318;;45976:133;46034:1;46027:4;46017:8;46013:19;46006:30;46086:3;46079:4;46069:8;46065:19;46058:32;45943:318;;46307:3;46300:4;46290:8;46286:19;46279:32;46357:4;46350;46340:8;46336:19;46329:33;46408:1;46401:4;46391:8;46387:19;46380:30;46478:1;46475;46469:4;46459:8;46456:1;46450:4;46443:5;46438:42;46428:2;;46505:10;;:::i;:::-;45221:1328;;;;;;;;:::o;:::-;46587:4;46581:11;46633:4;46623:8;46619:19;46613:4;46606:33;46698:3;46691:4;46678:18;46674:28;46751:11;46738:25;46809:4;46796:11;46792:22;46777:37;;46873:14;46867:4;46863:25;46850:11;46846:43;46828:61;;46931:11;46918:25;46964:8;46991:1;46986:750;;;;47780:11;47777:2;;;47815:90;47900:4;47832:66;47815:90;:::i;:::-;47985:31;47975:8;47968:49;48062:8;48056:3;48046:8;48042:18;48035:36;48130:13;48121:7;48117:27;48110:4;48100:8;48096:19;48089:56;48191:6;48184:4;48174:8;48170:19;48163:35;48270:1;48267;48261:4;48251:8;48248:1;48238:8;48231:5;48226:46;48216:2;;48297:10;;:::i;:::-;46957:1384;;46986:750;47033:11;47025:6;47022:23;47012:2;;47070:90;47155:4;47087:66;47070:90;:::i;:::-;47240:30;47230:8;47223:48;47344:1;47341;47336:3;47326:8;47318:6;47311:5;47304;47299:47;47289:2;;47371:10;;:::i;:::-;47437:32;47427:8;47420:50;47528:13;47519:7;47515:27;47509:3;47499:8;47495:18;47488:55;47589:6;47582:4;47572:8;47568:19;47561:35;47665:1;47662;47656:4;47646:8;47643:1;47636:5;47629;47624:43;47614:2;;47692:10;;:::i;:::-;46957:1384;48373:6;48357:22;;48426:4;48413:11;48409:22;48395:545;48439:14;48436:1;48433:21;48395:545;;;48526:1;48513:15;48564:319;48850:13;48837:11;48833:31;48793:15;48784:7;48780:29;48761:17;48757:53;48720:13;48711:7;48707:27;48670:13;48661:7;48657:27;48622:12;48591:8;48564:319;:::i;:::-;48548:335;-1:-1:-1;48914:11:0;-1:-1:-1;48468:4:0;48461:12;48395:545;;;-1:-1:-1;48976:10:0;48963:24;;49001:353;;;;49411:297;49680:9;49640:15;49631:7;49627:29;49608:17;49604:53;49567:13;49558:7;49554:27;49517:13;49508:7;49504:27;49469:12;49438:8;49411:297;:::i;:::-;49395:313;;49745:31;49735:8;49728:49;49823:12;49816:4;49806:8;49802:19;49795:41;49905:1;49902;49896:4;49886:8;49883:1;49876:5;49869;49864:43;49854:2;;49932:10;;:::i;:::-;50036:1;50033;50030;50027;50013:12;50003:8;49996:5;49991:47;49981:2;;50063:10;;:::i;:::-;48956:1151;;49001:353;49043:296;49312:8;49272:15;49263:7;49259:29;49240:17;49236:53;49199:13;49190:7;49186:27;49149:13;49140:7;49136:27;49101:12;49070:8;49043:296;:::i;:::-;49027:312;;48956:1151;;;;;;50143:9;50129:12;50126:27;50123:2;;;50173:90;50258:4;50190:66;50173:90;:::i;:::-;44610:5708;;;;;;;:::o;51355:1412::-;51547:20;51569:15;51586:16;51620:18;51641:9;51620:30;-1:-1:-1;51663:17:0;51708:10;;;;50829:4;51708:34;:39;51704:299;;-1:-1:-1;51776:10:0;51704:299;;;51808:10;;;;50888:4;51808:33;:38;51804:199;;-1:-1:-1;51875:9:0;51804:199;;;51957:34;;;;;;;;;;:::i;51804:199::-;52076:12;52090:23;52125:4;52117:26;;52167:18;;;52187:6;52195:4;52201;;52144:62;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52117:90;;;;52144:62;52117:90;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52075:132;;;;52222:7;52218:296;;;52275:10;52264:42;;;;;;;;;;;;:::i;:::-;-1:-1:-1;52246:60:0;-1:-1:-1;52218:296:0;;;52343:9;:13;52339:84;;52377:30;;:10;;52397:9;52377:30;;;;;;;;;52397:9;52377:10;:30;;;;;;;;;;;;;;;;;;;;;52339:84;52442:60;52448:53;52473:10;52448:53;;;;;;;;;;;;;;;;;:24;:53::i;:::-;52442:60;;;;;;:::i;:::-;;;;;;;;52218:296;52527:8;52537:14;52555:6;:19;;;52575:25;52590:9;52575:10;;:14;:25::i;:::-;52602:4;:10;;;52614:8;;:15;;52555:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52526:104;;-1:-1:-1;52526:104:0;-1:-1:-1;52645:10:0;;52641:89;;52683:35;;;;;:16;;;;;;:35;;52700:9;;52711:6;;52683:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52672:46;;52641:89;52750:9;52740:19;;51355:1412;;;;;;;;;;;;;;:::o;13028:148::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;13135:1:::1;13119:6:::0;;13098:40:::1;::::0;::::1;13119:6:::0;;::::1;::::0;13098:40:::1;::::0;13135:1;;13098:40:::1;13166:1;13149:19:::0;;;::::1;::::0;;13028:148::o;55176:126::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;55257:37:::1;:17;::::0;::::1;55275:10;55287:6:::0;55257:17:::1;:37::i;:::-;55176:126:::0;;:::o;52775:2393::-;52957:20;52979:15;53043:1;53020:4;:20;;;:24;53012:63;;;;;;;;;;;;:::i;:::-;53094:15;53086:51;;;;;;;;;;;;:::i;:::-;53166:10;;;;53150:13;53205;;;;53166:4;53205:13;:::i;:::-;53187:31;-1:-1:-1;53229:15:0;53247:13;;;;;;;;:::i;:::-;53229:31;-1:-1:-1;50717:4:0;53277:27;;:32;53273:255;;53347:16;:8;:14;;;:16::i;:::-;:34;;53380:1;53347:34;;;53366:4;:11;;;53347:34;53334:9;:48;53326:78;;;;;;;;;;;;:::i;:::-;53273:255;;;53459:16;:8;:14;;;:16::i;:::-;:34;;53492:1;53459:34;;;53478:4;:11;;;53459:34;53445:9;:49;53437:79;;;;;;;;;;;;:::i;:::-;50769:4;53544:21;;:26;53540:248;;53596:16;:8;:14;;;:16::i;:::-;53595:17;53587:48;;;;;;;;;;;;:::i;:::-;53650:43;53658:8;53668:11;;;;53681;;;;53668:4;53681:11;:::i;:::-;53650:7;:43::i;:::-;53708:68;53734:10;53746:16;;;;;;;;:::i;:::-;53708:25;;;;:68;53764:11;;;;53708:25;:68::i;:::-;53800:19;;53823:16;;;;;;;;:::i;:::-;:30;;;53822:64;;53870:16;;;;;;;;:::i;:::-;53822:64;;;53857:10;53822:64;53800:86;-1:-1:-1;53897:25:0;50659:4;53926:21;;53925:68;;53992:1;53925:68;;;53956:33;:21;;;53978:10;53956:21;:33::i;:::-;53897:96;-1:-1:-1;54004:25:0;54032:34;:21;;;54054:11;54032:21;:34::i;:::-;54004:62;;54159:12;54173:19;54204:6;54196:20;;54224:9;54252:25;;;54279:4;;54235:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;54196:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54158:127;;;;54305:7;54300:111;;54340:54;54365:6;54340:54;;;;;;;;;;;;;;;;;:24;:54::i;:::-;54333:62;;;;;;;;;;;:::i;54300:111::-;-1:-1:-1;;54456:11:0;;;;54493:57;54532:17;54493:34;:21;;;54515:11;54493:21;:34::i;:::-;:38;;:57::i;:::-;54478:72;-1:-1:-1;50659:4:0;54567:21;;:26;54563:380;;54624:73;54663:33;:21;;;54685:10;54663:21;:33::i;:::-;54624:34;54646:4;:11;;;54624:17;:21;;:34;;;;:::i;:73::-;54610:87;-1:-1:-1;54753:37:0;:20;;;;54610:87;54753:24;:37::i;:::-;54720:29;:12;54737:11;;;;54720:16;:29::i;:::-;:70;;54712:110;;;;;;;;;;;;:::i;:::-;54563:380;;;54879:4;:20;;;54863:12;:36;;54855:76;;;;;;;;;;;;:::i;:::-;54960:168;54982:10;55007:8;55030;55053:11;55079;55105:12;54960:168;;;;;;;;;;;:::i;:::-;;;;;;;;55151:9;55141:19;;52775:2393;;;;;;;;;;;;;;:::o;55310:81::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;55372:10:::1;55359:24;12377:87:::0;12423:7;12450:6;;;12377:87;:::o;44053:340::-;44258:20;44291:33;44299:8;44309:6;44317;;44291:7;:33::i;:::-;44342:43;44350:8;44360:6;44368:9;44379:5;;44342:7;:43::i;:::-;44335:50;44053:340;-1:-1:-1;;;;;;;;44053:340:0:o;13331:244::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;13420:22:::1;::::0;::::1;13412:73;;;;;;;;;;;;:::i;:::-;13522:6;::::0;;13501:38:::1;::::0;::::1;::::0;;::::1;::::0;13522:6;::::1;::::0;13501:38:::1;::::0;::::1;13550:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;13331:244::o;38678:1911::-;38757:13;39042:2;39027:4;:11;:17;;:38;;;;;39048:4;39053:1;39048:7;;;;;;;;;;;;;;;:17;;39027:38;:59;;;;;39069:4;39074:1;39069:7;;;;;;;;;;;;;;;:17;;39027:59;:80;;;;;39090:4;39095:1;39090:7;;;;;;;;;;;;;;;:17;;39027:80;:101;;;;;39111:4;39116:1;39111:7;;;;;;;;;;;;;;;:17;;39027:101;39023:1476;;;39145:20;39361:2;39355:4;39351:13;39341:23;;39863:6;39857:20;39852:2;:25;39837:4;:11;:40;;39829:74;;;;;;;;;;;;:::i;:::-;39949:6;39967;39932:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39918:62;;;;;39023:1476;40074:4;:11;40089:2;40074:17;:38;;;;;40095:4;40100:1;40095:7;;;;;;;;;;;;;;;:17;;40074:38;:59;;;;;40116:4;40121:1;40116:7;;;;;;;;;;;;;;;:17;;40074:59;:80;;;;;40137:4;40142:1;40137:7;;;;;;;;;;;;;;;:17;;40074:80;:101;;;;;40158:4;40163:1;40158:7;;;;;;;;;;;;;;;:17;;40074:101;40070:429;;;40386:2;40376:13;;40370:20;40450:6;40468:12;40370:20;40468:6;:12::i;:::-;40433:53;;;;;;;;;:::i;40070:429::-;40542:6;40562:12;40569:4;40562:6;:12::i;:::-;40525:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40511:70;;38678:1911;;;;;:::o;19668:158::-;19726:7;19759:1;19754;:6;;19746:49;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19813:5:0;;;19668:158::o;10904:106::-;10992:10;10904:106;:::o;36333:340::-;36428:10;;36424:242;;36459:12;36465:5;36459;:12::i;:::-;36455:200;;;36492:19;;:11;;;;:19;;;;;36504:6;;36492:19;;;;36504:6;36492:11;:19;;;;;;;;;;;;;;;;;;;;;36455:200;;;36552:87;36572:5;36602:23;;;36627:2;36631:6;36579:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36552:19;:87::i;:::-;36333:340;;;:::o;35950:133::-;36002:4;36027:22;;;;;:47;;-1:-1:-1;36053:21:0;;;35842:42;36053:21;36019:56;35950:133;-1:-1:-1;;35950:133:0:o;41606:671::-;41717:6;41700:23;;41696:574;;;41805:12;41819:19;41850:5;41842:19;;41879:28;;;41909:6;;41862:54;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;41842:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41804:113;;;;41937:7;41932:327;;41965:20;41988:56;42013:6;41988:56;;;;;;;;;;;;;;;;;:24;:56::i;:::-;41965:79;;42112:6;42067:5;:15;;;42083:10;42103:4;42067:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;42063:181;;;42150:6;42143:14;;;;;;;;;;;:::i;42063:181::-;42211:13;42217:6;42211:13;;;;;;:::i;:::-;;;;;;;;41932:327;;41696:574;;;41606:671;;;;:::o;32771:205::-;32872:96;32892:5;32922:27;;;32951:4;32957:2;32961:5;32899:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32872:19;:96::i;36091:234::-;36167:7;36191:12;36197:5;36191;:12::i;:::-;36187:131;;;-1:-1:-1;36227:15:0;;;;36220:22;;36187:131;36282:24;;;;;:15;;;;;;:24;;36298:7;;36282:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36275:31;;;;19206:179;19264:7;19296:5;;;19320:6;;;;19312:46;;;;;;;;;;;;:::i;:::-;19376:1;19206:179;-1:-1:-1;;;19206:179:0:o;20085:220::-;20143:7;20167:6;20163:20;;-1:-1:-1;20182:1:0;20175:8;;20163:20;20206:5;;;20210:1;20206;:5;:1;20230:5;;;;;:10;20222:56;;;;;;;;;;;;:::i;40597:124::-;40649:13;40682:31;40706:5;40689:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;40729:466;40908:11;;40785:13;;40811:53;;40785:13;;40922:1;40908:15;;;40904:19;40894:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40894:30:0;;40875:49;;40935:12;:3;40939:1;40935:6;;;;;;;;;;;:12;;;;;;;;;;;40958;:3;40962:1;40958:6;;;;;;;;;;;:12;;;;;;;;;;;40986:9;40981:178;41005:4;:11;41001:1;:15;40981:178;;;41055:8;41081:1;41070:4;41075:1;41070:7;;;;;;;;;;;;;;:12;;:7;41064:19;41055:29;;;;;;;;;;41038:3;41046:1;41042;:5;41050:1;41042:9;41038:14;;;;;;;;;;;:46;;;;;;;;;;;41116:8;41131:4;41136:1;41131:7;;;;;;;;;;;;;;;41141:4;41125:21;41116:31;;;;;;;;;;41099:3;41107:1;41103;:5;41111:1;41103:9;41099:14;;;;;;;;;;;:48;;;;;;;;;;-1:-1:-1;41018:3:0;;40981:178;;;-1:-1:-1;41183:3:0;40729:466;-1:-1:-1;;;40729:466:0:o;37317:435::-;37459:12;37473:23;37508:5;37500:19;;37520:4;37500:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37458:67;;;;37544:7;37536:41;;;;;;;;;;;;:::i;:::-;37594:17;;:21;37590:155;;37678:10;37667:30;;;;;;;;;;;;:::i;:::-;37659:74;;;;;;;;;;;;:::i;34891:761::-;35315:23;35341:69;35369:4;35341:69;;;;;;;;;;;;;;;;;35349:5;35341:27;;;;:69;;;;;:::i;:::-;35425:17;;35315:95;;-1:-1:-1;35425:21:0;35421:224;;35567:10;35556:30;;;;;;;;;;;;:::i;:::-;35548:85;;;;;;;;;;;;:::i;27573:195::-;27676:12;27708:52;27730:6;27738:4;27744:1;27747:12;27708:21;:52::i;:::-;27701:59;27573:195;-1:-1:-1;;;;27573:195:0:o;28625:530::-;28752:12;28810:5;28785:21;:30;;28777:81;;;;;;;;;;;;:::i;:::-;28877:18;28888:6;28877:10;:18::i;:::-;28869:60;;;;;;;;;;;;:::i;:::-;29003:12;29017:23;29044:6;:11;;29064:5;29072:4;29044:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29002:75;;;;29095:52;29113:7;29122:10;29134:12;29095:17;:52::i;:::-;29088:59;28625:530;-1:-1:-1;;;;;;;28625:530:0:o;24655:422::-;25022:20;25061:8;;;24655:422::o;31165:742::-;31280:12;31309:7;31305:595;;;-1:-1:-1;31340:10:0;31333:17;;31305:595;31454:17;;:21;31450:439;;31717:10;31711:17;31778:15;31765:10;31761:2;31757:19;31750:44;31665:148;31860:12;31853:20;;;;;;;;;;;:::i;160:352:-1:-;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;-1:-1;328:20;;368:18;357:30;;354:2;;;-1:-1;;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;434:4;;469:6;465:17;426:6;451:32;;448:41;445:2;;;502:1;;492:12;445:2;250:262;;;;;:::o;669:336::-;;;783:3;776:4;768:6;764:17;760:27;750:2;;-1:-1;;791:12;750:2;-1:-1;821:20;;861:18;850:30;;847:2;;;-1:-1;;883:12;847:2;927:4;919:6;915:17;903:29;;978:3;927:4;958:17;919:6;944:32;;941:41;938:2;;;995:1;;985:12;1375:158;1456:20;;1481:47;1456:20;1481:47;:::i;2043:241::-;;2147:2;2135:9;2126:7;2122:23;2118:32;2115:2;;;-1:-1;;2153:12;2115:2;85:6;72:20;97:33;124:5;97:33;:::i;2291:257::-;;2403:2;2391:9;2382:7;2378:23;2374:32;2371:2;;;-1:-1;;2409:12;2371:2;601:6;595:13;41898:5;39268:13;39261:21;41876:5;41873:32;41863:2;;-1:-1;;41909:12;2555:829;;;;;2776:2;2764:9;2755:7;2751:23;2747:32;2744:2;;;-1:-1;;2782:12;2744:2;1122:6;1109:20;1134:62;1190:5;1134:62;:::i;:::-;2834:92;-1:-1;2991:2;2976:18;;2963:32;3015:18;3004:30;;;3001:2;;;-1:-1;;3037:12;3001:2;3123:22;;;;1710:3;1692:16;;;1688:26;1685:2;;;-1:-1;;1717:12;1685:2;3057:98;;-1:-1;3220:2;3205:18;;3192:32;;3233:30;;;3230:2;;;-1:-1;;3266:12;3230:2;;3304:64;3360:7;3351:6;3340:9;3336:22;3304:64;:::i;:::-;2738:646;;;;-1:-1;3286:82;-1:-1;;;;2738:646::o;3391:425::-;;;3536:2;3524:9;3515:7;3511:23;3507:32;3504:2;;;-1:-1;;3542:12;3504:2;1305:6;1299:13;1317:46;1357:5;1317:46;:::i;:::-;3718:2;3768:22;;;;1980:13;3594:87;;1980:13;;-1:-1;;;3498:318::o;4099:394::-;;;4234:2;4222:9;4213:7;4209:23;4205:32;4202:2;;;-1:-1;;4240:12;4202:2;1469:6;1456:20;1481:47;1522:5;1481:47;:::i;:::-;4292:77;4406:2;4445:22;;;;1832:20;;-1:-1;;;4196:297::o;4500:801::-;;;;;;4704:3;4692:9;4683:7;4679:23;4675:33;4672:2;;;-1:-1;;4711:12;4672:2;1469:6;1456:20;1481:47;1522:5;1481:47;:::i;:::-;4763:77;-1:-1;4877:2;4916:22;;1832:20;;-1:-1;4985:2;5024:22;;1832:20;;-1:-1;5121:2;5106:18;;5093:32;5145:18;5134:30;;5131:2;;;-1:-1;;5167:12;5131:2;5205:80;5277:7;5268:6;5257:9;5253:22;5205:80;:::i;:::-;4666:635;;;;-1:-1;4666:635;;-1:-1;5187:98;;;4666:635;-1:-1;;;4666:635::o;5308:1051::-;;;;;;;;5548:3;5536:9;5527:7;5523:23;5519:33;5516:2;;;-1:-1;;5555:12;5516:2;1469:6;1456:20;1481:47;1522:5;1481:47;:::i;:::-;5607:77;-1:-1;5721:2;5760:22;;1832:20;;-1:-1;5829:2;5868:22;;1832:20;;-1:-1;5965:2;5950:18;;5937:32;5989:18;5978:30;;;5975:2;;;-1:-1;;6011:12;5975:2;6049:80;6121:7;6112:6;6101:9;6097:22;6049:80;:::i;:::-;6031:98;;-1:-1;6031:98;-1:-1;6194:3;6179:19;;6166:33;;-1:-1;6208:30;;;6205:2;;;-1:-1;;6241:12;6205:2;;6279:64;6335:7;6326:6;6315:9;6311:22;6279:64;:::i;:::-;5510:849;;;;-1:-1;5510:849;;-1:-1;5510:849;;;;6261:82;;-1:-1;;;5510:849::o;6366:263::-;;6481:2;6469:9;6460:7;6456:23;6452:32;6449:2;;;-1:-1;;6487:12;6449:2;-1:-1;1980:13;;6443:186;-1:-1;6443:186::o;6636:399::-;;;6768:2;6756:9;6747:7;6743:23;6739:32;6736:2;;;-1:-1;;6774:12;6736:2;-1:-1;;1980:13;;6937:2;6987:22;;;1980:13;;;;;-1:-1;6730:305::o;7191:137::-;39868:42;39857:54;7278:45;;7272:56::o;7743:277::-;;37370:6;37365:3;37358:19;41078:6;41073:3;37407:4;37402:3;37398:14;41055:30;-1:-1;37407:4;41125:6;37402:3;41116:16;;41109:27;37407:4;41672:7;41676:2;8006:6;41656:14;41652:28;37402:3;7975:39;;7968:46;;7833:187;;;;;:::o;20239:425::-;;39366:66;7700:5;39355:78;7659:3;7652:56;41078:6;41073:3;20516:1;20511:3;20507:11;41055:30;41116:16;;20516:1;41116:16;41109:27;;;41116:16;20409:255;-1:-1;;20409:255::o;20671:271::-;;8857:5;37095:12;8968:52;9013:6;9008:3;9001:4;8994:5;8990:16;8968:52;:::i;:::-;9032:16;;;;;20805:137;-1:-1;;20805:137::o;20949:970::-;;8857:5;37095:12;8968:52;9013:6;9008:3;9001:4;8994:5;8990:16;8968:52;:::i;:::-;13682:8;9032:16;;;13662:29;;;37095:12;;8968:52;37095:12;13647:1;13710:11;;9001:4;8990:16;;8968:52;:::i;:::-;13005:3;13647:1;9032:16;;;;;;;12985:24;13028:11;;;21335:584;-1:-1;;;;21335:584::o;21926:970::-;;8857:5;37095:12;8968:52;9013:6;9008:3;9001:4;8994:5;8990:16;8968:52;:::i;:::-;15081:10;9032:16;;;15061:31;;;37095:12;;8968:52;37095:12;15046:1;15111:11;;9001:4;8990:16;;8968:52;:::i;:::-;13005:3;15046:1;9032:16;;;;;;;12985:24;13028:11;;;22312:584;-1:-1;;;;22312:584::o;22903:970::-;;8857:5;37095:12;8968:52;9013:6;9008:3;9001:4;8994:5;8990:16;8968:52;:::i;:::-;17831:8;9032:16;;;17811:29;;;37095:12;;8968:52;37095:12;17796:1;17859:11;;9001:4;8990:16;;8968:52;:::i;23880:253::-;19911:37;;;24105:2;24096:12;;23996:137::o;24140:222::-;39868:42;39857:54;;;;7278:45;;24267:2;24252:18;;24238:124::o;24369:349::-;39868:42;39857:54;;;7121:58;;39857:54;;24704:2;24689:18;;7278:45;24532:2;24517:18;;24503:215::o;24725:852::-;39868:42;39857:54;;;7121:58;;39857:54;;;25215:2;25200:18;;9160:79;39857:54;;;25312:2;25297:18;;9160:79;39857:54;;25395:2;25380:18;;7278:45;25478:3;25463:19;;19911:37;;;;25562:3;25547:19;;19911:37;;;;25028:3;25013:19;;24999:578::o;25584:365::-;39868:42;39857:54;;;;7278:45;;25935:2;25920:18;;19911:37;25755:2;25740:18;;25726:223::o;25956:444::-;39868:42;39857:54;;;7278:45;;39857:54;;;;26303:2;26288:18;;7278:45;26386:2;26371:18;;19911:37;;;;26139:2;26124:18;;26110:290::o;26747:790::-;;39868:42;9232:5;39857:54;9167:3;9160:79;27055:2;27202;27191:9;27187:18;27180:48;27202:2;18267:16;38843:12;18290:77;27055:2;27044:9;27040:18;38803:53;38843:12;18267:16;38803:53;:::i;:::-;18290:77;:::i;:::-;18433:64;18480:16;18473:5;18433:64;:::i;:::-;18413:84;;18503:77;18565:14;27044:9;18565:14;18551:12;18503:77;:::i;:::-;;18649:50;18693:4;18686:5;18682:16;18675:5;18649:50;:::i;:::-;18705:63;18753:14;27044:9;18753:14;18739:12;18705:63;:::i;:::-;;18837:50;27055:2;18874:5;18870:16;18863:5;18837:50;:::i;:::-;18893:63;18941:14;27044:9;18941:14;18927:12;18893:63;:::i;:::-;;18565:14;19057:5;19053:16;1832:20;19124:14;27044:9;19124:14;19911:37;18148:6;18753:14;19249:5;19245:16;1832:20;18148:6;27044:9;19316:14;19911:37;18941:14;19431:5;19427:16;1832:20;19498:14;27044:9;19498:14;19911:37;19591:61;19124:14;19639:5;19635:16;19628:5;19591:61;:::i;:::-;18148:6;19672:14;27044:9;19672:14;19665:38;19718:87;18139:16;27044:9;18139:16;19786:12;19772;19718:87;:::i;:::-;19827:11;;;;27416:9;27410:4;27406:20;18693:4;27390:9;27386:18;27379:48;27441:86;27522:4;27513:6;27505;27441:86;:::i;27544:310::-;;27691:2;27712:17;27705:47;9708:5;37095:12;37370:6;27691:2;27680:9;27676:18;37358:19;9802:52;9847:6;37398:14;27680:9;37398:14;27691:2;9828:5;9824:16;9802:52;:::i;:::-;41676:2;41656:14;41672:7;41652:28;9866:39;;;;37398:14;9866:39;;27662:192;-1:-1;;27662:192::o;27861:416::-;28061:2;28075:47;;;10509:2;28046:18;;;37358:19;10545:20;37398:14;;;10525:41;10585:12;;;28032:245::o;28284:416::-;28484:2;28498:47;;;10836:2;28469:18;;;37358:19;10872:34;37398:14;;;10852:55;10941:8;10927:12;;;10920:30;10969:12;;;28455:245::o;28707:416::-;28907:2;28921:47;;;11220:2;28892:18;;;37358:19;11256:29;37398:14;;;11236:50;11305:12;;;28878:245::o;29130:416::-;29330:2;29344:47;;;11556:2;29315:18;;;37358:19;11592:22;37398:14;;;11572:43;11634:12;;;29301:245::o;29553:416::-;29753:2;29767:47;;;11885:2;29738:18;;;37358:19;11921;37398:14;;;11901:40;11960:12;;;29724:245::o;29976:416::-;30176:2;30190:47;;;12211:2;30161:18;;;37358:19;12247:32;37398:14;;;12227:53;12299:12;;;30147:245::o;30399:416::-;30599:2;30613:47;;;12550:2;30584:18;;;37358:19;12586:34;37398:14;;;12566:55;12655:8;12641:12;;;12634:30;12683:12;;;30570:245::o;30822:416::-;31022:2;31036:47;;;13278:2;31007:18;;;37358:19;13314:26;37398:14;;;13294:47;13360:12;;;30993:245::o;31245:416::-;31445:2;31459:47;;;13960:2;31430:18;;;37358:19;13996:29;37398:14;;;13976:50;14045:12;;;31416:245::o;31668:416::-;31868:2;31882:47;;;14296:2;31853:18;;;37358:19;14332:28;37398:14;;;14312:49;14380:12;;;31839:245::o;32091:416::-;32291:2;32305:47;;;14631:2;32276:18;;;37358:19;14667:34;37398:14;;;14647:55;14736:3;14722:12;;;14715:25;14759:12;;;32262:245::o;32514:416::-;32714:2;32728:47;;;32699:18;;;37358:19;15397:34;37398:14;;;15377:55;15451:12;;;32685:245::o;32937:416::-;33137:2;33151:47;;;15702:2;33122:18;;;37358:19;15738:33;37398:14;;;15718:54;15791:12;;;33108:245::o;33360:416::-;33560:2;33574:47;;;16042:2;33545:18;;;37358:19;16078:25;37398:14;;;16058:46;16123:12;;;33531:245::o;33783:416::-;33983:2;33997:47;;;16374:2;33968:18;;;37358:19;16410:23;37398:14;;;16390:44;16453:12;;;33954:245::o;34206:416::-;34406:2;34420:47;;;16704:2;34391:18;;;37358:19;16740:23;37398:14;;;16720:44;16783:12;;;34377:245::o;34629:416::-;34829:2;34843:47;;;17034:2;34814:18;;;37358:19;17070:31;37398:14;;;17050:52;17121:12;;;34800:245::o;35052:416::-;35252:2;35266:47;;;17372:2;35237:18;;;37358:19;17408:34;37398:14;;;17388:55;17477:12;17463;;;17456:34;17509:12;;;35223:245::o;35704:333::-;19911:37;;;36023:2;36008:18;;19911:37;35859:2;35844:18;;35830:207::o;36044:444::-;19911:37;;;36391:2;36376:18;;19911:37;;;;36474:2;36459:18;;19911:37;36227:2;36212:18;;36198:290::o;36495:506::-;;;36630:11;36617:25;36681:48;36705:8;36689:14;36685:29;36681:48;36661:18;36657:73;36647:2;;-1:-1;;36734:12;36647:2;36761:33;;36815:18;;;-1:-1;36853:18;36842:30;;36839:2;;;-1:-1;;36875:12;36839:2;36720:4;36903:13;;-1:-1;36689:14;36935:38;;;36925:49;;36922:2;;;36987:1;;36977:12;38077:119;;85:6;72:20;97:33;124:5;97:33;:::i;38205:501::-;;;38329:3;38316:17;38373:48;38397:8;38381:14;38377:29;38373:48;38353:18;38349:73;38339:2;;-1:-1;;38426:12;38339:2;38455:33;;38412:4;38544:16;;;-1:-1;38510:19;;-1:-1;38580:18;38569:30;;38566:2;;;38612:1;;38602:12;38566:2;38659:17;38381:14;38639:38;38629:8;38625:53;38622:2;;;38691:1;;38681:12;41151:268;41216:1;41223:101;41237:6;41234:1;41231:13;41223:101;;;41304:11;;;41298:18;41285:11;;;41278:39;41259:2;41252:10;41223:101;;;41339:6;41336:1;41333:13;41330:2;;;-1:-1;;41216:1;41386:16;;41379:27;41200:219::o;41693:117::-;39868:42;41780:5;39857:54;41755:5;41752:35;41742:2;;41801:1;;41791:12;41742:2;41736:74;:::o
Swarm Source
ipfs://53d248c414dbc03456cea7326e25d10f4bcbf3bf68f355488fc1f7cf8c0d2c3b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 25.68% | $0.000053 | 33,774,229.4745 | $1,781.25 | |
| ETH | 16.74% | $119.03 | 9.7534 | $1,160.95 | |
| ETH | 14.76% | $5,486.36 | 0.1866 | $1,023.89 | |
| ETH | 8.90% | $0.999269 | 618 | $617.55 | |
| ETH | 5.98% | $0.995766 | 416.8379 | $415.07 | |
| ETH | 4.11% | $10.17 | 28.0454 | $285.22 | |
| ETH | 3.80% | $0.99967 | 263.73 | $263.64 | |
| ETH | 0.11% | $7.36 | 1.0001 | $7.36 | |
| ETH | 0.04% | $0.030278 | 100 | $3.03 | |
| ETH | 0.03% | $0.005372 | 420.1689 | $2.26 | |
| ETH | 0.03% | $0.000018 | 110,000 | $1.98 | |
| ETH | 0.01% | $0.000001 | 1,141,596 | $1.04 | |
| ETH | 0.01% | $0.014242 | 64 | $0.9115 | |
| BSC | 11.77% | $0.999194 | 816.7477 | $816.09 | |
| BSC | 4.73% | $923.68 | 0.355 | $327.94 | |
| BSC | 0.85% | <$0.000001 | 235,662,959,013.1417 | $58.9 | |
| BSC | 0.27% | $2.37 | 7.8221 | $18.54 | |
| BSC | 0.23% | $0.188192 | 83.4109 | $15.7 | |
| BSC | 0.21% | $3,092.11 | 0.00468817 | $14.5 | |
| BSC | 0.20% | $1.17 | 11.6823 | $13.62 | |
| BSC | 0.18% | $91,436.67 | 0.00013635 | $12.47 | |
| BSC | 0.15% | <$0.000001 | 42,245,471,655.7477 | $10.08 | |
| BSC | 0.14% | <$0.000001 | 12,994,881,117.2397 | $9.74 | |
| BSC | 0.13% | $0.999873 | 9.1008 | $9.1 | |
| BSC | 0.06% | $1 | 4.1596 | $4.16 | |
| BSC | 0.01% | $0.000088 | 10,000 | $0.8797 | |
| BSC | 0.01% | $0.000088 | 10,000 | $0.8797 | |
| BSC | <0.01% | $0.990607 | 0.3709 | $0.3674 | |
| BSC | <0.01% | $0.000188 | 1,000 | $0.1875 | |
| GNO | 0.61% | $0.999729 | 42.4281 | $42.42 | |
| ARB | 0.14% | $0.999495 | 10 | $9.99 | |
| BASE | 0.09% | $3,095.64 | 0.00200001 | $6.19 | |
| POL | <0.01% | $0.147143 | 1 | $0.147143 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.