Source Code
Latest 25 from a total of 84 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Fill Quote Token... | 36423414 | 7 hrs ago | IN | 0 ETH | 0.00005584 | ||||
| Fill Quote Eth T... | 36135988 | 2 days ago | IN | 0.0268 ETH | 0.00004335 | ||||
| Fill Quote Token... | 35965596 | 3 days ago | IN | 0 ETH | 0.00001009 | ||||
| Fill Quote Token... | 35965530 | 3 days ago | IN | 0 ETH | 0.00008998 | ||||
| Fill Quote Token... | 35912130 | 3 days ago | IN | 0 ETH | 0.00005633 | ||||
| Fill Quote Token... | 35871223 | 3 days ago | IN | 0 ETH | 0.00005252 | ||||
| Fill Quote Token... | 35256365 | 8 days ago | IN | 0 ETH | 0.00002013 | ||||
| Fill Quote Token... | 35049639 | 9 days ago | IN | 0 ETH | 0.00011118 | ||||
| Fill Quote Token... | 35049448 | 9 days ago | IN | 0 ETH | 0.00009098 | ||||
| Fill Quote Token... | 35049335 | 9 days ago | IN | 0 ETH | 0.00009154 | ||||
| Fill Quote Token... | 34836368 | 10 days ago | IN | 0 ETH | 0.00005735 | ||||
| Fill Quote Token... | 34173242 | 15 days ago | IN | 0 ETH | 0.00005603 | ||||
| Fill Quote Token... | 33944714 | 17 days ago | IN | 0 ETH | 0.00009271 | ||||
| Fill Quote Eth T... | 33944627 | 17 days ago | IN | 0.001608 ETH | 0.00005272 | ||||
| Fill Quote Token... | 33930447 | 17 days ago | IN | 0 ETH | 0.00005596 | ||||
| Fill Quote Token... | 33875217 | 17 days ago | IN | 0 ETH | 0.00009112 | ||||
| Fill Quote Eth T... | 33795203 | 18 days ago | IN | 0.000006 ETH | 0.00001039 | ||||
| Fill Quote Token... | 33577399 | 19 days ago | IN | 0 ETH | 0.00001036 | ||||
| Fill Quote Token... | 33354527 | 21 days ago | IN | 0 ETH | 0.00005591 | ||||
| Fill Quote Token... | 33126973 | 22 days ago | IN | 0 ETH | 0.00006738 | ||||
| Fill Quote Token... | 33057242 | 23 days ago | IN | 0 ETH | 0.00005241 | ||||
| Fill Quote Token... | 32561588 | 27 days ago | IN | 0 ETH | 0.00010688 | ||||
| Fill Quote Token... | 32511676 | 27 days ago | IN | 0 ETH | 0.0000641 | ||||
| Fill Quote Token... | 32389043 | 28 days ago | IN | 0 ETH | 0.00005561 | ||||
| Fill Quote Token... | 32380499 | 28 days ago | IN | 0 ETH | 0.00009092 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 36423414 | 7 hrs ago | 0.008121 ETH | ||||
| 36423414 | 7 hrs ago | 0.00819062 ETH | ||||
| 36135988 | 2 days ago | 0.0265722 ETH | ||||
| 36135988 | 2 days ago | 0.0268 ETH | ||||
| 35965596 | 3 days ago | 0.00051031 ETH | ||||
| 35965596 | 3 days ago | 0.00051469 ETH | ||||
| 35965530 | 3 days ago | 0.00079289 ETH | ||||
| 35965530 | 3 days ago | 0.00079969 ETH | ||||
| 35912130 | 3 days ago | 0.02405318 ETH | ||||
| 35912130 | 3 days ago | 0.02425939 ETH | ||||
| 35871223 | 3 days ago | 0.00296892 ETH | ||||
| 35871223 | 3 days ago | 0.00299438 ETH | ||||
| 35256365 | 8 days ago | 0.0006156 ETH | ||||
| 35256365 | 8 days ago | 0.00062087 ETH | ||||
| 35049639 | 9 days ago | 0.00102826 ETH | ||||
| 35049639 | 9 days ago | 0.00103708 ETH | ||||
| 35049448 | 9 days ago | 0.00172073 ETH | ||||
| 35049448 | 9 days ago | 0.00173548 ETH | ||||
| 35049335 | 9 days ago | 0.00447689 ETH | ||||
| 35049335 | 9 days ago | 0.00451527 ETH | ||||
| 34173242 | 15 days ago | 0.01149076 ETH | ||||
| 34173242 | 15 days ago | 0.01158927 ETH | ||||
| 33944714 | 17 days ago | 0.00160048 ETH | ||||
| 33944627 | 17 days ago | 0.00159433 ETH | ||||
| 33944627 | 17 days ago | 0.001608 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:
RainbowRouter
Compiler Version
v0.8.11+commit.d7f03943
ZkSolc Version
v1.5.0
Contract Source Code (Solidity Standard Json-Input format)
/*
▐██▒ ███
,╓, ▄▄ ,▄▄▄, .▄▄. ,╓, ▄▄▄ ██▌ ▄▄▄ ,▄▄▄, ,╓╓ ╓╓ ,╓
██████ ███▀▀██⌐ ▐██⌐ ███▀▀███⌐ ████▀▀███ ╓██▀▀▀██▄`██▌ ▐██▌ ▐██
███ ▄▄█████▌ ▐██⌐ ██▌ ▐██▌ ██▌ ║██⌐███ ▓██ ╙██▄█▌██▄██⌐
██▌ ▐██▄▄███▌,▐██⌐ ██▌ ▐██▌ ███▓▄▄███ ╙██▄▄▄██▀ ║███¬╙███▌
╙╙└ ╙╙▀╙─╙▀▀└"╙╙` ╙╙└ ╙╙" ╙╙`╙╙▀▀└ ╙╙▀▀╙` ╙╙└ ╙╙╙
_," _ _"""ⁿ=-, _
⌠ _ __"=.__
▐░...... _ _ "=._
▐░░░░░░░░░░░░░░░░. "= _
╚╩╩╩╩╩╩δφφφφ░░░░░░░░░░░ >__
▐░░░░░░░░__ _ ╙╙╚╩φφ░░░░░░░ ^=_
▐░░░░░░░░░░░░░░░,░ `╙╠φ░░░░░░░ ⁿ
▐░░░░░░░░░░░░░░░░░░░░._ `╚Åφ░░░░░ " _
╚╠╠╠╠╠╠╠╬╬╬▒▒φ░░░░░░░░░░░░ ╙╠░░░░░ "
╚╝╝╝╝╝╝╝╬╬╬╠╢╬╠╬╠╬▒░░░░░░░░░░ "╚φ░░░░ ½_
▐░░░░░░░░░░;░╙╙╝╬╠╬╠╠▒▒░░░░░░░░_ ╚φ░░░░ "_
╚▒φφφ░░░░░░░░░░░░-╙╚╬╠╠╠╬▒░░░░░░░ `╠▒░░░░ ,
╞╬╬╬╠╠╠╬╬╬╬▒φ▒░░░░░░░╙╚╬╬╠╬▒▒░░░░░ .╙╠░░░░ ≥
_▒░░░ΓΓ╙╙╙╚╩╬╠╬╠▒▒░░░░░░╙╬╬╠╬▒▒░░░░░' ╠▒░░░░ ≥
`╙ⁿⁿ≈≈σ╓░ '╙╙╚╬╠╬▒░░░░░░╙╬╬╠╬▒░░░░░ ╠▒░░░░ [
_╙Θ░ ░╙╠╠╬╬▒░░░░░╬╠╠╠▒▒░░░░ ╠▒░░░░ '_
_╙φ░'╙╠╠╬▒░░░░░╟╠╠╠▒░░░░░ _╠▒░░░ ░_
_`φ ░╚╬╠╠▒░░░░║╠╠╠▒░░░░░.`╠░░░░ [
_╚░⌡╚╠╬╬▒░░░░╠╠╠╬▒░░░░░ ╠▒░░░░ ░
_╙░⌡╚╠╠╬▒░░░"▒╠╠╬▒░░░░ ⌠╠░░░░ ⌡_
╠ ░╠╠╠╬▒░░░║╠╬╠╬▒░░░ _╠▒░░░ Γ
▐░░░╠╠╠▒░░░╟╠╠╠╬▒░░░░ ╠▒░░░░ [
_░.░╠╠╠▒░░░▐╬╠╠╬▒░░░░[╠╬░░░░ │
_╙φ░╠╠╠╬▒░░▐╬╬╠╬╬▒░░░[╠╬░░░░ ░≥_
____ ____ __ _______ ____
/$$$$$$ /$$$$$$ /$$
/$$__ $$ /$$__ $$ | $$
| $$ \__/ /$$ /$$ /$$ /$$$$$$ /$$$$$$ | $$ \ $$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$
| $$$$$$ | $$ | $$ | $$ |____ $$ /$$__ $$ | $$$$$$$$ /$$__ $$ /$$__ $$ /$$__ $$ /$$__ $$ /$$__ $$ |____ $$|_ $$_/ /$$__ $$ /$$__ $$
\____ $$| $$ | $$ | $$ /$$$$$$$| $$ \ $$ | $$__ $$| $$ \ $$| $$ \ $$| $$ \__/| $$$$$$$$| $$ \ $$ /$$$$$$$ | $$ | $$ \ $$| $$ \__/
/$$ \ $$| $$ | $$ | $$ /$$__ $$| $$ | $$ | $$ | $$| $$ | $$| $$ | $$| $$ | $$_____/| $$ | $$ /$$__ $$ | $$ /$$| $$ | $$| $$
| $$$$$$/| $$$$$/$$$$/| $$$$$$$| $$$$$$$/ | $$ | $$| $$$$$$$| $$$$$$$| $$ | $$$$$$$| $$$$$$$| $$$$$$$ | $$$$/| $$$$$$/| $$
\______/ \_____/\___/ \_______/| $$____/ |__/ |__/ \____ $$ \____ $$|__/ \_______/ \____ $$ \_______/ \___/ \______/ |__/
| $$ /$$ \ $$ /$$ \ $$ /$$ \ $$
| $$ | $$$$$$/| $$$$$$/ | $$$$$$/
|__/ \______/ \______/ \______/
*/
//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "@rari-capital/solmate/src/utils/SafeTransferLib.sol";
import "@rari-capital/solmate/src/tokens/ERC20.sol";
import "./routers/BaseAggregator.sol";
/// @title Rainbow swap aggregator contract
contract RainbowRouter is BaseAggregator {
/// @dev The address that is the current owner of this contract
address public owner;
/// @dev Event emitted when the owner changes
event OwnerChanged(address indexed newOwner, address indexed oldOwner);
/// @dev Event emitted when a swap target gets added
event SwapTargetAdded(address indexed target);
/// @dev Event emitted when a swap target gets removed
event SwapTargetRemoved(address indexed target);
/// @dev Event emitted when token fees are withdrawn
event TokenWithdrawn(
address indexed token,
address indexed target,
uint256 amount
);
/// @dev Event emitted when ETH fees are withdrawn
event EthWithdrawn(address indexed target, uint256 amount);
/// @dev modifier that ensures only the owner is allowed to call a specific method
modifier onlyOwner() {
require(msg.sender == owner, "ONLY_OWNER");
_;
}
constructor() {
owner = msg.sender;
status = 1;
}
/// @dev We don't want to accept any ETH, except refunds from aggregators
/// or the owner (for testing purposes), which can also withdraw
/// This is done by evaluating the value of status, which is set to 2
/// only during swaps due to the "nonReentrant" modifier
receive() external payable {
require(status == 2 || msg.sender == owner, "NO_RECEIVE");
}
/// @dev method to add or remove swap targets from swapTargets
/// This is required so we only approve "trusted" swap targets
/// to transfer tokens out of this contract
/// @param target address of the swap target to add
/// @param add flag to add or remove the swap target
function updateSwapTargets(address target, bool add) external onlyOwner {
swapTargets[target] = add;
if (add) {
emit SwapTargetAdded(target);
} else {
emit SwapTargetRemoved(target);
}
}
/// @dev method to withdraw ERC20 tokens (from the fees)
/// @param token address of the token to withdraw
/// @param to address that's receiving the tokens
/// @param amount amount of tokens to withdraw
function withdrawToken(
address token,
address to,
uint256 amount
) external onlyOwner {
require(to != address(0), "ZERO_ADDRESS");
SafeTransferLib.safeTransfer(ERC20(token), to, amount);
emit TokenWithdrawn(token, to, amount);
}
/// @dev method to withdraw ETH (from the fees)
/// @param to address that's receiving the ETH
/// @param amount amount of ETH to withdraw
function withdrawEth(address to, uint256 amount) external onlyOwner {
require(to != address(0), "ZERO_ADDRESS");
SafeTransferLib.safeTransferETH(to, amount);
emit EthWithdrawn(to, amount);
}
/// @dev Transfers ownership of the contract to a new account (`newOwner`).
/// @param newOwner address of the new owner
/// Can only be called by the current owner.
function transferOwnership(address newOwner) external virtual onlyOwner {
require(newOwner != address(0), "ZERO_ADDRESS");
require(newOwner != owner, "SAME_OWNER");
address previousOwner = owner;
owner = newOwner;
emit OwnerChanged(newOwner, previousOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
/*//////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*//////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
/*//////////////////////////////////////////////////////////////
ERC20 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/*//////////////////////////////////////////////////////////////
EIP-2612 LOGIC
//////////////////////////////////////////////////////////////*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
// Unchecked because the only math done is incrementing
// the owner's nonce which cannot realistically overflow.
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
// Cannot underflow because a user's balance
// will never be larger than the total supply.
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
import {ERC20} from "../tokens/ERC20.sol";
/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
/*//////////////////////////////////////////////////////////////
ETH OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferETH(address to, uint256 amount) internal {
bool success;
assembly {
// Transfer the ETH and store if it succeeded or not.
success := call(gas(), to, amount, 0, 0, 0, 0)
}
require(success, "ETH_TRANSFER_FAILED");
}
/*//////////////////////////////////////////////////////////////
ERC20 OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 amount
) internal {
bool success;
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
)
}
require(success, "TRANSFER_FROM_FAILED");
}
function safeTransfer(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "TRANSFER_FAILED");
}
function safeApprove(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "APPROVE_FAILED");
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Interface for permit
/// @notice Interface used by DAI/CHAI for permit
interface IERC20PermitAllowed {
/// @notice Approve the spender to spend some tokens via the holder signature
/// @dev This is the permit interface used by DAI and CHAI
/// @param holder The address of the token holder, the token owner
/// @param spender The address of the token spender
/// @param nonce The holder's nonce, increases at each call to permit
/// @param expiry The timestamp at which the permit is no longer valid
/// @param allowed Boolean that sets approval amount, true for type(uint256).max and false for 0
/// @param v Must produce valid secp256k1 signature from the holder along with `r` and `s`
/// @param r Must produce valid secp256k1 signature from the holder along with `v` and `s`
/// @param s Must produce valid secp256k1 signature from the holder along with `r` and `v`
function permit(
address holder,
address spender,
uint256 nonce,
uint256 expiry,
bool allowed,
uint8 v,
bytes32 r,
bytes32 s
) external;
}//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@uniswap/v3-periphery/contracts/interfaces/external/IERC20PermitAllowed.sol";
interface IDAI is IERC20Metadata, IERC20PermitAllowed {
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function version() external view returns (string memory);
}//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";
interface IERC2612 is IERC20Metadata, IERC20Permit {
function _nonces(address owner) external view returns (uint256);
function version() external view returns (string memory);
}//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "./IERC2612.sol";
interface IERC2612Extension is IERC2612 {
function _nonces(address owner) external view returns (uint256);
function version() external view returns (string memory);
}//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
/// @title Weth Interface
/// @dev this interface is only used for testing purposes
interface IWETH is IERC20Metadata {
function deposit() external payable;
function withdraw(uint256) external;
}//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "../interfaces/IERC2612.sol";
import "../interfaces/IDAI.sol";
/// @title PermitHelper
/// @dev Helper methods for using ERC20 Permit (ERC2612 or DAI/CHAI like)
library PermitHelper {
struct Permit {
uint256 value;
uint256 nonce;
uint256 deadline;
bool isDaiStylePermit;
uint8 v;
bytes32 r;
bytes32 s;
}
/// @dev permit method helper that will handle both known implementations
// DAI vs ERC2612 tokens
/// @param permitData bytes containing the encoded permit signature
/// @param tokenAddress address of the token that will be permitted
/// @param holder address that holds the tokens to be permitted
/// @param spender address that will be permitted to spend the tokens
function permit(
Permit memory permitData,
address tokenAddress,
address holder,
address spender
) internal {
if (permitData.isDaiStylePermit) {
IDAI(tokenAddress).permit(
holder,
spender,
permitData.nonce,
permitData.deadline,
true,
permitData.v,
permitData.r,
permitData.s
);
} else {
IERC2612(tokenAddress).permit(
holder,
spender,
permitData.value,
permitData.deadline,
permitData.v,
permitData.r,
permitData.s
);
}
}
}//SPDX-License-Identifier: GPL-3.0
pragma solidity =0.8.11;
import "@rari-capital/solmate/src/utils/SafeTransferLib.sol";
import "@rari-capital/solmate/src/tokens/ERC20.sol";
import "../libraries/PermitHelper.sol";
/// @title Rainbow base aggregator contract
contract BaseAggregator {
/// @dev Used to prevent re-entrancy
uint256 internal status;
/// @dev Set of allowed swapTargets.
mapping(address => bool) public swapTargets;
/// @dev modifier that prevents reentrancy attacks on specific methods
modifier nonReentrant() {
// On the first call to nonReentrant, status will be 1
require(status != 2, "NON_REENTRANT");
// Any calls to nonReentrant after this point will fail
status = 2;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
status = 1;
}
/// @dev modifier that ensures only approved targets can be called
modifier onlyApprovedTarget(address target) {
require(swapTargets[target], "TARGET_NOT_AUTH");
_;
}
/** EXTERNAL **/
/// @param buyTokenAddress the address of token that the user should receive
/// @param target the address of the aggregator contract that will exec the swap
/// @param swapCallData the calldata that will be passed to the aggregator contract
/// @param feeAmount the amount of ETH that we will take as a fee
function fillQuoteEthToToken(
address buyTokenAddress,
address payable target,
bytes calldata swapCallData,
uint256 feeAmount
) external payable nonReentrant onlyApprovedTarget(target) {
// 1 - Get the initial balances
uint256 initialTokenBalance = ERC20(buyTokenAddress).balanceOf(
address(this)
);
uint256 initialEthAmount = address(this).balance - msg.value;
uint256 sellAmount = msg.value - feeAmount;
// 2 - Call the encoded swap function call on the contract at `target`,
// passing along any ETH attached to this function call to cover protocol fees
// minus our fees, which are kept in this contract
(bool success, bytes memory res) = target.call{value: sellAmount}(
swapCallData
);
// Get the revert message of the call and revert with it if the call failed
if (!success) {
assembly {
let returndata_size := mload(res)
revert(add(32, res), returndata_size)
}
}
// 3 - Make sure we received the tokens
{
uint256 finalTokenBalance = ERC20(buyTokenAddress).balanceOf(
address(this)
);
require(initialTokenBalance < finalTokenBalance, "NO_TOKENS");
}
// 4 - Send the received tokens back to the user
SafeTransferLib.safeTransfer(
ERC20(buyTokenAddress),
msg.sender,
ERC20(buyTokenAddress).balanceOf(address(this)) -
initialTokenBalance
);
// 5 - Return the remaining ETH to the user (if any)
{
uint256 finalEthAmount = address(this).balance - feeAmount;
if (finalEthAmount > initialEthAmount) {
SafeTransferLib.safeTransferETH(
msg.sender,
finalEthAmount - initialEthAmount
);
}
}
}
/// @param sellTokenAddress the address of token that the user is selling
/// @param buyTokenAddress the address of token that the user should receive
/// @param target the address of the aggregator contract that will exec the swap
/// @param swapCallData the calldata that will be passed to the aggregator contract
/// @param sellAmount the amount of tokens that the user is selling
/// @param feeAmount the amount of the tokens to sell that we will take as a fee
function fillQuoteTokenToToken(
address sellTokenAddress,
address buyTokenAddress,
address payable target,
bytes calldata swapCallData,
uint256 sellAmount,
uint256 feeAmount
) external payable nonReentrant onlyApprovedTarget(target) {
_fillQuoteTokenToToken(
sellTokenAddress,
buyTokenAddress,
target,
swapCallData,
sellAmount,
feeAmount
);
}
/// @dev method that executes ERC20 to ERC20 token swaps with the ability to take a fee from the input
// and accepts a signature to use permit, so the user doesn't have to make an previous approval transaction
/// @param sellTokenAddress the address of token that the user is selling
/// @param buyTokenAddress the address of token that the user should receive
/// @param target the address of the aggregator contract that will exec the swap
/// @param swapCallData the calldata that will be passed to the aggregator contract
/// @param sellAmount the amount of tokens that the user is selling
/// @param feeAmount the amount of the tokens to sell that we will take as a fee
/// @param permitData struct containing the value, nonce, deadline, v, r and s values of the permit data
function fillQuoteTokenToTokenWithPermit(
address sellTokenAddress,
address buyTokenAddress,
address payable target,
bytes calldata swapCallData,
uint256 sellAmount,
uint256 feeAmount,
PermitHelper.Permit calldata permitData
) external payable nonReentrant onlyApprovedTarget(target) {
// 1 - Apply permit
PermitHelper.permit(
permitData,
sellTokenAddress,
msg.sender,
address(this)
);
//2 - Call fillQuoteTokenToToken
_fillQuoteTokenToToken(
sellTokenAddress,
buyTokenAddress,
target,
swapCallData,
sellAmount,
feeAmount
);
}
/// @dev method that executes ERC20 to ETH token swaps with the ability to take a fee from the output
/// @param sellTokenAddress the address of token that the user is selling
/// @param target the address of the aggregator contract that will exec the swap
/// @param swapCallData the calldata that will be passed to the aggregator contract
/// @param sellAmount the amount of tokens that the user is selling
/// @param feePercentageBasisPoints the amount of ETH that we will take as a fee in 1e18 basis points (basis points with 4 decimals plus 14 extra decimals of precision)
function fillQuoteTokenToEth(
address sellTokenAddress,
address payable target,
bytes calldata swapCallData,
uint256 sellAmount,
uint256 feePercentageBasisPoints
) external payable nonReentrant onlyApprovedTarget(target) {
_fillQuoteTokenToEth(
sellTokenAddress,
target,
swapCallData,
sellAmount,
feePercentageBasisPoints
);
}
/// @dev method that executes ERC20 to ETH token swaps with the ability to take a fee from the output
// and accepts a signature to use permit, so the user doesn't have to make an previous approval transaction
/// @param sellTokenAddress the address of token that the user is selling
/// @param target the address of the aggregator contract that will exec the swap
/// @param swapCallData the calldata that will be passed to the aggregator contract
/// @param sellAmount the amount of tokens that the user is selling
/// @param feePercentageBasisPoints the amount of ETH that we will take as a fee in 1e18 basis points (basis points with 4 decimals plus 14 extra decimals of precision)
/// @param permitData struct containing the amount, nonce, deadline, v, r and s values of the permit data
function fillQuoteTokenToEthWithPermit(
address sellTokenAddress,
address payable target,
bytes calldata swapCallData,
uint256 sellAmount,
uint256 feePercentageBasisPoints,
PermitHelper.Permit calldata permitData
) external payable nonReentrant onlyApprovedTarget(target) {
// 1 - Apply permit
PermitHelper.permit(
permitData,
sellTokenAddress,
msg.sender,
address(this)
);
// 2 - call fillQuoteTokenToEth
_fillQuoteTokenToEth(
sellTokenAddress,
target,
swapCallData,
sellAmount,
feePercentageBasisPoints
);
}
/** INTERNAL **/
/// @dev internal method that executes ERC20 to ETH token swaps with the ability to take a fee from the output
function _fillQuoteTokenToEth(
address sellTokenAddress,
address payable target,
bytes calldata swapCallData,
uint256 sellAmount,
uint256 feePercentageBasisPoints
) internal {
// 1 - Get the initial ETH amount
uint256 initialEthAmount = address(this).balance - msg.value;
// 2 - Move the tokens to this contract
// NOTE: This implicitly assumes that the the necessary approvals have been granted
// from msg.sender to the BaseAggregator
SafeTransferLib.safeTransferFrom(
ERC20(sellTokenAddress),
msg.sender,
address(this),
sellAmount
);
// 3 - Approve the aggregator's contract to swap the tokens
SafeTransferLib.safeApprove(
ERC20(sellTokenAddress),
target,
sellAmount
);
// 4 - Call the encoded swap function call on the contract at `target`,
// passing along any ETH attached to this function call to cover protocol fees.
(bool success, bytes memory res) = target.call{value: msg.value}(
swapCallData
);
// Get the revert message of the call and revert with it if the call failed
if (!success) {
assembly {
let returndata_size := mload(res)
revert(add(32, res), returndata_size)
}
}
// 5 - Check that the tokens were fully spent during the swap
uint256 allowance = ERC20(sellTokenAddress).allowance(
address(this),
target
);
require(allowance == 0, "ALLOWANCE_NOT_ZERO");
// 6 - Subtract the fees and send the rest to the user
// Fees will be held in this contract
uint256 finalEthAmount = address(this).balance;
uint256 ethDiff = finalEthAmount - initialEthAmount;
require(ethDiff > 0, "NO_ETH_BACK");
if (feePercentageBasisPoints > 0) {
uint256 fees = (ethDiff * feePercentageBasisPoints) / 1e18;
uint256 amountMinusFees = ethDiff - fees;
SafeTransferLib.safeTransferETH(msg.sender, amountMinusFees);
// when there's no fee, 1inch sends the funds directly to the user
// we check to prevent sending 0 ETH in that case
} else if (ethDiff > 0) {
SafeTransferLib.safeTransferETH(msg.sender, ethDiff);
}
}
/// @dev internal method that executes ERC20 to ERC20 token swaps with the ability to take a fee from the input
function _fillQuoteTokenToToken(
address sellTokenAddress,
address buyTokenAddress,
address payable target,
bytes calldata swapCallData,
uint256 sellAmount,
uint256 feeAmount
) internal {
// 1 - Get the initial output token balance
uint256 initialOutputTokenAmount = ERC20(buyTokenAddress).balanceOf(
address(this)
);
// 2 - Move the tokens to this contract (which includes our fees)
// NOTE: This implicitly assumes that the the necessary approvals have been granted
// from msg.sender to the BaseAggregator
SafeTransferLib.safeTransferFrom(
ERC20(sellTokenAddress),
msg.sender,
address(this),
sellAmount
);
// 3 - Approve the aggregator's contract to swap the tokens if needed
SafeTransferLib.safeApprove(
ERC20(sellTokenAddress),
target,
sellAmount - feeAmount
);
// 4 - Call the encoded swap function call on the contract at `target`,
// passing along any ETH attached to this function call to cover protocol fees.
(bool success, bytes memory res) = target.call{value: msg.value}(
swapCallData
);
// Get the revert message of the call and revert with it if the call failed
if (!success) {
assembly {
let returndata_size := mload(res)
revert(add(32, res), returndata_size)
}
}
// 5 - Check that the tokens were fully spent during the swap
uint256 allowance = ERC20(sellTokenAddress).allowance(
address(this),
target
);
require(allowance == 0, "ALLOWANCE_NOT_ZERO");
// 6 - Make sure we received the tokens
uint256 finalOutputTokenAmount = ERC20(buyTokenAddress).balanceOf(
address(this)
);
require(initialOutputTokenAmount < finalOutputTokenAmount, "NO_TOKENS");
// 7 - Send tokens to the user
SafeTransferLib.safeTransfer(
ERC20(buyTokenAddress),
msg.sender,
finalOutputTokenAmount - initialOutputTokenAmount
);
}
}{
"optimizer": {
"enabled": true,
"mode": "3"
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"}],"name":"SwapTargetAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"}],"name":"SwapTargetRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenWithdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"buyTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"fillQuoteEthToToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sellTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feePercentageBasisPoints","type":"uint256"}],"name":"fillQuoteTokenToEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sellTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feePercentageBasisPoints","type":"uint256"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"isDaiStylePermit","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct PermitHelper.Permit","name":"permitData","type":"tuple"}],"name":"fillQuoteTokenToEthWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sellTokenAddress","type":"address"},{"internalType":"address","name":"buyTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"fillQuoteTokenToToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sellTokenAddress","type":"address"},{"internalType":"address","name":"buyTokenAddress","type":"address"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"swapCallData","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"isDaiStylePermit","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct PermitHelper.Permit","name":"permitData","type":"tuple"}],"name":"fillQuoteTokenToTokenWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapTargets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"add","type":"bool"}],"name":"updateSwapTargets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000431d326fb5fd792e3c076f5c13175fe72a8f932aeb4262b639182a5036000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0004000000000002000e00000000000200000000030100190000006004300270000003ea0340019700030000003103550002000000010355000003ea0040019d0000008005000039000000400050043f00000001022001900000006c0000c13d000000040230008c0000007c0000413d000000000201043b000000e002200270000003f10420009c000000890000a13d000003f20420009c000000b20000213d000003f60420009c000002940000613d000003f70420009c000001700000613d000003f80220009c00000a280000c13d000000a40230008c00000a280000413d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d000b00040020003d0000000b04100360000000000404043b000c00000004001d000004020440009c00000a280000213d0000000c022000290000002402200039000000000232004b00000a280000213d0000008402100370000000000202043b0000006401100370000000000301043b000000000100041a000000020110008c000002c90000613d000a00000003001d000800000002001d0000000201000039000000000010041b0000000d0100002900000000001004350000000101000039000900000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000003890000613d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b0000000002000416000700000001001d000000000121004b000004c50000813d000004230100004100000000001004350000001101000039000000040010043f000004180100004100000fa6000104300000000001000416000000000101004b00000a280000c13d0000000201000039000000000201041a000003eb022001970000000003000411000000000232019f000000000021041b0000000101000039000000000010041b000000200100003900000100001004430000012000000443000003ec0100004100000fa50001042e000000000103004b00000a280000c13d000000000100041a000000020110008c000000870000613d0000000201000039000000000101041a000003ed011001970000000002000411000000000112004b000000f30000c13d000000000100001900000fa50001042e000003f90420009c000000d50000a13d000003fa0420009c0000024d0000613d000003fb0420009c000001210000613d000003fc0220009c00000a280000c13d000000240230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000401100370000000000101043b000003ed0210009c00000a280000213d00000000001004350000000101000039000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff011001900000000001000019000000010100c039000000400200043d0000000000120435000003ea0120009c000003ea02008041000000400120021000000420011001c700000fa50001042e000003f30420009c0000029d0000613d000003f40420009c000001aa0000613d000003f50220009c00000a280000c13d000000240230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000401100370000000000501043b000003ed0150009c00000a280000213d0000000201000039000000000201041a000003ed032001970000000006000411000000000336004b000002d30000c13d000000000305004b000001170000613d000000000365004b000002f30000c13d000003ee01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000040101000041000000c40010043f000003f00100004100000fa600010430000003fd0420009c000000fd0000613d000003fe0220009c00000a280000c13d000000440230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002401100370000000000301043b0000000201000039000000000101041a000003ed011001970000000002000411000000000112004b000002d30000c13d0000000e05000029000000000105004b000001170000613d0000000001000414000000040250008c000002eb0000c13d0000008001000039000003550000013d000003ee01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f000003ef01000041000000c40010043f000003f00100004100000fa600010430000000640230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004401100370000000000801043b0000000201000039000000000101041a000003ed011001970000000002000411000000000112004b000002d30000c13d0000000d06000029000000000106004b000002dd0000c13d000003ee01000041000000800010043f0000002001000039000000840010043f0000000c01000039000000a40010043f0000042b01000041000000c40010043f000003f00100004100000fa600010430000000c40230008c00000a280000413d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000c00000002001d000003ed0220009c00000a280000213d0000006402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d000a00040020003d0000000a04100360000000000404043b000b00000004001d000004020440009c00000a280000213d0000000b022000290000002402200039000000000232004b00000a280000213d000000a402100370000000000202043b000800000002001d0000008401100370000000000101043b000900000001001d000000000100041a000000020110008c000002c90000613d0000000201000039000000000010041b0000000c0100002900000000001004350000000101000039000700000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000003890000613d000000400300043d00000417010000410000000001130436000500000001001d0000000001000410000003ed02100197000600000003001d0000000401300039000400000002001d000000000021043500000000010004140000000d02000029000000040220008c000004710000c13d0000000103000031000004a00000013d000000440230008c00000a280000413d0000000002000416000000000202004b00000a280000c13d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002401100370000000000201043b000000000102004b0000000001000019000000010100c039000d00000002001d000000000112004b00000a280000c13d0000000201000039000000000101041a000003ed011001970000000002000411000000000112004b000002d30000c13d0000000e0100002900000000001004350000000101000039000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000201041a0000042c022001970000000d022001af000000000021041b000000400100043d000003ea0210009c000003ea0100804100000040011002100000000d0200006b000003630000613d0000000002000414000003ea0320009c000003ea02008041000000c002200210000000000112019f00000413011001c70000800d0200003900000002030000390000041e040000410000036c0000013d000e00000005001d000001840230008c00000a280000413d0000000402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000c00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d0000000404200039000000000441034f000000000404043b000b00000004001d000004020440009c00000a280000213d0000002404200039000a00000004001d0000000b02400029000000000232004b00000a280000213d0000006402100370000000000302043b0000008401100370000000000201043b000000000100041a000000020110008c000002c90000613d000900000003001d000700000002001d0000000201000039000000000010041b0000000c0100002900000000001004350000000101000039000800000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000003890000613d000000a40100008a0000000001100031000004040210009c00000a280000213d000000e00110008c00000a280000413d000000400100043d000004050210009c00000a870000213d000000e002100039000000400020043f0000000202000367000000a403200370000000000303043b000500000003001d0000000003310436000000c404200370000000000404043b000400000004001d00000000004304350000004003100039000000e404200370000000000404043b000600000004001d00000000004304350000010403200370000000000303043b000000000403004b0000000004000019000000010400c039000000000443004b00000a280000c13d000000600410003900000000003404350000012404200370000000000404043b000300000004001d000000ff0440008c00000a280000213d0000008004100039000000030500002900000000005404350000014404200370000000000504043b000000a004100039000200000005001d0000000000540435000000c0011000390000016402200370000000000202043b000100000002001d0000000000210435000004060100004100000000001004390000000d010000290000000400100443000000000103004b000006110000c13d0000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c700008002020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b000000000101004b00000a280000613d000000400300043d000000c40130003900000001020000290000000000210435000000a401300039000000020200002900000000002104350000008401300039000000030200002900000000002104350000006401300039000000060200002900000000002104350000004401300039000000050200002900000000002104350000000001000410000003ed01100197000000240230003900000000001204350000040a0100004100000000001304350000000001000411000003ed01100197000600000003001d0000000402300039000000000012043500000000010004140000000d02000029000000040220008c000008930000c13d0000000103000031000008a60000013d000000840230008c00000a280000413d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d000b00040020003d0000000b04100360000000000404043b000c00000004001d000004020440009c00000a280000213d0000000c022000290000002402200039000000000232004b00000a280000213d0000006401100370000000000201043b000000000100041a000000020110008c000002c90000613d000a00000002001d0000000201000039000000000010041b0000000d0100002900000000001004350000000101000039000900000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000003890000613d000000400300043d00000417010000410000000001130436000700000001001d0000000001000410000003ed02100197000800000003001d0000000401300039000600000002001d000000000021043500000000010004140000000e02000029000000040220008c0000038d0000c13d0000000103000031000003bc0000013d0000000001000416000000000101004b00000a280000c13d0000000201000039000000000101041a000003ed01100197000000800010043f0000041f0100004100000fa50001042e000001a40230008c00000a280000413d0000000402100370000000000202043b000e00000002001d000003ed0220009c00000a280000213d0000002402100370000000000202043b000d00000002001d000003ed0220009c00000a280000213d0000004402100370000000000202043b000c00000002001d000003ed0220009c00000a280000213d0000006402100370000000000202043b000004020420009c00000a280000213d0000002304200039000000000434004b00000a280000813d0000000404200039000000000441034f000000000404043b000b00000004001d000004020440009c00000a280000213d0000002404200039000a00000004001d0000000b02400029000000000232004b00000a280000213d0000008402100370000000000202043b000900000002001d000000a401100370000000000101043b000800000001001d000000000100041a000000020110008c000003750000c13d000003ee01000041000000800010043f0000002001000039000000840010043f0000000d01000039000000a40010043f0000042501000041000000c40010043f000003f00100004100000fa600010430000003ee01000041000000800010043f0000002001000039000000840010043f0000000a01000039000000a40010043f0000042801000041000000c40010043f000003f00100004100000fa6000104300000041b01000041000000800010043f000000840060043f000000a40080043f00000000010004140000000e07000029000000040270008c000002ff0000c13d00000001020000390000008001000039000000800400043d000000000040043500000001030000310000032a0000013d000003ea0210009c000003ea01008041000000c001100210000000000203004b000d00000003001d000003480000c13d00000000020500190000034c0000013d000003eb02200197000000000252019f000000000021041b0000000001000414000003ea0210009c000003ea01008041000000c001100210000003ff011001c70000800d02000039000000030300003900000400040000410000036d0000013d000c00000008001d000003ea0210009c000003ea01008041000000c00110021000000429011001c700000000020700190fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000504400272000003150000613d000000000601034f0000000007000019000000006806043c000000000907004b0000000007870436000003110000c13d000000000605004b000003230000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f0003000000010355000000400100043d00000000040004330000000e070000290000000d060000290000000c08000029000000010440008c000000000400001900000001040060390000001f0530008c00000000050000190000000105002039000000000303004b00000000030000190000000103006039000000010220019000000e1b0000613d000000000254016f000000000223019f000000010220019000000e1b0000613d0000000000810435000003ea0210009c000003ea0100804100000040011002100000000002000414000003ea0320009c000003ea02008041000000c002200210000000000112019f00000426011001c70000800d0200003900000003030000390000042a0400004100000000050700190000036d0000013d00000413011001c70000800902000039000000000405001900000000050000190fa40f9a0000040f00030000000103550000006001100270000103ea0010019d000000400100043d000000010220019000000b660000613d0000000e050000290000000d030000290000000000310435000003ea0210009c000003ea0100804100000040011002100000000002000414000003ea0320009c000003ea02008041000000c002200210000000000112019f00000426011001c70000800d02000039000000020300003900000427040000410000036d0000013d0000000002000414000003ea0320009c000003ea02008041000000c002200210000000000112019f00000413011001c70000800d0200003900000002030000390000041d040000410000000e050000290fa40f9a0000040f000000010120019000000a280000613d000000400100043d000003ea0210009c000003ea01008041000000400110021000000fa50001042e0000000201000039000000000010041b0000000c0100002900000000001004350000000101000039000700000001001d000000200010043f0000000001000414000003ea0210009c000003ea01008041000000c00110021000000403011001c700008010020000390fa40f9f0000040f000000010220019000000a280000613d000000000101043b000000000101041a000000ff01100190000004090000c13d000000400100043d0000004402100039000004240300004100000e1d0000013d0000000803000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000418011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000709000029000003a90000613d000000000601034f0000000807000029000000006806043c0000000007870436000000000897004b000003a50000c13d000000000604004b000003b80000613d0000000505500210000000000651034f00000008055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000102200190000004da0000613d0000001f013000390000042d021001970000000801200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040130009c00000a280000213d000000200130008c00000a280000413d00000008010000290000000001010433000800000001001d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b0000000002000416000700000001001d000000000121004b000000660000413d0000000a0120006c000000660000413d000000400100043d0000000c040000290000001f0240018f0000000b030000290000002003300039000000020330036700000005044002720000000504400210000003f20000613d0000000005410019000000000603034f0000000007010019000000006806043c0000000007870436000000000857004b000003ee0000c13d000000000502004b000004000000613d000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000c02100029000000000002043500000000020004140000000d03000029000000040330008c0000071b0000c13d00000001020000390000000103000031000007b30000013d000000c40100008a0000000001100031000004040210009c00000a280000213d000000e00110008c00000a280000413d000000400100043d000004050210009c00000a870000213d000000e002100039000000400020043f0000000202000367000000c403200370000000000303043b000500000003001d0000000003310436000000e404200370000000000404043b000400000004001d000000000043043500000040031000390000010404200370000000000404043b000600000004001d00000000004304350000012403200370000000000303043b000000000403004b0000000004000019000000010400c039000000000443004b00000a280000c13d000000600410003900000000003404350000014404200370000000000404043b000300000004001d000000ff0440008c00000a280000213d0000008004100039000000030500002900000000005404350000016404200370000000000504043b000000a004100039000200000005001d0000000000540435000000c0011000390000018402200370000000000202043b000100000002001d0000000000210435000004060100004100000000001004390000000e010000290000000400100443000000000103004b000006410000c13d0000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c700008002020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b000000000101004b00000a280000613d000000400300043d000000c40130003900000001020000290000000000210435000000a401300039000000020200002900000000002104350000008401300039000000030200002900000000002104350000006401300039000000060200002900000000002104350000004401300039000000050200002900000000002104350000040a0100004100000000001304350000000001000411000003ed01100197000000040230003900000000001204350000000001000410000003ed02100197000600000003001d0000002401300039000500000002001d000000000021043500000000010004140000000e02000029000000040220008c000009e90000c13d0000000103000031000009fc0000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000418011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000005090000290000048d0000613d000000000601034f0000000607000029000000006806043c0000000007870436000000000897004b000004890000c13d000000000604004b0000049c0000613d0000000505500210000000000651034f00000006055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000102200190000004e90000613d0000001f013000390000042d021001970000000601200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040230009c00000a280000213d000000200230008c00000a280000413d00000006020000290000000002020433000600000002001d0000004402100039000000090400002900000000004204350000002402100039000000000400041000000000004204350000040d02000041000000000021043500000004021000390000000004000411000000000042043500000000020004140000000e04000029000000040440008c000005c30000c13d000000010200003900000000010104330000000000100435000005ed0000013d000000400100043d00000044021000390000000a0300002900000000003204350000002402100039000000000300041000000000003204350000040d02000041000000000021043500000004021000390000000003000411000000000032043500000000020004140000000e03000029000000040330008c0000050a0000c13d0000000102000039000000000101043300000000001004350000000103000031000005340000013d000000400200043d0000001f0430018f0000000505300272000004e60000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b000004e20000c13d000000000604004b000004f70000c13d000005040000013d000000400200043d0000001f0430018f0000000505300272000004f50000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b000004f10000c13d000000000604004b000005040000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f00000000001504350000006001300210000003ea0320009c000003ea020080410000004002200210000000000112019f00000fa600010430000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f0000040e011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000504400272000005230000613d000000000601034f0000000007000019000000006806043c000000000907004b00000000078704360000051f0000c13d000000000605004b000005310000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000600001900000001060060390000001f0130008c00000000070000190000000107002039000000000103004b00000000080000190000000108006039000000400100043d00000024041000390000000405100039000000010220019000000b380000613d000000000276016f000000000228019f000000010220019000000b380000613d000004100200004100000000002104350000000d0200002900000000002504350000000a02000029000000000024043500000000020004140000000e04000029000000040440008c000005540000c13d0000000102000039000000000101043300000000001004350000057e0000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f00000005044002720000056d0000613d000000000601034f0000000007000019000000006806043c000000000907004b0000000007870436000005690000c13d000000000605004b0000057b0000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000400001900000001040060390000001f0130008c00000000050000190000000105002039000000000103004b00000000060000190000000106006039000000400100043d000000010220019000000ddb0000613d000000000254016f000000000226019f000000010220019000000ddb0000613d0000000c050000290000001f0250018f0000000b040000290000002004400039000000020440036700000005055002720000059d0000613d00000005065002100000000006610019000000000704034f0000000008010019000000007907043c0000000008980436000000000968004b000005990000c13d000000000602004b000005ac0000613d0000000505500210000000000454034f00000000055100190000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f00000000002504350000000c02100029000000000002043500000000020004140000000d04000029000000040440008c0000067d0000613d0000000c04000029000003ea0340009c000003ea040080410000006003400210000003ea0410009c000003ea010080410000004001100210000000000131019f000003ea0320009c000003ea02008041000000c002200210000000000112019f0000000002000416000000000202004b000006720000c13d0000000d02000029000006770000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f0000040e011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000504400272000005dc0000613d000000000601034f0000000007000019000000006806043c000000000907004b0000000007870436000005d80000c13d000000000605004b000005ea0000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000100001900000001010060390000001f0430008c00000000040000190000000104002039000000000503004b00000000050000190000000105006039000000010220019000000c360000613d000000000141016f000000000115019f000000010110019000000c360000613d0000000902000029000000080120006c000000660000413d0000000902000029000000080220006a000000400100043d000000240410003900000000002404350000041002000041000000000021043500000004021000390000000c04000029000000000042043500000000020004140000000e04000029000000040440008c0000072c0000c13d000000010200003900000000010104330000000000100435000007560000013d0000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c700008002020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b000000000101004b00000a280000613d000000400300043d000000e40130003900000001020000290000000000210435000000c40130003900000002020000290000000000210435000000a401300039000000030200002900000000002104350000008401300039000000010200003900000000002104350000006401300039000000060200002900000000002104350000004401300039000000040200002900000000002104350000000001000410000003ed0110019700000024023000390000000000120435000004080100004100000000001304350000000001000411000003ed01100197000600000003001d0000000402300039000000000012043500000000010004140000000d02000029000000040220008c000008af0000c13d0000000103000031000008c20000013d0000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c700008002020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b000000000101004b00000a280000613d000000400300043d000000e40130003900000001020000290000000000210435000000c40130003900000002020000290000000000210435000000a40130003900000003020000290000000000210435000000840130003900000001020000390000000000210435000000640130003900000006020000290000000000210435000000440130003900000004020000290000000000210435000004080100004100000000001304350000000001000411000003ed01100197000000040230003900000000001204350000000001000410000003ed02100197000600000003001d0000002401300039000500000002001d000000000021043500000000010004140000000e02000029000000040220008c00000a060000c13d000000010300003100000a190000013d00000413011001c7000080090200003900000000030004160000000d0400002900000000050000190fa40f9a0000040f000900000002001d00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b000006f10000c13d000000600100003900000080020000390000000904000029000000010440019000000ef20000613d000000400400043d00000024014000390000000d02000029000000000021043500000414010000410000000001140436000c00000001001d0000000001000410000003ed01100197000d00000004001d0000000402400039000000000012043500000000010004140000000e02000029000000040220008c000006c30000613d0000000d03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000c09000029000006b00000613d000000000601034f0000000d07000029000000006806043c0000000007870436000000000897004b000006ac0000c13d000000000604004b000006bf0000613d0000000505500210000000000651034f0000000d055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f000300000001035500000001022001900000079a0000613d0000001f013000390000042d021001970000000d01200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040230009c00000a280000213d000000200230008c00000a280000413d0000000d020000290000000002020433000000000202004b00000cdd0000c13d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d00000000030004160000000702300069000000000101043b000000000321004b000000660000413d000000000321004b00000b500000c13d000000400100043d00000044021000390000041c03000041000000000032043500000024021000390000000b0300003900000e200000013d0000001f013000390000042d011001970000003f011000390000042d02100197000000400100043d0000000002210019000000000412004b00000000040000190000000104004039000004020520009c00000a870000213d000000010440019000000a870000c13d000000400020043f0000001f0430018f00000000023104360000000305000367000000050630027200000005066002100000070c0000613d0000000007620019000000000805034f0000000009020019000000008a08043c0000000009a90436000000000a79004b000007080000c13d000000000704004b000006810000613d000000000565034f00000000066200190000000304400210000000000706043300000000074701cf000000000747022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000474019f0000000000460435000006810000013d0000000c04000029000003ea0340009c000003ea040080410000006003400210000003ea0410009c000003ea010080410000004001100210000000000131019f000003ea0320009c000003ea02008041000000c002200210000000000112019f00000000030004160000000a0230006c000007a90000c13d0000000d02000029000007ae0000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000504400272000007450000613d000000000601034f0000000007000019000000006806043c000000000907004b0000000007870436000007410000c13d000000000605004b000007530000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000400001900000001040060390000001f0130008c00000000050000190000000105002039000000000103004b00000000060000190000000106006039000000400100043d000000010220019000000ddb0000613d000000000254016f000000000226019f000000010220019000000ddb0000613d0000000b050000290000001f0250018f0000000a040000290000002004400039000000020440036700000005055002720000000505500210000007750000613d0000000006510019000000000704034f0000000008010019000000007907043c0000000008980436000000000968004b000007710000c13d000000000602004b000007830000613d000000000454034f00000000055100190000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f00000000002504350000000b02100029000000000002043500000000020004140000000c04000029000000040440008c000009000000613d00000000030004160000000b05000029000003ea0450009c000003ea050080410000006004500210000003ea0510009c000003ea010080410000004001100210000000000141019f000003ea0420009c000003ea02008041000000c002200210000000000112019f000000000203004b000008f60000c13d0000000c02000029000008fa0000013d000000400200043d0000001f0430018f0000000505300272000007a60000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b000007a20000c13d000000000604004b000005040000613d000004f70000013d0000000a0330006a00000413011001c700008009020000390000000d0400002900000000050000190fa40f9a0000040f00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b000007b80000c13d00000060010000390000008004000039000007e20000013d0000001f013000390000042d011001970000003f011000390000042d04100197000000400100043d0000000004410019000000000514004b00000000050000190000000105004039000004020640009c00000a870000213d000000010550019000000a870000c13d000000400040043f0000001f0530018f000000000431043600000003060003670000000507300272000007d30000613d00000005087002100000000008840019000000000906034f000000000a040019000000009b09043c000000000aba0436000000000b8a004b000007cf0000c13d000000000805004b000007e20000613d0000000507700210000000000676034f00000000077400190000000305500210000000000807043300000000085801cf000000000858022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000585019f000000000057043500000001022001900000088f0000613d000000400200043d00000417010000410000000001120436000c00000001001d000d00000002001d00000004012000390000000602000029000000000021043500000000010004140000000e02000029000000040220008c0000081f0000613d0000000d03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000418011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000c090000290000080c0000613d000000000601034f0000000d07000029000000006806043c0000000007870436000000000897004b000008080000c13d000000000604004b0000081b0000613d0000000505500210000000000651034f0000000d055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000102200190000009da0000613d0000001f013000390000042d011001970000000d04100029000000000214004b00000000020000190000000102004039000c00000004001d000004020440009c00000a870000213d000000010220019000000a870000c13d0000000c02000029000000400020043f000004040230009c00000a280000213d000000200230008c00000a280000413d0000000c0200002900000004022000390000000d040000290000000004040433000000080440006b00000aba0000813d00000417040000410000000c050000290000000004450436000d00000004001d0000000604000029000000000042043500000000020004140000000e04000029000000040440008c000008710000613d0000000c03000029000003ea0130009c000003ea0100004100000000010340190000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000418011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000d090000290000085c0000613d000000000601034f0000000c07000029000000006806043c0000000007870436000000000897004b000008580000c13d000000000604004b0000086b0000613d0000000505500210000000000651034f0000000c055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000b6c0000613d0000001f0130003900000419011001970000000c02100029000000000112004b00000000010000190000000101004039000004020420009c00000a870000213d000000010110019000000a870000c13d000000400020043f000000200130008c00000a280000413d0000000c010000290000000001010433000000080410006c000000660000413d000000080110006a000000240420003900000000001404350000041b01000041000000000012043500000004012000390000000004000411000000000041043500000000010004140000000e04000029000000040440008c00000d140000c13d0000000001020433000000000010043500000d3f0000013d000003ea0240009c000003ea04008041000000400240021000000ef50000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f0000040b011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000103ea0030019d000003ea033001970003000000010355000000010220019000000a2a0000613d0000001f013000390000042d021001970000000601200029000000000221004b00000000020000190000000102004039000004020410009c000008ca0000a13d00000a870000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000409011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000103ea0030019d000003ea033001970003000000010355000000010220019000000a390000613d0000001f013000390000042d021001970000000601200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040130009c00000a280000213d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000101043b0000000002000416000600000001001d000000000121004b000000660000413d000000400100043d0000004402100039000000090300002900000000003204350000002402100039000000000300041000000000003204350000040d02000041000000000021043500000004021000390000000003000411000000000032043500000000020004140000000d03000029000000040330008c00000aee0000c13d000000010200003900000000010104330000000000100435000000010300003100000b180000013d00000413011001c700008009020000390000000c0400002900000000050000190fa40f9a0000040f000700000002001d00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b000009050000c13d000000600100003900000080020000390000092f0000013d0000001f013000390000042d011001970000003f011000390000042d02100197000000400100043d0000000002210019000000000412004b00000000040000190000000104004039000004020520009c00000a870000213d000000010440019000000a870000c13d000000400020043f0000001f0430018f000000000231043600000003050003670000000506300272000009200000613d00000005076002100000000007720019000000000805034f0000000009020019000000008a08043c0000000009a90436000000000a79004b0000091c0000c13d000000000704004b0000092f0000613d0000000506600210000000000565034f00000000066200190000000304400210000000000706043300000000074701cf000000000747022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000474019f00000000004604350000000704000029000000010440019000000ef20000613d000000400400043d00000024014000390000000c02000029000000000021043500000414010000410000000001140436000b00000001001d000c00000004001d00000004014000390000000402000029000000000021043500000000010004140000000e02000029000000040220008c000009700000613d0000000c03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000b090000290000095d0000613d000000000601034f0000000c07000029000000006806043c0000000007870436000000000897004b000009590000c13d000000000604004b0000096c0000613d0000000505500210000000000651034f0000000c055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000a8d0000613d0000001f013000390000042d011001970000000c04100029000000000214004b00000000020000190000000102004039000e00000004001d000004020440009c00000a870000213d000000010220019000000a870000c13d0000000e02000029000000400020043f000000200230008c00000a280000413d0000000e0200002900000004022000390000000c040000290000000004040433000000000404004b00000ade0000c13d00000417040000410000000e050000290000000004450436000c00000004001d0000000404000029000000000042043500000000020004140000000d04000029000000040440008c000009c00000613d0000000e03000029000003ea0130009c000003ea0100004100000000010340190000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000418011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000c09000029000009ab0000613d000000000601034f0000000e07000029000000006806043c0000000007870436000000000897004b000009a70000c13d000000000604004b000009ba0000613d0000000505500210000000000651034f0000000e055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000c4f0000613d0000001f0130003900000419011001970000000e01100029000004020210009c00000a870000213d000000400010043f000000200230008c00000a280000413d000000240210003900000004041000390000000e050000290000000005050433000000060650006c00000efb0000a13d0000041b06000041000000000061043500000000060004110000000000640435000000060450006a000000000042043500000000020004140000000d04000029000000040440008c00000de10000c13d00000001020000390000000001010433000000000010043500000e0b0000013d000000400200043d0000001f0430018f00000005053002720000000505500210000009e60000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b000009e20000c13d000000000604004b000005040000613d000004f80000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f0000040b011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000103ea0030019d000003ea033001970003000000010355000000010220019000000a9c0000613d0000001f013000390000042d011001970000000602100029000000000112004b00000000010000190000000101004039000600000002001d000004020220009c00000a220000a13d00000a870000013d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000409011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000103ea0030019d000003ea033001970003000000010355000000010220019000000aab0000613d0000001f013000390000042d011001970000000602100029000000000112004b00000000010000190000000101004039000600000002001d000004020220009c00000a870000213d000000010110019000000a870000c13d0000000601000029000000400010043f000004040130009c00000a480000a13d000000000100001900000fa600010430000000400200043d0000001f0430018f0000000505300272000000050550021000000a360000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000a320000c13d000000000604004b000005040000613d000004f80000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000a450000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000a410000c13d000000000604004b000005040000613d000004f80000013d000004170100004100000006020000290000000001120436000400000001001d00000004012000390000000502000029000000000021043500000000010004140000000d02000029000000040220008c00000a820000613d0000000603000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000418011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000000040900002900000a6f0000613d000000000601034f0000000607000029000000006806043c0000000007870436000000000897004b00000a6b0000c13d000000000604004b00000a7e0000613d0000000505500210000000000651034f00000006055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000b410000613d0000001f013000390000042d011001970000000601100029000004020210009c00000ac50000a13d000004230100004100000000001004350000004101000039000000040010043f000004180100004100000fa600010430000000400200043d0000001f0430018f000000050530027200000a990000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000a950000c13d000000000604004b000005040000613d000004f70000013d000000400200043d0000001f0430018f000000050530027200000aa80000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000aa40000c13d000000000604004b000005040000613d000004f70000013d000000400200043d0000001f0430018f000000050530027200000ab70000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000ab30000c13d000000000604004b000005040000613d000004f70000013d000003ee010000410000000c0300002900000000001304350000002001000039000000000012043500000044013000390000041a0200004100000000002104350000002401300039000000090200003900000ae80000013d000000400010043f000000200230008c00000a280000413d00000006020000290000000002020433000600000002001d0000004402100039000000090400002900000000004204350000002402100039000000000400041000000000004204350000040d02000041000000000021043500000004021000390000000004000411000000000042043500000000020004140000000e04000029000000040440008c00000be80000c13d00000001020000390000000001010433000000000010043500000c120000013d000003ee010000410000000e03000029000000000013043500000020010000390000000000120435000000440130003900000415020000410000000000210435000000240130003900000012020000390000000000210435000003ea0130009c000003ea0300804100000040013002100000040e011001c700000fa600010430000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f0000040e011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000b070000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000b030000c13d000000000605004b00000b150000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000600001900000001060060390000001f0130008c00000000070000190000000107002039000000000103004b00000000080000190000000108006039000000400100043d00000024041000390000000405100039000000010220019000000b380000613d000000000276016f000000000228019f000000010220019000000b380000613d000004100200004100000000002104350000000c0200002900000000002504350000000902000029000000000024043500000000020004140000000d04000029000000040440008c00000b7b0000c13d00000001020000390000000001010433000000000010043500000ba50000013d000003ee020000410000000000210435000000200200003900000000002504350000001402000039000000000024043500000044021000390000040f0300004100000e250000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000b4d0000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000b490000c13d000000000604004b000005040000613d000004f80000013d0000000003210049000000080100006b00000c3d0000c13d00000000010004140000000002000411000000040220008c00000f960000613d000003ea0210009c000003ea01008041000000c00110021000000413011001c70000800902000039000000000400041100000000050000190fa40f9a0000040f00000000030100190000006003300270000103ea0030019d0003000000010355000000010120019000000f960000c13d000000400100043d0000004402100039000004220300004100000000003204350000002402100039000000130300003900000e200000013d000000400200043d0000001f0430018f000000050530027200000b780000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000b740000c13d000000000604004b000005040000613d000004f70000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000b940000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000b900000c13d000000000605004b00000ba20000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000400001900000001040060390000001f0130008c00000000050000190000000105002039000000000103004b00000000060000190000000106006039000000400100043d000000010220019000000ddb0000613d000000000254016f000000000226019f000000010220019000000ddb0000613d0000000b050000290000001f0250018f0000000a0400002900000002044003670000000505500272000000050550021000000bc30000613d0000000006510019000000000704034f0000000008010019000000007907043c0000000008980436000000000968004b00000bbf0000c13d000000000602004b00000bd10000613d000000000454034f00000000055100190000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f00000000002504350000000b02100029000000000002043500000000020004140000000c04000029000000040440008c00000c690000613d0000000b04000029000003ea0340009c000003ea040080410000006003400210000003ea0410009c000003ea010080410000004001100210000000000131019f000003ea0320009c000003ea02008041000000c002200210000000000112019f0000000002000416000000000202004b00000c5e0000c13d0000000c0200002900000c630000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f0000040e011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000c010000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000bfd0000c13d000000000605004b00000c0f0000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000100001900000001010060390000001f0430008c00000000040000190000000104002039000000000503004b00000000050000190000000105006039000000010220019000000c360000613d000000000141016f000000000115019f000000010110019000000c360000613d0000000802000029000000090120006b000000660000413d00000008020000290000000902200069000000400100043d000000240410003900000000002404350000041002000041000000000021043500000004021000390000000c04000029000000000042043500000000020004140000000e04000029000000040440008c00000d6e0000c13d00000001020000390000000001010433000000000010043500000d980000013d000000400100043d00000044021000390000040f0300004100000000003204350000002402100039000000140300003900000e200000013d0000042e21300129000000080110006c000000660000413d00000008213000b9000004161210012a000000000123004b000000660000413d00000000010004140000000004000411000000040440008c00000f960000613d000003ea0410009c000003ea01008041000000c001100210000000000423004b00000f8b0000c13d000000000200041100000f900000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000c5b0000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000c570000c13d000000000604004b000005040000613d000004f80000013d00000413011001c7000080090200003900000000030004160000000c0400002900000000050000190fa40f9a0000040f000800000002001d00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b00000ce30000c13d00000060010000390000000802000029000000010220019000000d0f0000613d000000400400043d00000024014000390000000c02000029000000000021043500000414010000410000000001140436000c00000001001d0000000001000410000003ed01100197000e00000004001d0000000402400039000000000012043500000000010004140000000d02000029000000040220008c00000cae0000613d0000000e03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000c0900002900000c9b0000613d000000000601034f0000000e07000029000000006806043c0000000007870436000000000897004b00000c970000c13d000000000604004b00000caa0000613d0000000505500210000000000651034f0000000e055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000e2b0000613d0000001f013000390000042d021001970000000e01200029000000000221004b00000000020000190000000102004039000004020410009c00000a870000213d000000010220019000000a870000c13d000000400010043f000004040230009c00000a280000213d000000200230008c00000a280000413d0000000e020000290000000002020433000000000202004b00000cdd0000c13d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d00000000030004160000000602300069000000000101043b000000000321004b000000660000413d000000000321004b000006ea0000613d0000000003210049000000070100006b00000f400000c13d00000000010004140000000002000411000000040220008c00000b570000c13d00000f960000013d0000004402100039000004150300004100000000003204350000002402100039000000120300003900000e200000013d0000001f013000390000042d011001970000003f011000390000042d02100197000000400100043d0000000002210019000000000412004b00000000040000190000000104004039000004020520009c00000a870000213d000000010440019000000a870000c13d000000400020043f0000001f0230018f0000000004310436000e00000004001d0000000304000367000000050530027200000cff0000613d00000005065002100000000e080000290000000006680019000000000704034f000000007907043c0000000008980436000000000968004b00000cfb0000c13d000000000602004b00000c6c0000613d0000000505500210000000000454034f0000000e055000290000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f000000000025043500000c6c0000013d0000000e03000029000003ea0230009c000003ea03008041000000400230021000000ef50000013d000003ea0320009c000003ea020080410000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000e020000290fa40f9a0000040f000900000002001d00000000020100190000006002200270000003ea03200197000000200230008c000000200200003900000000020340190000001f0420018f000000050220027200000d2e0000613d000000000501034f0000000006000019000000005705043c000000000806004b000000000676043600000d2a0000c13d000000000504004b00000d3c0000613d00000003044002100000000502200210000000000502043300000000054501cf000000000545022f000000000621034f000000000606043b0000010004400089000000000646022f00000000044601cf000000000454019f0000000000420435000100000003001f00030000000103550000000001000433000000010110008c000000000100001900000001010060390000001f0230008c00000000020000190000000102002039000000000303004b000000000300001900000001030060390000000904000029000000010440019000000e1a0000613d000000000121016f000000000113019f000000010110019000000e1a0000613d0000040c010000410000000000100439000000000100041000000004001004430000000001000414000003ea0210009c000003ea01008041000000c00110021000000407011001c70000800a020000390fa40f9f0000040f000000010220019000000d6d0000613d000000000201043b0000000a0120006c000000660000413d000000000300041600000007013000690000000a0220006a000000000312004b00000f960000a13d00000000040004140000000003000411000000040330008c00000f960000613d0000000003120049000003ea0140009c000003ea04008041000000c00140021000000b5a0000013d000000000001042f000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000e020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000d870000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000d830000c13d000000000605004b00000d950000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000400001900000001040060390000001f0130008c00000000050000190000000105002039000000000103004b00000000060000190000000106006039000000400100043d000000010220019000000ddb0000613d000000000254016f000000000226019f000000010220019000000ddb0000613d0000000b050000290000001f0250018f0000000a0400002900000002044003670000000505500272000000050550021000000db60000613d0000000006510019000000000704034f0000000008010019000000007907043c0000000008980436000000000968004b00000db20000c13d000000000602004b00000dc40000613d000000000454034f00000000055100190000000302200210000000000605043300000000062601cf000000000626022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000262019f00000000002504350000000b02100029000000000002043500000000020004140000000c04000029000000040440008c00000e440000613d00000000030004160000000b05000029000003ea0450009c000003ea050080410000006004500210000003ea0510009c000003ea010080410000004001100210000000000141019f000003ea0420009c000003ea02008041000000c002200210000000000112019f000000000203004b00000e3a0000c13d0000000c0200002900000e3e0000013d00000044021000390000041203000041000000000032043500000024021000390000000e0300003900000e200000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000dfa0000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000df60000c13d000000000605004b00000e080000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000001000433000000010110008c000000000100001900000001010060390000001f0430008c00000000040000190000000104002039000000000303004b00000000030000190000000103006039000000010220019000000e1a0000613d000000000141016f000000000113019f000000010110019000000f960000c13d000000400100043d00000044021000390000042103000041000000000032043500000024021000390000000f030000390000000000320435000003ee020000410000000000210435000000040210003900000020030000390000000000320435000003ea0210009c000003ea0100804100000040011002100000040e011001c700000fa600010430000000400200043d0000001f0430018f000000050530027200000e370000613d00000005065002100000000006620019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000e330000c13d000000000604004b000005040000613d000004f70000013d00000413011001c700008009020000390000000c0400002900000000050000190fa40f9a0000040f000700000002001d00030000000103550000006001100270000103ea0010019d000003ea03100197000000000103004b00000f040000c13d000000600100003900000080020000390000000704000029000000010440019000000ef20000613d000000400400043d00000024014000390000000c02000029000000000021043500000414010000410000000001140436000b00000001001d000c00000004001d00000004014000390000000502000029000000000021043500000000010004140000000e02000029000000040220008c00000e890000613d0000000c03000029000003ea0230009c000003ea0200004100000000020340190000004002200210000003ea0310009c000003ea01008041000000c001100210000000000121019f00000411011001c70000000e020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000000b0900002900000e760000613d000000000601034f0000000c07000029000000006806043c0000000007870436000000000897004b00000e720000c13d000000000604004b00000e850000613d0000000505500210000000000651034f0000000c055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000f2e0000613d0000001f013000390000042d011001970000000c04100029000000000214004b00000000020000190000000102004039000b00000004001d000004020440009c00000a870000213d000000010220019000000a870000c13d0000000b02000029000000400020043f000000200230008c00000a280000413d0000000b0200002900000004022000390000000c040000290000000004040433000000000404004b00000f3d0000c13d00000417040000410000000b050000290000000004450436000e00000004001d0000000504000029000000000042043500000000020004140000000d04000029000000040440008c00000ed80000613d0000000b03000029000003ea0130009c000003ea0100004100000000010340190000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000418011001c70000000d020000290fa40f9f0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000ec30000613d000000000601034f0000000b07000029000000006806043c00000000078704360000000e0870006c00000ebf0000c13d000000000604004b00000ed20000613d0000000505500210000000000651034f0000000b055000290000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f0003000000010355000000010220019000000f510000613d0000001f0130003900000419011001970000000b01100029000004020210009c00000a870000213d000000400010043f000000200230008c00000a280000413d000000240210003900000004041000390000000b050000290000000005050433000000060650006c00000efb0000a13d0000041b06000041000000000061043500000000060004110000000000640435000000060450006a000000000042043500000000020004140000000d04000029000000040440008c00000f600000c13d00000001020000390000000001010433000000000010043500000f8a0000013d000003ea0320009c000003ea0200804100000040022002100000000001010433000003ea0310009c000003ea010080410000006001100210000000000121019f00000fa600010430000003ee030000410000000000310435000000200300003900000000003404350000000903000039000000000032043500000044021000390000041a0300004100000e250000013d0000001f013000390000042d011001970000003f011000390000042d02100197000000400100043d0000000002210019000000000412004b00000000040000190000000104004039000004020520009c00000a870000213d000000010440019000000a870000c13d000000400020043f0000001f0430018f000000000231043600000003050003670000000506300272000000050660021000000f1f0000613d0000000007620019000000000805034f0000000009020019000000008a08043c0000000009a90436000000000a79004b00000f1b0000c13d000000000704004b00000e480000613d000000000565034f00000000066200190000000304400210000000000706043300000000074701cf000000000747022f000000000505043b0000010004400089000000000545022f00000000044501cf000000000474019f000000000046043500000e480000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000f3a0000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000f360000c13d000000000604004b000005040000613d000004f80000013d000003ee010000410000000b0300002900000ae00000013d0000042e21300129000000070110006c000000660000413d00000007213000b9000004161210012a000000000123004b000000660000413d00000000010004140000000004000411000000040440008c00000f960000613d000003ea0410009c000003ea01008041000000c001100210000000000423004b00000f8b0000c13d00000c4d0000013d000000400200043d0000001f0430018f0000000505300272000000050550021000000f5d0000613d0000000006520019000000000701034f0000000008020019000000007907043c0000000008980436000000000968004b00000f590000c13d000000000604004b000005040000613d000004f80000013d000003ea0310009c000003ea010080410000004001100210000003ea0320009c000003ea02008041000000c002200210000000000112019f00000411011001c70000000d020000290fa40f9a0000040f00000000030100190000006003300270000003ea03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000f790000613d000000000601034f0000000007000019000000006806043c000000000907004b000000000787043600000f750000c13d000000000605004b00000f870000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f0003000000010355000000000100043300000e0b0000013d000000000323004900000413011001c70000800902000039000000000400041100000000050000190fa40f9a0000040f00030000000103550000006001100270000103ea0010019d000000010120019000000b650000613d0000000101000039000000000010041b000003700000013d000000000001042f00000f9d002104210000000102000039000000000001042d0000000002000019000000000001042d00000fa2002104230000000102000039000000000001042d0000000002000019000000000001042d00000fa40000043200000fa50001042e00000fa600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff08c379a0000000000000000000000000000000000000000000000000000000004e4f5f52454345495645000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000800000000000000000000000000000000000000000000000000000000000000000000000008da5cb5a00000000000000000000000000000000000000000000000000000000b0480bbc00000000000000000000000000000000000000000000000000000000b0480bbd00000000000000000000000000000000000000000000000000000000b309383800000000000000000000000000000000000000000000000000000000f2fde38b000000000000000000000000000000000000000000000000000000008da5cb5b0000000000000000000000000000000000000000000000000000000097bbda0e00000000000000000000000000000000000000000000000000000000999b6464000000000000000000000000000000000000000000000000000000003c2b9a7c000000000000000000000000000000000000000000000000000000003c2b9a7d0000000000000000000000000000000000000000000000000000000055e4b7be0000000000000000000000000000000000000000000000000000000083c4a19d0000000000000000000000000000000000000000000000000000000001e33667000000000000000000000000000000000000000000000000000000001b9a91a40200000000000000000000000000000000000000000000800000000000000000b532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c53414d455f4f574e455200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff02000000000000000000000000000000000000400000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff1f1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000008fcbaf0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104000000000000000000000000d505accf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e40000000000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f3923b872dd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000005452414e534645525f46524f4d5f4641494c4544000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000415050524f56455f4641494c45440000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000414c4c4f57414e43455f4e4f545f5a45524f00000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000070a0823100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffe04e4f5f544f4b454e530000000000000000000000000000000000000000000000a9059cbb000000000000000000000000000000000000000000000000000000004e4f5f4554485f4241434b000000000000000000000000000000000000000000393b8be3e26787f19285ecd039dfd80bc6507828750f4d50367e6efe2524695cb907822409611d127ab6a64611591b98e03a6a85ade4f258bae26b7c1efdfeaf000000000000000000000000000000000000002000000080000000000000000000000000000000000000000000000000000000200000000000000000000000005452414e534645525f4641494c454400000000000000000000000000000000004554485f5452414e534645525f4641494c4544000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000005441524745545f4e4f545f4155544800000000000000000000000000000000004e4f4e5f5245454e5452414e540000000000000000000000000000000000000002000000000000000000000000000000000000200000000000000000000000008455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b4f4e4c595f4f574e45520000000000000000000000000000000000000000000000000000000000000000000000000000000000440000008000000000000000008210728e7c071f615b840ee026032693858fbcd5e5359e67e438c890f59e56205a45524f5f414444524553530000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000a477bf07e6873b2ec363e5ddff43ebf9ef5b19bfabde2e0e43ddbdb51dbf443
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$13.33
Net Worth in ETH
0.004509
Token Allocations
ETH
95.09%
CHECK
3.95%
WETH
0.95%
Multichain Portfolio | 35 Chains
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.