Latest 25 from a total of 1,841 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Pay | 24585526 | 3 hrs ago | IN | 0.00701 ETH | 0.0000624 | ||||
| Pay | 24583987 | 8 hrs ago | IN | 0.12 ETH | 0.00009522 | ||||
| Pay | 24583854 | 8 hrs ago | IN | 0.00734 ETH | 0.0000093 | ||||
| Pay | 24583281 | 10 hrs ago | IN | 0.00724 ETH | 0.00005627 | ||||
| Pay | 24583125 | 11 hrs ago | IN | 0 ETH | 0.00009359 | ||||
| Pay | 24581385 | 17 hrs ago | IN | 0.128 ETH | 0.00000188 | ||||
| Pay | 24581362 | 17 hrs ago | IN | 0 ETH | 0.00001094 | ||||
| Pay | 24581322 | 17 hrs ago | IN | 0 ETH | 0.00001371 | ||||
| Pay | 24579884 | 22 hrs ago | IN | 0.00763 ETH | 0.00002078 | ||||
| Pay | 24577178 | 31 hrs ago | IN | 0.0909 ETH | 0.00005035 | ||||
| Pay | 24576871 | 32 hrs ago | IN | 0 ETH | 0.00002131 | ||||
| Pay | 24576243 | 34 hrs ago | IN | 0 ETH | 0.0000115 | ||||
| Pay | 24576141 | 34 hrs ago | IN | 0.0233 ETH | 0.0000184 | ||||
| Pay | 24575920 | 35 hrs ago | IN | 0 ETH | 0.00002662 | ||||
| Pay | 24575708 | 36 hrs ago | IN | 0.0076 ETH | 0.00020747 | ||||
| Pay | 24575453 | 37 hrs ago | IN | 0 ETH | 0.00000875 | ||||
| Pay | 24575380 | 37 hrs ago | IN | 0 ETH | 0.00000778 | ||||
| Pay | 24575231 | 37 hrs ago | IN | 0 ETH | 0.00000461 | ||||
| Pay | 24574875 | 39 hrs ago | IN | 0 ETH | 0.00002289 | ||||
| Pay | 24574849 | 39 hrs ago | IN | 0 ETH | 0.00001171 | ||||
| Pay | 24572807 | 45 hrs ago | IN | 0.0171 ETH | 0.00000346 | ||||
| Pay | 24572688 | 46 hrs ago | IN | 0 ETH | 0.00000884 | ||||
| Pay | 24572664 | 46 hrs ago | IN | 0.00737 ETH | 0.00020891 | ||||
| Pay | 24572052 | 2 days ago | IN | 0.225 ETH | 0.00000674 | ||||
| Pay | 24571634 | 2 days ago | IN | 0 ETH | 0.00006839 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24585526 | 3 hrs ago | 0.00000697 ETH | ||||
| Multicall | 24585526 | 3 hrs ago | 0.00701 ETH | ||||
| Transfer | 24583987 | 8 hrs ago | 0.1182 ETH | ||||
| Transfer | 24583854 | 8 hrs ago | 0.0072299 ETH | ||||
| Transfer | 24583281 | 10 hrs ago | 0.00000646 ETH | ||||
| Multicall | 24583281 | 10 hrs ago | 0.00724 ETH | ||||
| Transfer | 24581385 | 17 hrs ago | 0.12608 ETH | ||||
| Transfer | 24579884 | 22 hrs ago | 0.0000087 ETH | ||||
| Multicall | 24579884 | 22 hrs ago | 0.00763 ETH | ||||
| Transfer | 24577178 | 31 hrs ago | 0.00003194 ETH | ||||
| Multicall | 24577178 | 31 hrs ago | 0.0909 ETH | ||||
| Transfer | 24576141 | 34 hrs ago | 0.0000833 ETH | ||||
| Multicall | 24576141 | 34 hrs ago | 0.0233 ETH | ||||
| Transfer | 24575708 | 36 hrs ago | 0.00000897 ETH | ||||
| Multicall | 24575708 | 36 hrs ago | 0.0076 ETH | ||||
| Transfer | 24572807 | 45 hrs ago | 0.0168435 ETH | ||||
| Transfer | 24572664 | 46 hrs ago | 0.00000932 ETH | ||||
| Multicall | 24572664 | 46 hrs ago | 0.00737 ETH | ||||
| Transfer | 24572052 | 2 days ago | 0.221625 ETH | ||||
| Transfer | 24570214 | 2 days ago | 0.0956435 ETH | ||||
| Transfer | 24569798 | 2 days ago | 0.192075 ETH | ||||
| Transfer | 24568137 | 2 days ago | 0.00000261 ETH | ||||
| Multicall | 24568137 | 2 days ago | 0.00776 ETH | ||||
| Transfer | 24566478 | 2 days ago | 0.00005138 ETH | ||||
| Multicall | 24566478 | 2 days ago | 0.0873 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DePayRouterV3
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2025-03-21
*/
// Dependency file: @openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
// pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// Dependency file: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
// pragma solidity ^0.8.0;
// import "@openzeppelin/contracts/utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// Dependency file: @openzeppelin/contracts/access/Ownable2Step.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
// pragma solidity ^0.8.0;
// import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}
// Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
// pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}
// Dependency file: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/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);
}
// Dependency file: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
// pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// Dependency file: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
// pragma solidity ^0.8.0;
// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
// import "@openzeppelin/contracts/utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
// Dependency file: contracts/interfaces/IPermit2.sol
// pragma solidity 0.8.26;
interface IPermit2 {
struct PermitDetails {
address token;
uint160 amount;
uint48 expiration;
uint48 nonce;
}
struct PermitSingle {
PermitDetails details;
address spender;
uint256 sigDeadline;
}
struct PermitTransferFrom {
TokenPermissions permitted;
uint256 nonce;
uint256 deadline;
}
struct TokenPermissions {
address token;
uint256 amount;
}
struct SignatureTransferDetails {
address to;
uint256 requestedAmount;
}
function permit(address owner, PermitSingle memory permitSingle, bytes calldata signature) external;
function transferFrom(address from, address to, uint160 amount, address token) external;
function permitTransferFrom(PermitTransferFrom memory permit, SignatureTransferDetails calldata transferDetails, address owner, bytes calldata signature) external;
function allowance(address user, address token, address spender) external view returns (uint160 amount, uint48 expiration, uint48 nonce);
}
// Dependency file: contracts/interfaces/IDePayRouterV3.sol
// pragma solidity 0.8.26;
// import 'contracts/interfaces/IPermit2.sol';
interface IDePayRouterV3 {
struct Payment {
uint256 amountIn;
uint256 paymentAmount;
uint256 feeAmount;
uint256 feeAmount2;
uint256 protocolAmount;
uint256 deadline; // in milliseconds!
address tokenInAddress;
address exchangeAddress;
address tokenOutAddress;
address paymentReceiverAddress;
address feeReceiverAddress;
address feeReceiverAddress2;
uint8 exchangeType;
uint8 receiverType;
bool permit2;
bytes exchangeCallData;
bytes receiverCallData;
}
struct Balance {
uint256 inBefore;
uint256 inAfter;
uint256 outBefore;
uint256 outAfter;
}
struct PermitTransferFromAndSignature {
IPermit2.PermitTransferFrom permitTransferFrom;
bytes signature;
}
function pay(
Payment calldata payment
) external payable returns(bool);
function pay(
IDePayRouterV3.Payment calldata payment,
PermitTransferFromAndSignature calldata permitTransferFromAndSignature
) external payable returns(bool);
function pay(
IDePayRouterV3.Payment calldata payment,
IPermit2.PermitSingle calldata permitSingle,
bytes calldata signature
) external payable returns(bool);
function enable(address exchange, bool enabled) external returns(bool);
function withdraw(address token, uint amount) external returns(bool);
}
// Dependency file: contracts/interfaces/IDePayForwarderV3.sol
// pragma solidity 0.8.26;
// import 'contracts/interfaces/IDePayRouterV3.sol';
interface IDePayForwarderV3 {
function forward(
IDePayRouterV3.Payment calldata payment
) external payable returns(bool);
function toggle(bool stop) external returns(bool);
}
// Root file: contracts/DePayRouterV3.sol
pragma solidity 0.8.26;
// import "@openzeppelin/contracts/access/Ownable2Step.sol";
// import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
// import 'contracts/interfaces/IDePayForwarderV3.sol';
// import 'contracts/interfaces/IDePayRouterV3.sol';
// import 'contracts/interfaces/IPermit2.sol';
/// @title DePayRouterV3
/// @notice This contract handles payments and token conversions.
/// @dev Inherit from Ownable2Step for ownership functionalities.
contract DePayRouterV3 is Ownable2Step {
using SafeERC20 for IERC20;
// Custom errors
error PaymentDeadlineReached(); // 0x17e0bcd9
error WrongAmountPaidIn(); // 0xed0842e3
error ExchangeNotApproved(); // 0xc35a3932
error ExchangeCallMissing(); // 0x6b8072c9
error ExchangeCallFailed(); // 0x6d8040c3
error ForwardingPaymentFailed(); // 0xc797a224
error NativePaymentFailed(); // 0xc7abb1a2
error NativeFeePaymentFailed(); // 0x9f06170c
error PaymentToZeroAddressNotAllowed(); // 0xec3a80da
error InsufficientBalanceInAfterPayment(); // 0x84257541
error InsufficientBalanceOutAfterPayment(); // 0x808b9612
error InsufficientProtocolAmount(); // 0x8e1ebd3a
/// @notice Address representing the NATIVE token (e.g. ETH, BNB, MATIC, etc.)
address constant NATIVE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
/// @notice Address of PERMIT2
address public immutable PERMIT2;
/// @notice Address of the payment FORWARDER contract
address public immutable FORWARDER;
/// @notice List of approved exchanges for conversion.
mapping (address => bool) public exchanges;
/// @dev Initializes the contract with PERMIT2 and FORWARDER addresses.
/// @param _PERMIT2 The address of the PERMIT2 contract.
/// @param _FORWARDER The address of the FORWARDER contract.
constructor (address _PERMIT2, address _FORWARDER) {
PERMIT2 = _PERMIT2;
FORWARDER = _FORWARDER;
}
/// @notice Accepts NATIVE payments, which is required in order to swap from and to NATIVE, especially unwrapping as part of conversions.
receive() external payable {}
/// @dev Payment event.
event Payment(
address indexed from,
address indexed to,
uint256 indexed deadline, // in milliseconds!
uint256 amountIn,
uint256 paymentAmount,
uint256 feeAmount,
uint256 feeAmount2,
uint256 protocolAmount,
uint256 slippageInAmount,
uint256 slippageOutAmount,
address tokenInAddress,
address tokenOutAddress,
address feeReceiverAddress,
address feeReceiverAddress2
);
/// @dev Handles the payment process (tokenIn approval for router has been granted prior).
/// @param payment The payment data.
/// @return Returns true if successful.
function _pay(
IDePayRouterV3.Payment calldata payment
) internal returns(bool){
IDePayRouterV3.Balance memory balance = IDePayRouterV3.Balance(0,0,0,0);
_validatePreConditions(payment, balance);
_payIn(payment);
_performPayment(payment);
_validatePostConditions(payment, balance);
_emit(payment, balance);
return true;
}
/// @notice Handles the payment process for external callers.
/// @param payment The payment data.
/// @return Returns true if successful.
function pay(
IDePayRouterV3.Payment calldata payment
) external payable returns(bool){
return _pay(payment);
}
/// @dev Handles the payment process with permit2 SignatureTransfer.
/// @param payment The payment data.
/// @param permitTransferFromAndSignature The PermitTransferFrom and signature.
/// @return Returns true if successful.
function _pay(
IDePayRouterV3.Payment calldata payment,
IDePayRouterV3.PermitTransferFromAndSignature calldata permitTransferFromAndSignature
) internal returns(bool){
IDePayRouterV3.Balance memory balance = IDePayRouterV3.Balance(0,0,0,0);
_validatePreConditions(payment, balance);
_payIn(payment, permitTransferFromAndSignature);
_performPayment(payment);
_validatePostConditions(payment, balance);
_emit(payment, balance);
return true;
}
/// @notice Handles the payment process with permit2 SignatureTransfer for external callers.
/// @param payment The payment data.
/// @param permitTransferFromAndSignature The PermitTransferFrom and signature.
/// @return Returns true if successful.
function pay(
IDePayRouterV3.Payment calldata payment,
IDePayRouterV3.PermitTransferFromAndSignature calldata permitTransferFromAndSignature
) external payable returns(bool){
return _pay(payment, permitTransferFromAndSignature);
}
/// @dev Handles the payment process with permit2 AllowanceTransfer.
/// @param payment The payment data.
/// @param permitSingle The permit single data.
/// @param signature The permit signature.
/// @return Returns true if successful.
function _pay(
IDePayRouterV3.Payment calldata payment,
IPermit2.PermitSingle calldata permitSingle,
bytes calldata signature
) internal returns(bool){
IDePayRouterV3.Balance memory balance = IDePayRouterV3.Balance(0,0,0,0);
_validatePreConditions(payment, balance);
_permit(permitSingle, signature);
_payIn(payment);
_performPayment(payment);
_validatePostConditions(payment, balance);
_emit(payment, balance);
return true;
}
/// @notice Handles the payment process with permit2 AllowanceTransfer for external callers.
/// @param payment The payment data.
/// @param permitSingle The permit single data.
/// @param signature The permit signature.
/// @return Returns true if successful.
function pay(
IDePayRouterV3.Payment calldata payment,
IPermit2.PermitSingle calldata permitSingle,
bytes calldata signature
) external payable returns(bool){
return _pay(payment, permitSingle, signature);
}
/// @dev Validates the pre-conditions for a payment.
/// @param payment The payment data.
function _validatePreConditions(
IDePayRouterV3.Payment calldata payment,
IDePayRouterV3.Balance memory balance
) internal view {
// Make sure payment deadline (in milliseconds!) has not been passed, yet
if(payment.deadline < block.timestamp * 1000) {
revert PaymentDeadlineReached();
}
// Store tokenIn balance prior to payment
if(payment.tokenInAddress == NATIVE) {
balance.inBefore = address(this).balance - msg.value;
} else {
balance.inBefore = IERC20(payment.tokenInAddress).balanceOf(address(this));
}
// Store tokenOut balance prior to payment
if(payment.tokenOutAddress == NATIVE) {
balance.outBefore = address(this).balance - msg.value;
} else {
balance.outBefore = IERC20(payment.tokenOutAddress).balanceOf(address(this));
}
}
/// @dev Handles permit2 operations.
/// @param permitSingle The permit single data.
/// @param signature The permit signature.
function _permit(
IPermit2.PermitSingle calldata permitSingle,
bytes calldata signature
) internal {
IPermit2(PERMIT2).permit(
msg.sender, // owner
permitSingle,
signature
);
}
/// @dev Processes the payIn operations.
/// @param payment The payment data.
function _payIn(
IDePayRouterV3.Payment calldata payment
) internal {
if(payment.tokenInAddress == NATIVE) {
// Make sure that the sender has paid in the correct token & amount
if(msg.value != payment.amountIn) {
revert WrongAmountPaidIn();
}
} else if(payment.permit2) {
IPermit2(PERMIT2).transferFrom(msg.sender, address(this), uint160(payment.amountIn), payment.tokenInAddress);
} else {
IERC20(payment.tokenInAddress).safeTransferFrom(msg.sender, address(this), payment.amountIn);
}
}
/// @dev Processes the payIn operations (exlusively for permit2 SignatureTransfer).
/// @param payment The payment data.
/// @param permitTransferFromAndSignature permitTransferFromAndSignature for permit2 permitTransferFrom.
function _payIn(
IDePayRouterV3.Payment calldata payment,
IDePayRouterV3.PermitTransferFromAndSignature calldata permitTransferFromAndSignature
) internal {
IPermit2(PERMIT2).permitTransferFrom(
permitTransferFromAndSignature.permitTransferFrom,
IPermit2.SignatureTransferDetails({
to: address(this),
requestedAmount: payment.amountIn
}),
msg.sender,
permitTransferFromAndSignature.signature
);
}
/// @dev Processes the payment.
/// @param payment The payment data.
function _performPayment(IDePayRouterV3.Payment calldata payment) internal {
// Perform conversion if required
if(payment.exchangeAddress != address(0)) {
_convert(payment);
}
// Perform payment to paymentReceiver
_payReceiver(payment);
// Perform payment to feeReceiver
if(payment.feeReceiverAddress != address(0)) {
_payFee(payment);
}
// Perform payment to feeReceiver2
if(payment.feeReceiverAddress2 != address(0)) {
_payFee2(payment);
}
}
/// @dev Validates the post-conditions for a payment.
/// @param payment The payment data.
function _validatePostConditions(
IDePayRouterV3.Payment calldata payment,
IDePayRouterV3.Balance memory balance
) internal view {
// Ensure balances of tokenIn remained
if(payment.tokenInAddress == NATIVE) {
balance.inAfter = address(this).balance;
} else {
balance.inAfter = IERC20(payment.tokenInAddress).balanceOf(address(this));
}
if(balance.inAfter < balance.inBefore) {
revert InsufficientBalanceInAfterPayment();
}
// Ensure balances of tokenOut remained
if(payment.tokenOutAddress == NATIVE) {
balance.outAfter = address(this).balance;
} else {
balance.outAfter = IERC20(payment.tokenOutAddress).balanceOf(address(this));
}
if(balance.outAfter < balance.outBefore) {
revert InsufficientBalanceOutAfterPayment();
}
// Ensure protocolAmount remained within router
if(payment.protocolAmount > 0) {
if((balance.outAfter - payment.protocolAmount) < balance.outBefore) {
revert InsufficientProtocolAmount();
}
}
}
/// @dev Emits payment event.
/// @param payment The payment data.
function _emit(
IDePayRouterV3.Payment calldata payment,
IDePayRouterV3.Balance memory balance
) internal {
emit Payment(
// from
msg.sender,
// to
payment.paymentReceiverAddress,
// deadline in milliseconds!
payment.deadline,
// amountIn
payment.amountIn,
// paymentAmount
payment.paymentAmount,
// feeAmount
payment.feeAmount,
// feeAmount2
payment.feeAmount2,
// protocolAmount
payment.protocolAmount,
// slippageInAmount
payment.tokenInAddress != payment.tokenOutAddress ? balance.inAfter - balance.inBefore : balance.inAfter - balance.inBefore - payment.protocolAmount,
// slippageOutAmount
payment.tokenInAddress != payment.tokenOutAddress ? balance.outAfter - balance.outBefore - payment.protocolAmount : 0,
// tokenInAddress
payment.tokenInAddress,
// tokenOutAddress
payment.tokenOutAddress,
// feeReceiverAddress
payment.feeReceiverAddress,
// feeReceiverAddress2
payment.feeReceiverAddress2
);
}
/// @dev Handles token conversions.
/// @param payment The payment data.
function _convert(IDePayRouterV3.Payment calldata payment) internal {
if(!exchanges[payment.exchangeAddress]) {
revert ExchangeNotApproved();
}
bool success;
if(payment.tokenInAddress == NATIVE) {
if(payment.exchangeCallData.length == 0) {
revert ExchangeCallMissing();
}
(success,) = payment.exchangeAddress.call{value: msg.value}(payment.exchangeCallData);
} else {
if(payment.exchangeType == 1) { // pull
IERC20(payment.tokenInAddress).safeApprove(payment.exchangeAddress, payment.amountIn);
} else if(payment.exchangeType == 2) { // push
IERC20(payment.tokenInAddress).safeTransfer(payment.exchangeAddress, payment.amountIn);
}
(success,) = payment.exchangeAddress.call(payment.exchangeCallData);
if(payment.exchangeType == 1) { // pull
IERC20(payment.tokenInAddress).safeApprove(payment.exchangeAddress, 0);
}
}
if(!success){
revert ExchangeCallFailed();
}
}
/// @dev Processes payment to receiver.
/// @param payment The payment data.
function _payReceiver(IDePayRouterV3.Payment calldata payment) internal {
if(payment.receiverType != 0) { // call receiver contract
{
bool success;
if(payment.tokenOutAddress == NATIVE) {
success = IDePayForwarderV3(FORWARDER).forward{value: payment.paymentAmount}(payment);
} else {
IERC20(payment.tokenOutAddress).safeTransfer(FORWARDER, payment.paymentAmount);
success = IDePayForwarderV3(FORWARDER).forward(payment);
}
if(!success) {
revert ForwardingPaymentFailed();
}
}
} else { // just send payment to address
if(payment.tokenOutAddress == NATIVE) {
if(payment.paymentReceiverAddress == address(0)){
revert PaymentToZeroAddressNotAllowed();
}
(bool success,) = payment.paymentReceiverAddress.call{value: payment.paymentAmount}(new bytes(0));
if(!success) {
revert NativePaymentFailed();
}
} else {
IERC20(payment.tokenOutAddress).safeTransfer(payment.paymentReceiverAddress, payment.paymentAmount);
}
}
}
/// @dev Processes fee payments.
/// @param payment The payment data.
function _payFee(IDePayRouterV3.Payment calldata payment) internal {
if(payment.tokenOutAddress == NATIVE) {
(bool success,) = payment.feeReceiverAddress.call{value: payment.feeAmount}(new bytes(0));
if(!success) {
revert NativeFeePaymentFailed();
}
} else {
IERC20(payment.tokenOutAddress).safeTransfer(payment.feeReceiverAddress, payment.feeAmount);
}
}
/// @dev Processes fee2 payments.
/// @param payment The payment data.
function _payFee2(IDePayRouterV3.Payment calldata payment) internal {
if(payment.tokenOutAddress == NATIVE) {
(bool success,) = payment.feeReceiverAddress2.call{value: payment.feeAmount2}(new bytes(0));
if(!success) {
revert NativeFeePaymentFailed();
}
} else {
IERC20(payment.tokenOutAddress).safeTransfer(payment.feeReceiverAddress2, payment.feeAmount2);
}
}
/// @dev Event emitted if new exchange has been enabled.
event Enabled(
address indexed exchange
);
/// @dev Event emitted if an exchange has been disabled.
event Disabled(
address indexed exchange
);
/// @notice Enables or disables an exchange.
/// @param exchange The address of the exchange.
/// @param enabled A boolean value to enable or disable the exchange.
/// @return Returns true if successful.
function enable(address exchange, bool enabled) external onlyOwner returns(bool) {
exchanges[exchange] = enabled;
if(enabled) {
emit Enabled(exchange);
} else {
emit Disabled(exchange);
}
return true;
}
/// @notice Allows the owner to withdraw accidentally sent tokens.
/// @param token The token address.
/// @param amount The amount to withdraw.
function withdraw(
address token,
uint amount
) external onlyOwner returns(bool) {
if(token == NATIVE) {
(bool success,) = address(msg.sender).call{value: amount}(new bytes(0));
require(success, 'DePay: withdraw failed!');
} else {
IERC20(token).safeTransfer(msg.sender, amount);
}
return true;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_PERMIT2","type":"address"},{"internalType":"address","name":"_FORWARDER","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ExchangeCallFailed","type":"error"},{"inputs":[],"name":"ExchangeCallMissing","type":"error"},{"inputs":[],"name":"ExchangeNotApproved","type":"error"},{"inputs":[],"name":"ForwardingPaymentFailed","type":"error"},{"inputs":[],"name":"InsufficientBalanceInAfterPayment","type":"error"},{"inputs":[],"name":"InsufficientBalanceOutAfterPayment","type":"error"},{"inputs":[],"name":"InsufficientProtocolAmount","type":"error"},{"inputs":[],"name":"NativeFeePaymentFailed","type":"error"},{"inputs":[],"name":"NativePaymentFailed","type":"error"},{"inputs":[],"name":"PaymentDeadlineReached","type":"error"},{"inputs":[],"name":"PaymentToZeroAddressNotAllowed","type":"error"},{"inputs":[],"name":"WrongAmountPaidIn","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"exchange","type":"address"}],"name":"Disabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"exchange","type":"address"}],"name":"Enabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"deadline","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippageInAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippageOutAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenInAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOutAddress","type":"address"},{"indexed":false,"internalType":"address","name":"feeReceiverAddress","type":"address"},{"indexed":false,"internalType":"address","name":"feeReceiverAddress2","type":"address"}],"name":"Payment","type":"event"},{"inputs":[],"name":"FORWARDER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exchange","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount2","type":"uint256"},{"internalType":"uint256","name":"protocolAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"tokenInAddress","type":"address"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"address","name":"tokenOutAddress","type":"address"},{"internalType":"address","name":"paymentReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress2","type":"address"},{"internalType":"uint8","name":"exchangeType","type":"uint8"},{"internalType":"uint8","name":"receiverType","type":"uint8"},{"internalType":"bool","name":"permit2","type":"bool"},{"internalType":"bytes","name":"exchangeCallData","type":"bytes"},{"internalType":"bytes","name":"receiverCallData","type":"bytes"}],"internalType":"struct IDePayRouterV3.Payment","name":"payment","type":"tuple"},{"components":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPermit2.TokenPermissions","name":"permitted","type":"tuple"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct IPermit2.PermitTransferFrom","name":"permitTransferFrom","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IDePayRouterV3.PermitTransferFromAndSignature","name":"permitTransferFromAndSignature","type":"tuple"}],"name":"pay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount2","type":"uint256"},{"internalType":"uint256","name":"protocolAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"tokenInAddress","type":"address"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"address","name":"tokenOutAddress","type":"address"},{"internalType":"address","name":"paymentReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress2","type":"address"},{"internalType":"uint8","name":"exchangeType","type":"uint8"},{"internalType":"uint8","name":"receiverType","type":"uint8"},{"internalType":"bool","name":"permit2","type":"bool"},{"internalType":"bytes","name":"exchangeCallData","type":"bytes"},{"internalType":"bytes","name":"receiverCallData","type":"bytes"}],"internalType":"struct IDePayRouterV3.Payment","name":"payment","type":"tuple"}],"name":"pay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount2","type":"uint256"},{"internalType":"uint256","name":"protocolAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"tokenInAddress","type":"address"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"address","name":"tokenOutAddress","type":"address"},{"internalType":"address","name":"paymentReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress2","type":"address"},{"internalType":"uint8","name":"exchangeType","type":"uint8"},{"internalType":"uint8","name":"receiverType","type":"uint8"},{"internalType":"bool","name":"permit2","type":"bool"},{"internalType":"bytes","name":"exchangeCallData","type":"bytes"},{"internalType":"bytes","name":"receiverCallData","type":"bytes"}],"internalType":"struct IDePayRouterV3.Payment","name":"payment","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint160","name":"amount","type":"uint160"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"uint48","name":"nonce","type":"uint48"}],"internalType":"struct IPermit2.PermitDetails","name":"details","type":"tuple"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"sigDeadline","type":"uint256"}],"internalType":"struct IPermit2.PermitSingle","name":"permitSingle","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"pay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405234801561000f575f80fd5b50604051612c1c380380612c1c83398101604081905261002e916100d4565b6100373361004e565b6001600160a01b039182166080521660a052610105565b600180546001600160a01b03191690556100678161006a565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100cf575f80fd5b919050565b5f80604083850312156100e5575f80fd5b6100ee836100b9565b91506100fc602084016100b9565b90509250929050565b60805160a051612acc6101505f395f81816101ee01528181611973015281816119fb0152611a6e01525f818161011501528181610b96015281816112d401526114130152612acc5ff3fe6080604052600436106100d1575f3560e01c8063ca2ad9731161007c578063e30c397811610057578063e30c397814610236578063ec97364214610260578063f2fde38b1461027f578063f3fef3a31461029e575f80fd5b8063ca2ad973146101dd578063cac7130c14610210578063e277a94814610223575f80fd5b80637412dbb3116100ac5780637412dbb31461017257806379ba5097146101a05780638da5cb5b146101b4575f80fd5b806364f0acc4146100dc5780636afdd85014610104578063715018a61461015c575f80fd5b366100d857005b5f80fd5b6100ef6100ea36600461229e565b6102bd565b60405190151581526020015b60405180910390f35b34801561010f575f80fd5b506101377f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fb565b348015610167575f80fd5b506101706102d1565b005b34801561017d575f80fd5b506100ef61018c36600461233a565b60026020525f908152604090205460ff1681565b3480156101ab575f80fd5b506101706102e4565b3480156101bf575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610137565b3480156101e8575f80fd5b506101377f000000000000000000000000000000000000000000000000000000000000000081565b6100ef61021e36600461235c565b61039e565b6100ef61023136600461238e565b6103a8565b348015610241575f80fd5b5060015473ffffffffffffffffffffffffffffffffffffffff16610137565b34801561026b575f80fd5b506100ef61027a366004612474565b6103c0565b34801561028a575f80fd5b5061017061029936600461233a565b6104af565b3480156102a9575f80fd5b506100ef6102b83660046124a0565b61055e565b5f6102c88383610695565b90505b92915050565b6102d96106f2565b6102e25f610772565b565b600154339073ffffffffffffffffffffffffffffffffffffffff168114610392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e6572000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61039b81610772565b50565b5f6102cb826107a3565b5f6103b5858585856107f5565b90505b949350505050565b5f6103c96106f2565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683158015919091179091556104655760405173ffffffffffffffffffffffffffffffffffffffff8416907f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d12905f90a26104a6565b60405173ffffffffffffffffffffffffffffffffffffffff8416907ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe905f90a25b50600192915050565b6104b76106f2565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556105195f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6105676106f2565b7fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff84160161067457604080515f80825260208201909252339084906040516105c491906124ca565b5f6040518083038185875af1925050503d805f81146105fe576040519150601f19603f3d011682016040523d82523d5f602084013e610603565b606091505b505090508061066e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f44655061793a207769746864726177206661696c6564210000000000000000006044820152606401610389565b506104a6565b6104a673ffffffffffffffffffffffffffffffffffffffff8416338461085e565b604080516080810182525f80825260208201819052918101829052606081018290526106c18482610937565b6106cb8484610b6b565b6106d484610c1e565b6106de8482610ccb565b6106e88482610f89565b5060019392505050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146102e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610389565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561039b816111b8565b604080516080810182525f80825260208201819052918101829052606081018290526107cf8382610937565b6107d88361122c565b6107e183610c1e565b6107eb8382610ccb565b6104a68382610f89565b604080516080810182525f80825260208201819052918101829052606081018290526108218682610937565b61082c8585856113d6565b6108358661122c565b61083e86610c1e565b6108488682610ccb565b6108528682610f89565b50600195945050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109329084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611480565b505050565b610943426103e861250d565b8260a001351015610980576040517f17e0bcd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6109a560e0840160c0850161233a565b73ffffffffffffffffffffffffffffffffffffffff16036109d1576109ca3447612524565b8152610a72565b6109e160e0830160c0840161233a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610a4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6f9190612537565b81525b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610a996101208401610100850161233a565b73ffffffffffffffffffffffffffffffffffffffff1603610ac757610abe3447612524565b60408201525050565b610ad96101208301610100840161233a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abe9190612537565b5050565b604080518082019091523081528235602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906330f28b7a90839033610bcd608084018461254e565b6040518663ffffffff1660e01b8152600401610bed9594939291906125fd565b5f604051808303815f87803b158015610c04575f80fd5b505af1158015610c16573d5f803e3d5ffd5b505050505050565b5f610c30610100830160e0840161233a565b73ffffffffffffffffffffffffffffffffffffffff1614610c5457610c548161158d565b610c5d816118d9565b5f610c706101608301610140840161233a565b73ffffffffffffffffffffffffffffffffffffffff1614610c9457610c9481611cb0565b5f610ca76101808301610160840161233a565b73ffffffffffffffffffffffffffffffffffffffff161461039b5761039b81611e00565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610cf060e0840160c0850161233a565b73ffffffffffffffffffffffffffffffffffffffff1603610d1657476020820152610dba565b610d2660e0830160c0840161233a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610d90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db49190612537565b60208201525b805160208201511015610df9576040517f8425754100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610e206101208401610100850161233a565b73ffffffffffffffffffffffffffffffffffffffff1603610e4657476060820152610eec565b610e586101208301610100840161233a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610ec2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee69190612537565b60608201525b806040015181606001511015610f2e576040517f808b961200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608082013515610b6757806040015182608001358260600151610f519190612524565b1015610b67576040517f8e1ebd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0820135610fa06101408401610120850161233a565b73ffffffffffffffffffffffffffffffffffffffff16337f0da53976db14f563aaa3ce5c693eacf31c09d283b88ef40d7485db88f3da8463853560208701356040880135606089013560808a01356110006101208c016101008d0161233a565b73ffffffffffffffffffffffffffffffffffffffff1661102660e08d0160c08e0161233a565b73ffffffffffffffffffffffffffffffffffffffff160361106657895160208b015160808d01359161105791612524565b6110619190612524565b611077565b895160208b01516110779190612524565b6110896101208d016101008e0161233a565b73ffffffffffffffffffffffffffffffffffffffff166110af60e08e0160c08f0161233a565b73ffffffffffffffffffffffffffffffffffffffff16036110d0575f6110f3565b8b608001358b604001518c606001516110e99190612524565b6110f39190612524565b61110360e08e0160c08f0161233a565b8d610100016020810190611117919061233a565b8e61014001602081019061112b919061233a565b8f61016001602081019061113f919061233a565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015273ffffffffffffffffffffffffffffffffffffffff90811660e0860152908116610100850152908116610120840152166101408201526101600160405180910390a45050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61125160e0830160c0840161233a565b73ffffffffffffffffffffffffffffffffffffffff16036112a6573481351461039b576040517fed0842e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112b86101e082016101c08301612670565b156113a15773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166336c785163330843561130d60e0870160c0880161233a565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152908316604483015290911660648201526084015f604051808303815f87803b158015611388575f80fd5b505af115801561139a573d5f803e3d5ffd5b5050505050565b61039b333083356113b860e0860160c0870161233a565b73ffffffffffffffffffffffffffffffffffffffff16929190611ea2565b6040517f2b67b57000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632b67b5709061144e9033908790879087906004016126a0565b5f604051808303815f87803b158015611465575f80fd5b505af1158015611477573d5f803e3d5ffd5b50505050505050565b5f6114e1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f069092919063ffffffff16565b905080515f14806115015750808060200190518101906115019190612795565b610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610389565b60025f6115a1610100840160e0850161233a565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205460ff16611600576040517fc35a393200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61162660e0840160c0850161233a565b73ffffffffffffffffffffffffffffffffffffffff16036117175761164f6101e083018361254e565b90505f03611689576040517f6b8072c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61169a610100830160e0840161233a565b73ffffffffffffffffffffffffffffffffffffffff16346116bf6101e085018561254e565b6040516116cd9291906127b0565b5f6040518083038185875af1925050503d805f8114611707576040519150601f19603f3d011682016040523d82523d5f602084013e61170c565b606091505b5050809150506118a2565b6117296101a0830161018084016127cf565b60ff1660010361177b57611776611747610100840160e0850161233a565b833561175960e0860160c0870161233a565b73ffffffffffffffffffffffffffffffffffffffff169190611f14565b6117da565b61178d6101a0830161018084016127cf565b60ff166002036117da576117da6117ab610100840160e0850161233a565b83356117bd60e0860160c0870161233a565b73ffffffffffffffffffffffffffffffffffffffff16919061085e565b6117eb610100830160e0840161233a565b73ffffffffffffffffffffffffffffffffffffffff1661180f6101e084018461254e565b60405161181d9291906127b0565b5f604051808303815f865af19150503d805f8114611856576040519150601f19603f3d011682016040523d82523d5f602084013e61185b565b606091505b5090915061187390506101a0830161018084016127cf565b60ff166001036118a2576118a2611891610100840160e0850161233a565b5f61175960e0860160c0870161233a565b80610b67576040517f6d8040c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118eb6101c082016101a083016127cf565b60ff1615611b1d575f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61191b6101208401610100850161233a565b73ffffffffffffffffffffffffffffffffffffffff16036119f6576040517f6db0f57700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636db0f577906020850135906119ae908690600401612848565b60206040518083038185885af11580156119ca573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906119ef9190612795565b9050611ae6565b611a317f000000000000000000000000000000000000000000000000000000000000000060208401356117bd6101208601610100870161233a565b6040517f6db0f57700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636db0f57790611aa3908590600401612848565b6020604051808303815f875af1158015611abf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae39190612795565b90505b80610b67576040517fc797a22400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611b446101208301610100840161233a565b73ffffffffffffffffffffffffffffffffffffffff1603611c84575f611b726101408301610120840161233a565b73ffffffffffffffffffffffffffffffffffffffff1603611bbf576040517f3943f6f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bd26101408301610120840161233a565b604080515f815260208082019283905273ffffffffffffffffffffffffffffffffffffffff939093169285013591611c0a91906124ca565b5f6040518083038185875af1925050503d805f8114611c44576040519150601f19603f3d011682016040523d82523d5f602084013e611c49565b606091505b5050905080610b67576040517fc7abb1a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61039b611c996101408301610120840161233a565b60208301356117bd6101208501610100860161233a565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611cd76101208301610100840161233a565b73ffffffffffffffffffffffffffffffffffffffff1603611dd4575f611d056101608301610140840161233a565b73ffffffffffffffffffffffffffffffffffffffff1660408301355f5b6040519080825280601f01601f191660200182016040528015611d4c576020820181803683370190505b50604051611d5a91906124ca565b5f6040518083038185875af1925050503d805f8114611d94576040519150601f19603f3d011682016040523d82523d5f602084013e611d99565b606091505b5050905080610b67576040517f9f06170c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61039b611de96101608301610140840161233a565b60408301356117bd6101208501610100860161233a565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611e276101208301610100840161233a565b73ffffffffffffffffffffffffffffffffffffffff1603611e76575f611e556101808301610160840161233a565b73ffffffffffffffffffffffffffffffffffffffff1660608301355f611d22565b61039b611e8b6101808301610160840161233a565b60608301356117bd6101208501610100860161233a565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f009085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016108b0565b50505050565b60606103b884845f85612094565b801580611fb257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fb09190612537565b155b61203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610389565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109329084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016108b0565b606082471015612126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610389565b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161214e91906124ca565b5f6040518083038185875af1925050503d805f8114612188576040519150601f19603f3d011682016040523d82523d5f602084013e61218d565b606091505b509150915061219e878383876121a9565b979650505050505050565b6060831561223e5782515f036122375773ffffffffffffffffffffffffffffffffffffffff85163b612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610389565b50816103b8565b6103b883838151156122535781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103899190612a43565b5f6102208284031215612298575f80fd5b50919050565b5f80604083850312156122af575f80fd5b823567ffffffffffffffff8111156122c5575f80fd5b6122d185828601612287565b925050602083013567ffffffffffffffff8111156122ed575f80fd5b830160a081860312156122fe575f80fd5b809150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8116811461039b575f80fd5b803561233581612309565b919050565b5f6020828403121561234a575f80fd5b813561235581612309565b9392505050565b5f6020828403121561236c575f80fd5b813567ffffffffffffffff811115612382575f80fd5b6103b884828501612287565b5f805f808486036101008112156123a3575f80fd5b853567ffffffffffffffff8111156123b9575f80fd5b6123c588828901612287565b95505060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820112156123f7575f80fd5b5060208501925060e085013567ffffffffffffffff811115612417575f80fd5b8501601f81018713612427575f80fd5b803567ffffffffffffffff81111561243d575f80fd5b87602082840101111561244e575f80fd5b949793965060200194505050565b801515811461039b575f80fd5b80356123358161245c565b5f8060408385031215612485575f80fd5b823561249081612309565b915060208301356122fe8161245c565b5f80604083850312156124b1575f80fd5b82356124bc81612309565b946020939093013593505050565b5f82518060208501845e5f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176102cb576102cb6124e0565b818103818111156102cb576102cb6124e0565b5f60208284031215612547575f80fd5b5051919050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612581575f80fd5b83018035915067ffffffffffffffff82111561259b575f80fd5b6020019150368190038213156125af575f80fd5b9250929050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f863561260981612309565b73ffffffffffffffffffffffffffffffffffffffff9081168352602088810135818501526040808a0135908501526060808a01359085015287518216608085015287015160a0840152851660c083015261010060e0830181905261219e90830184866125b6565b5f60208284031215612680575f80fd5b81356123558161245c565b803565ffffffffffff81168114612335575f80fd5b73ffffffffffffffffffffffffffffffffffffffff851681525f84356126c581612309565b73ffffffffffffffffffffffffffffffffffffffff811660208401525060208501356126f081612309565b73ffffffffffffffffffffffffffffffffffffffff811660408401525065ffffffffffff6127206040870161268b565b16606083015265ffffffffffff6127396060870161268b565b166080830152608085013561274d81612309565b73ffffffffffffffffffffffffffffffffffffffff1660a08381019190915285013560c083015261010060e0830181905261278b90830184866125b6565b9695505050505050565b5f602082840312156127a5575f80fd5b81516123558161245c565b818382375f9101908152919050565b803560ff81168114612335575f80fd5b5f602082840312156127df575f80fd5b6102c8826127bf565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261281b575f80fd5b830160208101925035905067ffffffffffffffff81111561283a575f80fd5b8036038213156125af575f80fd5b602080825282358282015282013560408083019190915282013560608083019190915282013560808083019190915282013560a08083019190915282013560c0808301919091525f9061289c90840161232a565b73ffffffffffffffffffffffffffffffffffffffff811660e0840152506128c560e0840161232a565b73ffffffffffffffffffffffffffffffffffffffff8116610100840152506128f0610100840161232a565b73ffffffffffffffffffffffffffffffffffffffff81166101208401525061291b610120840161232a565b73ffffffffffffffffffffffffffffffffffffffff811661014084015250612946610140840161232a565b73ffffffffffffffffffffffffffffffffffffffff811661016084015250612971610160840161232a565b73ffffffffffffffffffffffffffffffffffffffff81166101808401525061299c61018084016127bf565b60ff81166101a0840152506129b46101a084016127bf565b60ff81166101c0840152506129cc6101c08401612469565b8015156101e0840152506129e46101e08401846127e8565b6102206102008501526129fc610240850182846125b6565b915050612a0d6102008501856127e8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030161022086015261278b8382846125b6565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509291505056fea264697066735822122008649dcd7b859b4a0abb6ded18fbafd9937725fc69600f3561d82ef1fdd7042b64736f6c634300081a0033000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba300000000000000000000000061e1b824f97cde70b73438481ecc8a5ca380eb87
Deployed Bytecode
0x6080604052600436106100d1575f3560e01c8063ca2ad9731161007c578063e30c397811610057578063e30c397814610236578063ec97364214610260578063f2fde38b1461027f578063f3fef3a31461029e575f80fd5b8063ca2ad973146101dd578063cac7130c14610210578063e277a94814610223575f80fd5b80637412dbb3116100ac5780637412dbb31461017257806379ba5097146101a05780638da5cb5b146101b4575f80fd5b806364f0acc4146100dc5780636afdd85014610104578063715018a61461015c575f80fd5b366100d857005b5f80fd5b6100ef6100ea36600461229e565b6102bd565b60405190151581526020015b60405180910390f35b34801561010f575f80fd5b506101377f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba381565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fb565b348015610167575f80fd5b506101706102d1565b005b34801561017d575f80fd5b506100ef61018c36600461233a565b60026020525f908152604090205460ff1681565b3480156101ab575f80fd5b506101706102e4565b3480156101bf575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610137565b3480156101e8575f80fd5b506101377f00000000000000000000000061e1b824f97cde70b73438481ecc8a5ca380eb8781565b6100ef61021e36600461235c565b61039e565b6100ef61023136600461238e565b6103a8565b348015610241575f80fd5b5060015473ffffffffffffffffffffffffffffffffffffffff16610137565b34801561026b575f80fd5b506100ef61027a366004612474565b6103c0565b34801561028a575f80fd5b5061017061029936600461233a565b6104af565b3480156102a9575f80fd5b506100ef6102b83660046124a0565b61055e565b5f6102c88383610695565b90505b92915050565b6102d96106f2565b6102e25f610772565b565b600154339073ffffffffffffffffffffffffffffffffffffffff168114610392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e6572000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61039b81610772565b50565b5f6102cb826107a3565b5f6103b5858585856107f5565b90505b949350505050565b5f6103c96106f2565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683158015919091179091556104655760405173ffffffffffffffffffffffffffffffffffffffff8416907f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d12905f90a26104a6565b60405173ffffffffffffffffffffffffffffffffffffffff8416907ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe905f90a25b50600192915050565b6104b76106f2565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556105195f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f6105676106f2565b7fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff84160161067457604080515f80825260208201909252339084906040516105c491906124ca565b5f6040518083038185875af1925050503d805f81146105fe576040519150601f19603f3d011682016040523d82523d5f602084013e610603565b606091505b505090508061066e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f44655061793a207769746864726177206661696c6564210000000000000000006044820152606401610389565b506104a6565b6104a673ffffffffffffffffffffffffffffffffffffffff8416338461085e565b604080516080810182525f80825260208201819052918101829052606081018290526106c18482610937565b6106cb8484610b6b565b6106d484610c1e565b6106de8482610ccb565b6106e88482610f89565b5060019392505050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146102e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610389565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561039b816111b8565b604080516080810182525f80825260208201819052918101829052606081018290526107cf8382610937565b6107d88361122c565b6107e183610c1e565b6107eb8382610ccb565b6104a68382610f89565b604080516080810182525f80825260208201819052918101829052606081018290526108218682610937565b61082c8585856113d6565b6108358661122c565b61083e86610c1e565b6108488682610ccb565b6108528682610f89565b50600195945050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109329084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611480565b505050565b610943426103e861250d565b8260a001351015610980576040517f17e0bcd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6109a560e0840160c0850161233a565b73ffffffffffffffffffffffffffffffffffffffff16036109d1576109ca3447612524565b8152610a72565b6109e160e0830160c0840161233a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610a4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6f9190612537565b81525b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610a996101208401610100850161233a565b73ffffffffffffffffffffffffffffffffffffffff1603610ac757610abe3447612524565b60408201525050565b610ad96101208301610100840161233a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abe9190612537565b5050565b604080518082019091523081528235602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba316906330f28b7a90839033610bcd608084018461254e565b6040518663ffffffff1660e01b8152600401610bed9594939291906125fd565b5f604051808303815f87803b158015610c04575f80fd5b505af1158015610c16573d5f803e3d5ffd5b505050505050565b5f610c30610100830160e0840161233a565b73ffffffffffffffffffffffffffffffffffffffff1614610c5457610c548161158d565b610c5d816118d9565b5f610c706101608301610140840161233a565b73ffffffffffffffffffffffffffffffffffffffff1614610c9457610c9481611cb0565b5f610ca76101808301610160840161233a565b73ffffffffffffffffffffffffffffffffffffffff161461039b5761039b81611e00565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610cf060e0840160c0850161233a565b73ffffffffffffffffffffffffffffffffffffffff1603610d1657476020820152610dba565b610d2660e0830160c0840161233a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610d90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db49190612537565b60208201525b805160208201511015610df9576040517f8425754100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610e206101208401610100850161233a565b73ffffffffffffffffffffffffffffffffffffffff1603610e4657476060820152610eec565b610e586101208301610100840161233a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610ec2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee69190612537565b60608201525b806040015181606001511015610f2e576040517f808b961200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608082013515610b6757806040015182608001358260600151610f519190612524565b1015610b67576040517f8e1ebd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0820135610fa06101408401610120850161233a565b73ffffffffffffffffffffffffffffffffffffffff16337f0da53976db14f563aaa3ce5c693eacf31c09d283b88ef40d7485db88f3da8463853560208701356040880135606089013560808a01356110006101208c016101008d0161233a565b73ffffffffffffffffffffffffffffffffffffffff1661102660e08d0160c08e0161233a565b73ffffffffffffffffffffffffffffffffffffffff160361106657895160208b015160808d01359161105791612524565b6110619190612524565b611077565b895160208b01516110779190612524565b6110896101208d016101008e0161233a565b73ffffffffffffffffffffffffffffffffffffffff166110af60e08e0160c08f0161233a565b73ffffffffffffffffffffffffffffffffffffffff16036110d0575f6110f3565b8b608001358b604001518c606001516110e99190612524565b6110f39190612524565b61110360e08e0160c08f0161233a565b8d610100016020810190611117919061233a565b8e61014001602081019061112b919061233a565b8f61016001602081019061113f919061233a565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015273ffffffffffffffffffffffffffffffffffffffff90811660e0860152908116610100850152908116610120840152166101408201526101600160405180910390a45050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61125160e0830160c0840161233a565b73ffffffffffffffffffffffffffffffffffffffff16036112a6573481351461039b576040517fed0842e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112b86101e082016101c08301612670565b156113a15773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3166336c785163330843561130d60e0870160c0880161233a565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152908316604483015290911660648201526084015f604051808303815f87803b158015611388575f80fd5b505af115801561139a573d5f803e3d5ffd5b5050505050565b61039b333083356113b860e0860160c0870161233a565b73ffffffffffffffffffffffffffffffffffffffff16929190611ea2565b6040517f2b67b57000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba31690632b67b5709061144e9033908790879087906004016126a0565b5f604051808303815f87803b158015611465575f80fd5b505af1158015611477573d5f803e3d5ffd5b50505050505050565b5f6114e1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f069092919063ffffffff16565b905080515f14806115015750808060200190518101906115019190612795565b610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610389565b60025f6115a1610100840160e0850161233a565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205460ff16611600576040517fc35a393200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61162660e0840160c0850161233a565b73ffffffffffffffffffffffffffffffffffffffff16036117175761164f6101e083018361254e565b90505f03611689576040517f6b8072c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61169a610100830160e0840161233a565b73ffffffffffffffffffffffffffffffffffffffff16346116bf6101e085018561254e565b6040516116cd9291906127b0565b5f6040518083038185875af1925050503d805f8114611707576040519150601f19603f3d011682016040523d82523d5f602084013e61170c565b606091505b5050809150506118a2565b6117296101a0830161018084016127cf565b60ff1660010361177b57611776611747610100840160e0850161233a565b833561175960e0860160c0870161233a565b73ffffffffffffffffffffffffffffffffffffffff169190611f14565b6117da565b61178d6101a0830161018084016127cf565b60ff166002036117da576117da6117ab610100840160e0850161233a565b83356117bd60e0860160c0870161233a565b73ffffffffffffffffffffffffffffffffffffffff16919061085e565b6117eb610100830160e0840161233a565b73ffffffffffffffffffffffffffffffffffffffff1661180f6101e084018461254e565b60405161181d9291906127b0565b5f604051808303815f865af19150503d805f8114611856576040519150601f19603f3d011682016040523d82523d5f602084013e61185b565b606091505b5090915061187390506101a0830161018084016127cf565b60ff166001036118a2576118a2611891610100840160e0850161233a565b5f61175960e0860160c0870161233a565b80610b67576040517f6d8040c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118eb6101c082016101a083016127cf565b60ff1615611b1d575f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61191b6101208401610100850161233a565b73ffffffffffffffffffffffffffffffffffffffff16036119f6576040517f6db0f57700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000061e1b824f97cde70b73438481ecc8a5ca380eb871690636db0f577906020850135906119ae908690600401612848565b60206040518083038185885af11580156119ca573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906119ef9190612795565b9050611ae6565b611a317f00000000000000000000000061e1b824f97cde70b73438481ecc8a5ca380eb8760208401356117bd6101208601610100870161233a565b6040517f6db0f57700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000061e1b824f97cde70b73438481ecc8a5ca380eb871690636db0f57790611aa3908590600401612848565b6020604051808303815f875af1158015611abf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae39190612795565b90505b80610b67576040517fc797a22400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611b446101208301610100840161233a565b73ffffffffffffffffffffffffffffffffffffffff1603611c84575f611b726101408301610120840161233a565b73ffffffffffffffffffffffffffffffffffffffff1603611bbf576040517f3943f6f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bd26101408301610120840161233a565b604080515f815260208082019283905273ffffffffffffffffffffffffffffffffffffffff939093169285013591611c0a91906124ca565b5f6040518083038185875af1925050503d805f8114611c44576040519150601f19603f3d011682016040523d82523d5f602084013e611c49565b606091505b5050905080610b67576040517fc7abb1a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61039b611c996101408301610120840161233a565b60208301356117bd6101208501610100860161233a565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611cd76101208301610100840161233a565b73ffffffffffffffffffffffffffffffffffffffff1603611dd4575f611d056101608301610140840161233a565b73ffffffffffffffffffffffffffffffffffffffff1660408301355f5b6040519080825280601f01601f191660200182016040528015611d4c576020820181803683370190505b50604051611d5a91906124ca565b5f6040518083038185875af1925050503d805f8114611d94576040519150601f19603f3d011682016040523d82523d5f602084013e611d99565b606091505b5050905080610b67576040517f9f06170c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61039b611de96101608301610140840161233a565b60408301356117bd6101208501610100860161233a565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611e276101208301610100840161233a565b73ffffffffffffffffffffffffffffffffffffffff1603611e76575f611e556101808301610160840161233a565b73ffffffffffffffffffffffffffffffffffffffff1660608301355f611d22565b61039b611e8b6101808301610160840161233a565b60608301356117bd6101208501610100860161233a565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f009085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016108b0565b50505050565b60606103b884845f85612094565b801580611fb257506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fb09190612537565b155b61203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610389565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109329084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016108b0565b606082471015612126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610389565b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161214e91906124ca565b5f6040518083038185875af1925050503d805f8114612188576040519150601f19603f3d011682016040523d82523d5f602084013e61218d565b606091505b509150915061219e878383876121a9565b979650505050505050565b6060831561223e5782515f036122375773ffffffffffffffffffffffffffffffffffffffff85163b612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610389565b50816103b8565b6103b883838151156122535781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103899190612a43565b5f6102208284031215612298575f80fd5b50919050565b5f80604083850312156122af575f80fd5b823567ffffffffffffffff8111156122c5575f80fd5b6122d185828601612287565b925050602083013567ffffffffffffffff8111156122ed575f80fd5b830160a081860312156122fe575f80fd5b809150509250929050565b73ffffffffffffffffffffffffffffffffffffffff8116811461039b575f80fd5b803561233581612309565b919050565b5f6020828403121561234a575f80fd5b813561235581612309565b9392505050565b5f6020828403121561236c575f80fd5b813567ffffffffffffffff811115612382575f80fd5b6103b884828501612287565b5f805f808486036101008112156123a3575f80fd5b853567ffffffffffffffff8111156123b9575f80fd5b6123c588828901612287565b95505060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820112156123f7575f80fd5b5060208501925060e085013567ffffffffffffffff811115612417575f80fd5b8501601f81018713612427575f80fd5b803567ffffffffffffffff81111561243d575f80fd5b87602082840101111561244e575f80fd5b949793965060200194505050565b801515811461039b575f80fd5b80356123358161245c565b5f8060408385031215612485575f80fd5b823561249081612309565b915060208301356122fe8161245c565b5f80604083850312156124b1575f80fd5b82356124bc81612309565b946020939093013593505050565b5f82518060208501845e5f920191825250919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176102cb576102cb6124e0565b818103818111156102cb576102cb6124e0565b5f60208284031215612547575f80fd5b5051919050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612581575f80fd5b83018035915067ffffffffffffffff82111561259b575f80fd5b6020019150368190038213156125af575f80fd5b9250929050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f863561260981612309565b73ffffffffffffffffffffffffffffffffffffffff9081168352602088810135818501526040808a0135908501526060808a01359085015287518216608085015287015160a0840152851660c083015261010060e0830181905261219e90830184866125b6565b5f60208284031215612680575f80fd5b81356123558161245c565b803565ffffffffffff81168114612335575f80fd5b73ffffffffffffffffffffffffffffffffffffffff851681525f84356126c581612309565b73ffffffffffffffffffffffffffffffffffffffff811660208401525060208501356126f081612309565b73ffffffffffffffffffffffffffffffffffffffff811660408401525065ffffffffffff6127206040870161268b565b16606083015265ffffffffffff6127396060870161268b565b166080830152608085013561274d81612309565b73ffffffffffffffffffffffffffffffffffffffff1660a08381019190915285013560c083015261010060e0830181905261278b90830184866125b6565b9695505050505050565b5f602082840312156127a5575f80fd5b81516123558161245c565b818382375f9101908152919050565b803560ff81168114612335575f80fd5b5f602082840312156127df575f80fd5b6102c8826127bf565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261281b575f80fd5b830160208101925035905067ffffffffffffffff81111561283a575f80fd5b8036038213156125af575f80fd5b602080825282358282015282013560408083019190915282013560608083019190915282013560808083019190915282013560a08083019190915282013560c0808301919091525f9061289c90840161232a565b73ffffffffffffffffffffffffffffffffffffffff811660e0840152506128c560e0840161232a565b73ffffffffffffffffffffffffffffffffffffffff8116610100840152506128f0610100840161232a565b73ffffffffffffffffffffffffffffffffffffffff81166101208401525061291b610120840161232a565b73ffffffffffffffffffffffffffffffffffffffff811661014084015250612946610140840161232a565b73ffffffffffffffffffffffffffffffffffffffff811661016084015250612971610160840161232a565b73ffffffffffffffffffffffffffffffffffffffff81166101808401525061299c61018084016127bf565b60ff81166101a0840152506129b46101a084016127bf565b60ff81166101c0840152506129cc6101c08401612469565b8015156101e0840152506129e46101e08401846127e8565b6102206102008501526129fc610240850182846125b6565b915050612a0d6102008501856127e8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030161022086015261278b8382846125b6565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509291505056fea264697066735822122008649dcd7b859b4a0abb6ded18fbafd9937725fc69600f3561d82ef1fdd7042b64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba300000000000000000000000061e1b824f97cde70b73438481ecc8a5ca380eb87
-----Decoded View---------------
Arg [0] : _PERMIT2 (address): 0x000000000022D473030F116dDEE9F6B43aC78BA3
Arg [1] : _FORWARDER (address): 0x61e1b824F97cDe70b73438481ECc8A5Ca380eB87
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3
Arg [1] : 00000000000000000000000061e1b824f97cde70b73438481ecc8a5ca380eb87
Deployed Bytecode Sourcemap
31460:15693:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35403:251;;;;;;:::i;:::-;;:::i;:::-;;;1101:14:1;;1094:22;1076:41;;1064:2;1049:18;35403:251:0;;;;;;;;32358:32;;;;;;;;;;;;;;;;;;1436:42:1;1424:55;;;1406:74;;1394:2;1379:18;32358:32:0;1260:226:1;2884:103:0;;;;;;;;;;;;;:::i;:::-;;32553:42;;;;;;;;;;-1:-1:-1;32553:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;5561:216;;;;;;;;;;;;;:::i;2243:87::-;;;;;;;;;;-1:-1:-1;2289:7:0;2316:6;;;2243:87;;32454:34;;;;;;;;;;;;;;;34269:127;;;;;;:::i;:::-;;:::i;36685:233::-;;;;;;:::i;:::-;;:::i;4649:101::-;;;;;;;;;;-1:-1:-1;4729:13:0;;;;4649:101;;46393:244;;;;;;;;;;-1:-1:-1;46393:244:0;;;;;:::i;:::-;;:::i;4949:181::-;;;;;;;;;;-1:-1:-1;4949:181:0;;;;;:::i;:::-;;:::i;46797:353::-;;;;;;;;;;-1:-1:-1;46797:353:0;;;;;:::i;:::-;;:::i;35403:251::-;35584:4;35603:45;35608:7;35617:30;35603:4;:45::i;:::-;35596:52;;35403:251;;;;;:::o;2884:103::-;2129:13;:11;:13::i;:::-;2949:30:::1;2976:1;2949:18;:30::i;:::-;2884:103::o:0;5561:216::-;4729:13;;804:10;;5662:24;4729:13;5662:24;;5654:78;;;;;;;4683:2:1;5654:78:0;;;4665:21:1;4722:2;4702:18;;;4695:30;4761:34;4741:18;;;4734:62;4832:11;4812:18;;;4805:39;4861:19;;5654:78:0;;;;;;;;;5743:26;5762:6;5743:18;:26::i;:::-;5603:174;5561:216::o;34269:127::-;34358:4;34377:13;34382:7;34377:4;:13::i;36685:233::-;36855:4;36874:38;36879:7;36888:12;36902:9;;36874:4;:38::i;:::-;36867:45;;36685:233;;;;;;;:::o;46393:244::-;46468:4;2129:13;:11;:13::i;:::-;46481:19:::1;::::0;::::1;;::::0;;;:9:::1;:19;::::0;;;;:29;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;46517:97:::1;;46543:17;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;46517:97;;;46588:18;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;46517:97;-1:-1:-1::0;46627:4:0::1;46393:244:::0;;;;:::o;4949:181::-;2129:13;:11;:13::i;:::-;5039::::1;:24:::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;5104:7:::1;2289::::0;2316:6;;;;2243:87;5104:7:::1;5079:43;;;;;;;;;;;;4949:181:::0;:::o;46797:353::-;46885:4;2129:13;:11;:13::i;:::-;46901:15;::::1;::::0;::::1;::::0;46898:229:::1;;46985:12;::::0;;46928::::1;46985::::0;;;::::1;::::0;::::1;::::0;;;46953:10:::1;::::0;46977:6;;46945:53:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46927:71;;;47015:7;47007:43;;;::::0;::::1;::::0;;5588:2:1;47007:43:0::1;::::0;::::1;5570:21:1::0;5627:2;5607:18;;;5600:30;5666:25;5646:18;;;5639:53;5709:18;;47007:43:0::1;5386:347:1::0;47007:43:0::1;46918:140;46898:229;;;47073:46;:26;::::0;::::1;47100:10;47112:6:::0;47073:26:::1;:46::i;34640:495::-:0;34868:31;;;;;;;;34814:4;34868:31;;;;;;;;;;;;;;;;;;;;;34906:40;34929:7;34868:31;34906:22;:40::i;:::-;34953:47;34960:7;34969:30;34953:6;:47::i;:::-;35007:24;35023:7;35007:15;:24::i;:::-;35038:41;35062:7;35071;35038:23;:41::i;:::-;35086:23;35092:7;35101;35086:5;:23::i;:::-;-1:-1:-1;35125:4:0;;34640:495;-1:-1:-1;;;34640:495:0:o;2408:132::-;2289:7;2316:6;2472:23;2316:6;804:10;2472:23;2464:68;;;;;;;5940:2:1;2464:68:0;;;5922:21:1;;;5959:18;;;5952:30;6018:34;5998:18;;;5991:62;6070:18;;2464:68:0;5738:356:1;5320:156:0;5410:13;5403:20;;;;;;5434:34;5459:8;5434:24;:34::i;33744:371::-;33880:31;;;;;;;;33826:4;33880:31;;;;;;;;;;;;;;;;;;;;;33918:40;33941:7;33880:31;33918:22;:40::i;:::-;33965:15;33972:7;33965:6;:15::i;:::-;33987:24;34003:7;33987:15;:24::i;:::-;34018:41;34042:7;34051;34018:23;:41::i;:::-;34066:23;34072:7;34081;34066:5;:23::i;35912:491::-;36129:31;;;;;;;;36075:4;36129:31;;;;;;;;;;;;;;;;;;;;;36167:40;36190:7;36129:31;36167:22;:40::i;:::-;36214:32;36222:12;36236:9;;36214:7;:32::i;:::-;36253:15;36260:7;36253:6;:15::i;:::-;36275:24;36291:7;36275:15;:24::i;:::-;36306:41;36330:7;36339;36306:23;:41::i;:::-;36354:23;36360:7;36369;36354:5;:23::i;:::-;-1:-1:-1;36393:4:0;;35912:491;-1:-1:-1;;;;;35912:491:0:o;21779:177::-;21889:58;;6303:42:1;6291:55;;21889:58:0;;;6273:74:1;6363:18;;;6356:34;;;21862:86:0;;21882:5;;21912:23;;6246:18:1;;21889:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21862:19;:86::i;:::-;21779:177;;;:::o;37020:847::-;37269:22;:15;37287:4;37269:22;:::i;:::-;37250:7;:16;;;:41;37247:94;;;37309:24;;;;;;;;;;;;;;37247:94;32275:42;37399:22;;;;;;;;:::i;:::-;:32;;;37396:203;;37461:33;37485:9;37461:21;:33;:::i;:::-;37442:52;;37396:203;;;37543:22;;;;;;;;:::i;:::-;37536:55;;;;;37585:4;37536:55;;;1406:74:1;37536:40:0;;;;;;;;1379:18:1;;37536:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37517:74;;37396:203;32275:42;37658:23;;;;;;;;:::i;:::-;:33;;;37655:207;;37722:33;37746:9;37722:21;:33;:::i;:::-;37702:17;;;:53;37020:847;;:::o;37655:207::-;37805:23;;;;;;;;:::i;:::-;37798:56;;;;;37848:4;37798:56;;;1406:74:1;37798:41:0;;;;;;;;1379:18:1;;37798:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37655:207::-;37020:847;;:::o;39129:483::-;39415:116;;;;;;;;;39472:4;39415:116;;39505:16;;39415:116;;;;39312:36;39321:7;39312:36;;;;39357:30;;39540:10;39559:40;;;;39357:30;39559:40;:::i;:::-;39312:294;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39129:483;;:::o;39693:528::-;39852:1;39817:23;;;;;;;;:::i;:::-;:37;;;39814:76;;39865:17;39874:7;39865:8;:17::i;:::-;39941:21;39954:7;39941:12;:21::i;:::-;40051:1;40013:26;;;;;;;;:::i;:::-;:40;;;40010:78;;40064:16;40072:7;40064;:16::i;:::-;40178:1;40139:27;;;;;;;;:::i;:::-;:41;;;40136:80;;40191:17;40200:7;40191:8;:17::i;40324:1080::-;32275:42;40520:22;;;;;;;;:::i;:::-;:32;;;40517:189;;40581:21;40563:15;;;:39;40517:189;;;40650:22;;;;;;;;:::i;:::-;40643:55;;;;;40692:4;40643:55;;;1406:74:1;40643:40:0;;;;;;;;1379:18:1;;40643:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40625:15;;;:73;40517:189;40735:16;;40717:15;;;;:34;40714:98;;;40769:35;;;;;;;;;;;;;;40714:98;32275:42;40868:23;;;;;;;;:::i;:::-;:33;;;40865:193;;40931:21;40912:16;;;:40;40865:193;;;41001:23;;;;;;;;:::i;:::-;40994:56;;;;;41044:4;40994:56;;;1406:74:1;40994:41:0;;;;;;;;1379:18:1;;40994:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40975:16;;;:75;40865:193;41088:7;:17;;;41069:7;:16;;;:36;41066:101;;;41123:36;;;;;;;;;;;;;;41066:101;41231:22;;;;:26;41228:171;;41317:7;:17;;;41291:7;:22;;;41272:7;:16;;;:41;;;;:::i;:::-;41271:63;41268:124;;;41354:28;;;;;;;;;;;;;;41483:1128;41752:16;;;;41677:30;;;;;;;;:::i;:::-;41614:991;;41645:10;41614:991;41796:16;;41845:21;;;;41895:17;;;;41942:18;;;;41994:22;;;;42078:23;;;;;;;;:::i;:::-;42052:49;;:22;;;;;;;;:::i;:::-;:49;;;:148;;42159:16;;42141:15;;;;42178:22;;;;;42141:34;;;:::i;:::-;:59;;;;:::i;:::-;42052:148;;;42122:16;;42104:15;;;;:34;;42122:16;42104:34;:::i;:::-;42263:23;;;;;;;;:::i;:::-;42237:49;;:22;;;;;;;;:::i;:::-;:49;;;:117;;42353:1;42237:117;;;42328:7;:22;;;42308:7;:17;;;42289:7;:16;;;:36;;;;:::i;:::-;:61;;;;:::i;:::-;42388:22;;;;;;;;:::i;:::-;42445:7;:23;;;;;;;;;;:::i;:::-;42506:7;:26;;;;;;;;;;:::i;:::-;42571:7;:27;;;;;;;;;;:::i;:::-;41614:991;;;9716:25:1;;;9772:2;9757:18;;9750:34;;;;9800:18;;;9793:34;;;;9858:2;9843:18;;9836:34;;;;9901:3;9886:19;;9879:35;;;;9945:3;9930:19;;9923:35;;;;9989:3;9974:19;;9967:35;10051:42;10039:55;;;10033:3;10018:19;;10011:84;10132:55;;;10126:3;10111:19;;10104:84;10225:55;;;10219:3;10204:19;;10197:84;10318:56;10312:3;10297:19;;10290:85;9703:3;9688:19;41614:991:0;;;;;;;41483:1128;;:::o;3503:191::-;3577:16;3596:6;;;3613:17;;;;;;;;;;3646:40;;3596:6;;;;;;;3646:40;;3577:16;3646:40;3566:128;3503:191;:::o;38325:563::-;32275:42;38411:22;;;;;;;;:::i;:::-;:32;;;38408:475;;38532:9;38545:16;;38532:29;38529:81;;38581:19;;;;;;;;;;;;;;38408:475;38626:15;;;;;;;;:::i;:::-;38623:260;;;38652:30;38661:7;38652:30;;38683:10;38703:4;38718:16;;38737:22;;;;;;;;:::i;:::-;38652:108;;;;;;;;;;10893:42:1;10881:55;;;38652:108:0;;;10863:74:1;10973:55;;;10953:18;;;10946:83;11065:55;;;11045:18;;;11038:83;11157:55;;;11137:18;;;11130:83;10835:19;;38652:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5603:174;5561:216::o;38623:260::-;38783:92;38831:10;38851:4;38858:16;;38790:22;;;;;;;;:::i;:::-;38783:47;;;:92;;:47;:92::i;38010:225::-;38131:98;;;;;:24;38140:7;38131:24;;;;:98;;38164:10;;38192:12;;38213:9;;;;38131:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38010:225;;;:::o;26125:649::-;26549:23;26575:69;26603:4;26575:69;;;;;;;;;;;;;;;;;26583:5;26575:27;;;;:69;;;;;:::i;:::-;26549:95;;26663:10;:17;26684:1;26663:22;:56;;;;26700:10;26689:30;;;;;;;;;;;;:::i;:::-;26655:111;;;;;;;13166:2:1;26655:111:0;;;13148:21:1;13205:2;13185:18;;;13178:30;13244:34;13224:18;;;13217:62;13315:12;13295:18;;;13288:40;13345:19;;26655:111:0;12964:406:1;42696:1019:0;42775:9;:34;42785:23;;;;;;;;:::i;:::-;42775:34;;;;;;;;;;;;;-1:-1:-1;42775:34:0;;;;42771:85;;42827:21;;;;;;;;;;;;;;42771:85;42862:12;32275:42;42884:22;;;;;;;;:::i;:::-;:32;;;42881:767;;42930:24;;;;:7;:24;:::i;:::-;:31;;42965:1;42930:36;42927:90;;42986:21;;;;;;;;;;;;;;42927:90;43038:23;;;;;;;;:::i;:::-;:28;;43074:9;43085:24;;;;:7;:24;:::i;:::-;43038:72;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43025:85;;;;;42881:767;;;43136:20;;;;;;;;:::i;:::-;:25;;43160:1;43136:25;43133:295;;43182:85;43225:23;;;;;;;;:::i;:::-;43250:16;;43189:22;;;;;;;;:::i;:::-;43182:42;;;:85;:42;:85::i;:::-;43133:295;;;43286:20;;;;;;;;:::i;:::-;:25;;43310:1;43286:25;43283:145;;43332:86;43376:23;;;;;;;;:::i;:::-;43401:16;;43339:22;;;;;;;;:::i;:::-;43332:43;;;:86;:43;:86::i;:::-;43449:23;;;;;;;;:::i;:::-;:28;;43478:24;;;;:7;:24;:::i;:::-;43449:54;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43436:67:0;;-1:-1:-1;43515:20:0;;-1:-1:-1;43515:20:0;;;;;;;:::i;:::-;:25;;43539:1;43515:25;43512:129;;43561:70;43604:23;;;;;;;;:::i;:::-;43629:1;43568:22;;;;;;;;:::i;43561:70::-;43658:7;43654:56;;43682:20;;;;;;;;;;;;;;43804:1144;43886:20;;;;;;;;:::i;:::-;:25;;;43883:1060;;43961:12;32275:42;43987:23;;;;;;;;:::i;:::-;:33;;;43984:325;;44045:75;;;;;:36;44063:9;44045:36;;;;44089:21;;;;;44045:75;;44089:7;;44045:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44035:85;;43984:325;;;44151:78;44196:9;44207:21;;;;44158:23;;;;;;;;:::i;44151:78::-;44252:45;;;;;:36;44270:9;44252:36;;;;:45;;44289:7;;44252:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44242:55;;43984:325;44323:7;44319:70;;44352:25;;;;;;;;;;;;;;43883:1060;32275:42;44459:23;;;;;;;;:::i;:::-;:33;;;44456:480;;44550:1;44508:30;;;;;;;;:::i;:::-;:44;;;44505:112;;44573:32;;;;;;;;;;;;;;44505:112;44628:12;44645:30;;;;;;;;:::i;:::-;44711:12;;;44721:1;44711:12;;44688:21;44711:12;;;;;;;44645:35;;;;;;44688:21;;;;44645:79;;44711:12;44645:79;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44627:97;;;44739:7;44735:66;;44768:21;;;;;;;;;;;;;;44456:480;44827:99;44872:30;;;;;;;;:::i;:::-;44904:21;;;;44834:23;;;;;;;;:::i;45030:410::-;32275:42;45107:23;;;;;;;;:::i;:::-;:33;;;45104:331;;45152:12;45169:26;;;;;;;;:::i;:::-;:31;;45208:17;;;;45237:1;45227:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45227:12:0;;45169:71;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45151:89;;;45253:7;45249:65;;45280:24;;;;;;;;;;;;;;45104:331;45336:91;45381:26;;;;;;;;:::i;:::-;45409:17;;;;45343:23;;;;;;;;:::i;45523:415::-;32275:42;45601:23;;;;;;;;:::i;:::-;:33;;;45598:335;;45646:12;45663:27;;;;;;;;:::i;:::-;:32;;45703:18;;;;45733:1;45723:12;;45598:335;45832:93;45877:27;;;;;;;;:::i;:::-;45906:18;;;;45839:23;;;;;;;;:::i;22201:205::-;22329:68;;17496:42:1;17484:55;;;22329:68:0;;;17466:74:1;17576:55;;17556:18;;;17549:83;17648:18;;;17641:34;;;22302:96:0;;22322:5;;22352:27;;17439:18:1;;22329:68:0;17264:417:1;22302:96:0;22201:205;;;;:::o;15268:229::-;15405:12;15437:52;15459:6;15467:4;15473:1;15476:12;15437:21;:52::i;22675:582::-;23005:10;;;23004:62;;-1:-1:-1;23021:39:0;;;;;23045:4;23021:39;;;17860:74:1;23021:15:0;17970:55:1;;;17950:18;;;17943:83;23021:15:0;;;;;17833:18:1;;23021:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23004:62;22982:166;;;;;;;18239:2:1;22982:166:0;;;18221:21:1;18278:2;18258:18;;;18251:30;18317:34;18297:18;;;18290:62;18388:24;18368:18;;;18361:52;18430:19;;22982:166:0;18037:418:1;22982:166:0;23186:62;;6303:42:1;6291:55;;23186:62:0;;;6273:74:1;6363:18;;;6356:34;;;23159:90:0;;23179:5;;23209:22;;6246:18:1;;23186:62:0;6099:297:1;16354:455:0;16524:12;16582:5;16557:21;:30;;16549:81;;;;;;;18662:2:1;16549:81:0;;;18644:21:1;18701:2;18681:18;;;18674:30;18740:34;18720:18;;;18713:62;18811:8;18791:18;;;18784:36;18837:19;;16549:81:0;18460:402:1;16549:81:0;16642:12;16656:23;16683:6;:11;;16702:5;16709:4;16683:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16641:73;;;;16732:69;16759:6;16767:7;16776:10;16788:12;16732:26;:69::i;:::-;16725:76;16354:455;-1:-1:-1;;;;;;;16354:455:0:o;18927:644::-;19112:12;19141:7;19137:427;;;19169:10;:17;19190:1;19169:22;19165:290;;12808:19;;;;19379:60;;;;;;;19069:2:1;19379:60:0;;;19051:21:1;19108:2;19088:18;;;19081:30;19147:31;19127:18;;;19120:59;19196:18;;19379:60:0;18867:353:1;19379:60:0;-1:-1:-1;19476:10:0;19469:17;;19137:427;19519:33;19527:10;19539:12;20274:17;;:21;20270:388;;20506:10;20500:17;20563:15;20550:10;20546:2;20542:19;20535:44;20270:388;20633:12;20626:20;;;;;;;;;;;:::i;14:156:1:-;74:5;119:3;110:6;105:3;101:16;97:26;94:46;;;136:1;133;126:12;94:46;-1:-1:-1;158:6:1;14:156;-1:-1:-1;14:156:1:o;175:660::-;320:6;328;381:2;369:9;360:7;356:23;352:32;349:52;;;397:1;394;387:12;349:52;437:9;424:23;470:18;462:6;459:30;456:50;;;502:1;499;492:12;456:50;525:67;584:7;575:6;564:9;560:22;525:67;:::i;:::-;515:77;;;645:2;634:9;630:18;617:32;674:18;664:8;661:32;658:52;;;706:1;703;696:12;658:52;729:24;;787:3;769:16;;;765:26;762:46;;;804:1;801;794:12;762:46;827:2;817:12;;;175:660;;;;;:::o;1491:154::-;1577:42;1570:5;1566:54;1559:5;1556:65;1546:93;;1635:1;1632;1625:12;1650:134;1718:20;;1747:31;1718:20;1747:31;:::i;:::-;1650:134;;;:::o;1789:247::-;1848:6;1901:2;1889:9;1880:7;1876:23;1872:32;1869:52;;;1917:1;1914;1907:12;1869:52;1956:9;1943:23;1975:31;2000:5;1975:31;:::i;:::-;2025:5;1789:247;-1:-1:-1;;;1789:247:1:o;2041:356::-;2127:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:52;;;2196:1;2193;2186:12;2148:52;2236:9;2223:23;2269:18;2261:6;2258:30;2255:50;;;2301:1;2298;2291:12;2255:50;2324:67;2383:7;2374:6;2363:9;2359:22;2324:67;:::i;2402:1059::-;2549:6;2557;2565;2573;2617:9;2608:7;2604:23;2647:3;2643:2;2639:12;2636:32;;;2664:1;2661;2654:12;2636:32;2704:9;2691:23;2737:18;2729:6;2726:30;2723:50;;;2769:1;2766;2759:12;2723:50;2792:67;2851:7;2842:6;2831:9;2827:22;2792:67;:::i;:::-;2782:77;;;2952:3;2883:66;2879:2;2875:75;2871:85;2868:105;;;2969:1;2966;2959:12;2868:105;;3007:2;2996:9;2992:18;2982:28;;3063:3;3052:9;3048:19;3035:33;3093:18;3083:8;3080:32;3077:52;;;3125:1;3122;3115:12;3077:52;3148:24;;3203:4;3195:13;;3191:27;-1:-1:-1;3181:55:1;;3232:1;3229;3222:12;3181:55;3272:2;3259:16;3298:18;3290:6;3287:30;3284:50;;;3330:1;3327;3320:12;3284:50;3375:7;3370:2;3361:6;3357:2;3353:15;3349:24;3346:37;3343:57;;;3396:1;3393;3386:12;3343:57;2402:1059;;;;-1:-1:-1;3427:2:1;3419:11;;-1:-1:-1;;;2402:1059:1:o;3466:118::-;3552:5;3545:13;3538:21;3531:5;3528:32;3518:60;;3574:1;3571;3564:12;3589:128;3654:20;;3683:28;3654:20;3683:28;:::i;3722:382::-;3787:6;3795;3848:2;3836:9;3827:7;3823:23;3819:32;3816:52;;;3864:1;3861;3854:12;3816:52;3903:9;3890:23;3922:31;3947:5;3922:31;:::i;:::-;3972:5;-1:-1:-1;4029:2:1;4014:18;;4001:32;4042:30;4001:32;4042:30;:::i;4109:367::-;4177:6;4185;4238:2;4226:9;4217:7;4213:23;4209:32;4206:52;;;4254:1;4251;4244:12;4206:52;4293:9;4280:23;4312:31;4337:5;4312:31;:::i;:::-;4362:5;4440:2;4425:18;;;;4412:32;;-1:-1:-1;;;4109:367:1:o;5080:301::-;5209:3;5247:6;5241:13;5293:6;5286:4;5278:6;5274:17;5269:3;5263:37;5355:1;5319:16;;5344:13;;;-1:-1:-1;5319:16:1;5080:301;-1:-1:-1;5080:301:1:o;6401:184::-;6453:77;6450:1;6443:88;6550:4;6547:1;6540:15;6574:4;6571:1;6564:15;6590:168;6663:9;;;6694;;6711:15;;;6705:22;;6691:37;6681:71;;6732:18;;:::i;6763:128::-;6830:9;;;6851:11;;;6848:37;;;6865:18;;:::i;6896:184::-;6966:6;7019:2;7007:9;6998:7;6994:23;6990:32;6987:52;;;7035:1;7032;7025:12;6987:52;-1:-1:-1;7058:16:1;;6896:184;-1:-1:-1;6896:184:1:o;7085:580::-;7162:4;7168:6;7228:11;7215:25;7318:66;7307:8;7291:14;7287:29;7283:102;7263:18;7259:127;7249:155;;7400:1;7397;7390:12;7249:155;7427:33;;7479:20;;;-1:-1:-1;7522:18:1;7511:30;;7508:50;;;7554:1;7551;7544:12;7508:50;7587:4;7575:17;;-1:-1:-1;7618:14:1;7614:27;;;7604:38;;7601:58;;;7655:1;7652;7645:12;7601:58;7085:580;;;;;:::o;7670:325::-;7758:6;7753:3;7746:19;7810:6;7803:5;7796:4;7791:3;7787:14;7774:43;;7862:1;7855:4;7846:6;7841:3;7837:16;7833:27;7826:38;7728:3;7984:4;7914:66;7909:2;7901:6;7897:15;7893:88;7888:3;7884:98;7880:109;7873:116;;7670:325;;;;:::o;8000:1283::-;8362:4;8407:6;8394:20;8423:31;8448:5;8423:31;:::i;:::-;8492:42;8481:54;;;8463:73;;8606:4;8594:17;;;8581:31;8628:20;;;8621:37;8728:4;8716:17;;;8703:31;8750:20;;;8743:37;8850:4;8838:17;;;8825:31;8872:20;;;8865:37;8943:13;;8939:62;;8933:3;8918:19;;8911:91;9045:17;;9039:24;9033:3;9018:19;;9011:53;9101:55;;9095:3;9080:19;;9073:84;9194:3;9188;9173:19;;9166:32;;;9215:62;;9257:19;;9249:6;9241;9215:62;:::i;10386:241::-;10442:6;10495:2;10483:9;10474:7;10470:23;10466:32;10463:52;;;10511:1;10508;10501:12;10463:52;10550:9;10537:23;10569:28;10591:5;10569:28;:::i;11224:167::-;11291:20;;11351:14;11340:26;;11330:37;;11320:65;;11381:1;11378;11371:12;11396:1313;11683:42;11675:6;11671:55;11660:9;11653:74;11634:4;11762:6;11749:20;11778:31;11803:5;11778:31;:::i;:::-;11856:42;11849:5;11845:54;11840:2;11829:9;11825:18;11818:82;;11949:2;11941:6;11937:15;11924:29;11962:33;11987:7;11962:33;:::i;:::-;12044:42;12035:7;12031:56;12026:2;12015:9;12011:18;12004:84;;12164:14;12128:34;12158:2;12150:6;12146:15;12128:34;:::i;:::-;12124:55;12119:2;12108:9;12104:18;12097:83;12257:14;12221:34;12251:2;12243:6;12239:15;12221:34;:::i;:::-;12217:55;12211:3;12200:9;12196:19;12189:84;12322:3;12314:6;12310:16;12297:30;12336:33;12361:7;12336:33;:::i;:::-;12419:42;12406:56;12400:3;12385:19;;;12378:85;;;;12521:16;;12508:30;12569:3;12554:19;;12547:36;12620:3;12614;12599:19;;12592:32;;;12641:62;;12683:19;;12675:6;12667;12641:62;:::i;:::-;12633:70;11396:1313;-1:-1:-1;;;;;;11396:1313:1:o;12714:245::-;12781:6;12834:2;12822:9;12813:7;12809:23;12805:32;12802:52;;;12850:1;12847;12840:12;12802:52;12882:9;12876:16;12901:28;12923:5;12901:28;:::i;13375:271::-;13558:6;13550;13545:3;13532:33;13514:3;13584:16;;13609:13;;;13584:16;13375:271;-1:-1:-1;13375:271:1:o;13651:156::-;13717:20;;13777:4;13766:16;;13756:27;;13746:55;;13797:1;13794;13787:12;13812:182;13869:6;13922:2;13910:9;13901:7;13897:23;13893:32;13890:52;;;13938:1;13935;13928:12;13890:52;13961:27;13978:9;13961:27;:::i;14079:559::-;14137:5;14144:6;14204:3;14191:17;14286:66;14275:8;14259:14;14255:29;14251:102;14231:18;14227:127;14217:155;;14368:1;14365;14358:12;14217:155;14396:33;;14500:4;14487:18;;;-1:-1:-1;14448:21:1;;-1:-1:-1;14528:18:1;14517:30;;14514:50;;;14560:1;14557;14550:12;14514:50;14607:6;14591:14;14587:27;14580:5;14576:39;14573:59;;;14628:1;14625;14618:12;14643:2616;14824:2;14806:21;;;14868:20;;14904:18;;;14897:33;14988:15;;14975:29;15035:2;15020:18;;;15013:35;;;;15106:15;;15093:29;15153:2;15138:18;;;15131:35;;;;15224:15;;15211:29;15271:3;15256:19;;;15249:36;;;;15343:16;;15330:30;15391:3;15376:19;;;15369:36;;;;15463:16;;15450:30;15511:3;15496:19;;;15489:36;;;;14787:4;;15554:36;;15573:16;;15554:36;:::i;:::-;1205:42;1194:54;;15647:3;15632:19;;1182:67;15599:53;15683:36;15714:3;15706:6;15702:16;15683:36;:::i;:::-;1205:42;1194:54;;15778:3;15763:19;;1182:67;15728:55;15814:36;15845:3;15837:6;15833:16;15814:36;:::i;:::-;1205:42;1194:54;;15909:3;15894:19;;1182:67;15859:55;15945:36;15976:3;15968:6;15964:16;15945:36;:::i;:::-;1205:42;1194:54;;16040:3;16025:19;;1182:67;15990:55;16076:36;16107:3;16099:6;16095:16;16076:36;:::i;:::-;1205:42;1194:54;;16171:3;16156:19;;1182:67;16121:55;16207:36;16238:3;16230:6;16226:16;16207:36;:::i;:::-;1205:42;1194:54;;16302:3;16287:19;;1182:67;16252:55;16338:34;16367:3;16359:6;16355:16;16338:34;:::i;:::-;14066:4;14055:16;;16429:3;16414:19;;14043:29;16381:53;16465:34;16494:3;16486:6;16482:16;16465:34;:::i;:::-;14066:4;14055:16;;16556:3;16541:19;;14043:29;16508:53;16592:33;16620:3;16612:6;16608:16;16592:33;:::i;:::-;910:13;;903:21;16681:3;16666:19;;891:34;16634:52;16731:56;16782:3;16774:6;16770:16;16762:6;16731:56;:::i;:::-;16824:6;16818:3;16807:9;16803:19;16796:35;16854:76;16925:3;16914:9;16910:19;16896:12;16880:14;16854:76;:::i;:::-;16840:90;;;16978:56;17029:3;17021:6;17017:16;17009:6;16978:56;:::i;:::-;17102:66;17090:9;17082:6;17078:22;17074:95;17065:6;17054:9;17050:22;17043:127;17187:66;17246:6;17230:14;17213:15;17187:66;:::i;19225:477::-;19374:2;19363:9;19356:21;19337:4;19406:6;19400:13;19449:6;19444:2;19433:9;19429:18;19422:34;19508:6;19503:2;19495:6;19491:15;19486:2;19475:9;19471:18;19465:50;19564:1;19559:2;19550:6;19539:9;19535:22;19531:31;19524:42;19693:2;19623:66;19618:2;19610:6;19606:15;19602:88;19591:9;19587:104;19583:113;19575:121;;;19225:477;;;;:::o
Swarm Source
ipfs://08649dcd7b859b4a0abb6ded18fbafd9937725fc69600f3561d82ef1fdd7042b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$3,767.11
Net Worth in ETH
1.733888
Token Allocations
USDT
50.59%
ETH
28.90%
USDC
18.53%
Others
1.98%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 50.59% | $1 | 1,905.7616 | $1,905.76 | |
| ETH | 28.61% | $2,172.64 | 0.496 | $1,077.67 | |
| ETH | 18.13% | $1 | 682.9839 | $682.98 | |
| ETH | 0.84% | $2,172.64 | 0.0146 | $31.76 | |
| ETH | 0.80% | $0.004807 | 6,250.8096 | $30.05 | |
| ETH | 0.15% | $0.200233 | 28.0266 | $5.61 | |
| ETH | 0.13% | $0.372742 | 12.793 | $4.77 | |
| ETH | 0.03% | $1.16 | 0.8595 | $0.9969 | |
| ETH | 0.01% | $0.000004 | 146,744.5118 | $0.5473 | |
| ETH | 0.01% | $73,489.99 | 0.00000685 | $0.5034 | |
| ETH | <0.01% | $0.999787 | 0.3427 | $0.3426 | |
| BASE | 0.40% | $1 | 15.0051 | $15.01 | |
| BASE | 0.29% | $2,172.62 | 0.00511426 | $11.11 |
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.