Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
DePayRouterV2
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-14 */ // 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 v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) // pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Dependency file: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) // pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 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 v4.4.1 (token/ERC20/utils/SafeERC20.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.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; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } 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"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Dependency file: contracts/interfaces/IPermit2.sol // pragma solidity >=0.8.18 <0.9.0; interface IPermit2 { struct PermitDetails { address token; uint160 amount; uint48 expiration; uint48 nonce; } struct PermitSingle { PermitDetails details; address spender; uint256 sigDeadline; } function permit(address owner, PermitSingle memory permitSingle, bytes calldata signature) external; function transferFrom(address from, address to, uint160 amount, address token) external; function allowance(address user, address token, address spender) external view returns (uint160 amount, uint48 expiration, uint48 nonce); } // Dependency file: contracts/interfaces/IDePayRouterV2.sol // pragma solidity >=0.8.18 <0.9.0; // import 'contracts/interfaces/IPermit2.sol'; interface IDePayRouterV2 { struct Payment { uint256 amountIn; bool permit2; uint256 paymentAmount; uint256 feeAmount; address tokenInAddress; address exchangeAddress; address tokenOutAddress; address paymentReceiverAddress; address feeReceiverAddress; uint8 exchangeType; uint8 receiverType; bytes exchangeCallData; bytes receiverCallData; uint256 deadline; } function pay( Payment calldata payment ) external payable returns(bool); function pay( IDePayRouterV2.Payment calldata payment, IPermit2.PermitSingle memory permitSingle, bytes calldata signature ) external payable returns(bool); event Enabled( address indexed exchange ); event Disabled( address indexed exchange ); function enable(address exchange, bool enabled) external returns(bool); function withdraw(address token, uint amount) external returns(bool); } // Dependency file: contracts/interfaces/IDePayForwarderV2.sol // pragma solidity >=0.8.18 <0.9.0; // import 'contracts/interfaces/IDePayRouterV2.sol'; interface IDePayForwarderV2 { function forward( IDePayRouterV2.Payment calldata payment ) external payable returns(bool); function toggle(bool stop) external returns(bool); } // Root file: contracts/DePayRouterV2.sol pragma solidity >=0.8.18 <0.9.0; // import "@openzeppelin/contracts/access/Ownable.sol"; // import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; // import 'contracts/interfaces/IPermit2.sol'; // import 'contracts/interfaces/IDePayRouterV2.sol'; // import 'contracts/interfaces/IDePayForwarderV2.sol'; contract DePayRouterV2 is Ownable { using SafeERC20 for IERC20; // Address representing the NATIVE token (e.g. ETH, BNB, MATIC, etc.) address constant NATIVE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // Address of PERMIT2 address public immutable PERMIT2; // Address of the payment FORWARDER contract address public immutable FORWARDER; // List of approved exchanges for conversion mapping (address => bool) public exchanges; constructor (address _PERMIT2, address _FORWARDER) { PERMIT2 = _PERMIT2; FORWARDER = _FORWARDER; } // Accepts NATIVE payments, which is required in order to swap from and to NATIVE, especially unwrapping as part of conversions receive() external payable {} // Transfer polyfil event for internal transfers event Transfer( address indexed from, address indexed to, uint256 value ); // Perform a payment (tokenIn approval has been granted prior), internal function _pay( IDePayRouterV2.Payment calldata payment ) internal returns(bool){ uint256 balanceInBefore; uint256 balanceOutBefore; (balanceInBefore, balanceOutBefore) = _validatePreConditions(payment); _payIn(payment); _performPayment(payment); _validatePostConditions(payment, balanceInBefore, balanceOutBefore); return true; } // Perform a payment (tokenIn approval has been granted prior), external function pay( IDePayRouterV2.Payment calldata payment ) external payable returns(bool){ return _pay(payment); } // Perform a payment (including permit2 approval), internal function _pay( IDePayRouterV2.Payment calldata payment, IPermit2.PermitSingle memory permitSingle, bytes calldata signature ) internal returns(bool){ uint256 balanceInBefore; uint256 balanceOutBefore; (balanceInBefore, balanceOutBefore) = _validatePreConditions(payment); _permit(permitSingle, signature); _payIn(payment); _performPayment(payment); _validatePostConditions(payment, balanceInBefore, balanceOutBefore); return true; } // Perform a payment (including permit2 approval), external function pay( IDePayRouterV2.Payment calldata payment, IPermit2.PermitSingle memory permitSingle, bytes calldata signature ) external payable returns(bool){ return _pay(payment, permitSingle, signature); } function _validatePreConditions(IDePayRouterV2.Payment calldata payment) internal returns(uint256 balanceInBefore, uint256 balanceOutBefore) { // Make sure payment deadline has not been passed, yet require(payment.deadline > block.timestamp, "DePay: Payment deadline has passed!"); // Store tokenIn balance prior to payment if(payment.tokenInAddress == NATIVE) { balanceInBefore = address(this).balance - msg.value; } else { balanceInBefore = IERC20(payment.tokenInAddress).balanceOf(address(this)); } // Store tokenOut balance prior to payment if(payment.tokenOutAddress == NATIVE) { balanceOutBefore = address(this).balance - msg.value; } else { balanceOutBefore = IERC20(payment.tokenOutAddress).balanceOf(address(this)); } } // permit2 function _permit( IPermit2.PermitSingle memory permitSingle, bytes calldata signature ) internal { IPermit2(PERMIT2).permit( msg.sender, // owner permitSingle, signature ); } // pay in using token approval & transferFrom or requiring native pay in function _payIn( IDePayRouterV2.Payment calldata payment ) internal { // Make sure that the sender has paid in the correct token & amount if(payment.tokenInAddress == NATIVE) { require(msg.value >= payment.amountIn, 'DePay: Insufficient amount paid in!'); } 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); } } function _performPayment(IDePayRouterV2.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); } } function _validatePostConditions(IDePayRouterV2.Payment calldata payment, uint256 balanceInBefore, uint256 balanceOutBefore) internal view { // Ensure balances of tokenIn remained if(payment.tokenInAddress == NATIVE) { require(address(this).balance >= balanceInBefore, 'DePay: Insufficient balanceIn after payment!'); } else { require(IERC20(payment.tokenInAddress).balanceOf(address(this)) >= balanceInBefore, 'DePay: Insufficient balanceIn after payment!'); } // Ensure balances of tokenOut remained if(payment.tokenOutAddress == NATIVE) { require(address(this).balance >= balanceOutBefore, 'DePay: Insufficient balanceOut after payment!'); } else { require(IERC20(payment.tokenOutAddress).balanceOf(address(this)) >= balanceOutBefore, 'DePay: Insufficient balanceOut after payment!'); } } function _convert(IDePayRouterV2.Payment calldata payment) internal { require(exchanges[payment.exchangeAddress], 'DePay: Exchange has not been approved!'); bool success; if(payment.tokenInAddress == NATIVE) { (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); } require(success, "DePay: exchange call failed!"); } function _payReceiver(IDePayRouterV2.Payment calldata payment) internal { if(payment.receiverType != 0) { // call receiver contract { bool success; if(payment.tokenOutAddress == NATIVE) { success = IDePayForwarderV2(FORWARDER).forward{value: payment.paymentAmount}(payment); emit Transfer(msg.sender, payment.paymentReceiverAddress, payment.paymentAmount); } else { IERC20(payment.tokenOutAddress).safeTransfer(FORWARDER, payment.paymentAmount); success = IDePayForwarderV2(FORWARDER).forward(payment); } require(success, 'DePay: Forwarding payment to contract failed!'); } } else { // just send payment to address if(payment.tokenOutAddress == NATIVE) { (bool success,) = payment.paymentReceiverAddress.call{value: payment.paymentAmount}(new bytes(0)); require(success, 'DePay: NATIVE payment receiver pay out failed!'); emit Transfer(msg.sender, payment.paymentReceiverAddress, payment.paymentAmount); } else { IERC20(payment.tokenOutAddress).safeTransfer(payment.paymentReceiverAddress, payment.paymentAmount); } } } function _payFee(IDePayRouterV2.Payment calldata payment) internal { if(payment.tokenOutAddress == NATIVE) { (bool success,) = payment.feeReceiverAddress.call{value: payment.feeAmount}(new bytes(0)); require(success, 'DePay: NATIVE fee receiver pay out failed!'); emit Transfer(msg.sender, payment.feeReceiverAddress, payment.feeAmount); } else { IERC20(payment.tokenOutAddress).safeTransfer(payment.feeReceiverAddress, payment.feeAmount); } } // Event emitted if new exchange has been enabled event Enabled( address indexed exchange ); // Event emitted if an exchange has been disabled event Disabled( address indexed exchange ); // Enable/Disable an exchange function enable(address exchange, bool enabled) external onlyOwner returns(bool) { exchanges[exchange] = enabled; if(enabled) { emit Enabled(exchange); } else { emit Disabled(exchange); } return true; } // Allows to withdraw accidentally sent tokens. 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
[{"inputs":[{"internalType":"address","name":"_PERMIT2","type":"address"},{"internalType":"address","name":"_FORWARDER","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","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":[{"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":"bool","name":"permit2","type":"bool"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","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":"uint8","name":"exchangeType","type":"uint8"},{"internalType":"uint8","name":"receiverType","type":"uint8"},{"internalType":"bytes","name":"exchangeCallData","type":"bytes"},{"internalType":"bytes","name":"receiverCallData","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct IDePayRouterV2.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":"bool","name":"permit2","type":"bool"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","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":"uint8","name":"exchangeType","type":"uint8"},{"internalType":"uint8","name":"receiverType","type":"uint8"},{"internalType":"bytes","name":"exchangeCallData","type":"bytes"},{"internalType":"bytes","name":"receiverCallData","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct IDePayRouterV2.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":"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
60c06040523480156200001157600080fd5b5060405162002b9038038062002b908339810160408190526200003491620000c4565b6200003f3362000057565b6001600160a01b039182166080521660a052620000fc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000bf57600080fd5b919050565b60008060408385031215620000d857600080fd5b620000e383620000a7565b9150620000f360208401620000a7565b90509250929050565b60805160a051612a4c62000144600039600081816101d9015281816117fd01528181611923015261199401526000818160fb01528181610cad015261126b0152612a4c6000f3fe6080604052600436106100b55760003560e01c80638da5cb5b11610069578063ec9736421161004e578063ec973642146101fb578063f2fde38b1461021b578063f3fef3a31461023b57600080fd5b80638da5cb5b1461019c578063ca2ad973146101c757600080fd5b8063705c9b141161009a578063705c9b1414610142578063715018a6146101555780637412dbb31461016c57600080fd5b8063422feecb146100c15780636afdd850146100e957600080fd5b366100bc57005b600080fd5b6100d46100cf366004612228565b61025b565b60405190151581526020015b60405180910390f35b3480156100f557600080fd5b5061011d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b6100d4610150366004612390565b61026c565b34801561016157600080fd5b5061016a610283565b005b34801561017857600080fd5b506100d46101873660046124b7565b60016020526000908152604090205460ff1681565b3480156101a857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661011d565b3480156101d357600080fd5b5061011d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561020757600080fd5b506100d46102163660046124ed565b610315565b34801561022757600080fd5b5061016a6102363660046124b7565b610480565b34801561024757600080fd5b506100d4610256366004612526565b6105b0565b600061026682610764565b92915050565b600061027a8585858561079e565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61031360006107e6565b565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610300565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683158015919091179091556104355760405173ffffffffffffffffffffffffffffffffffffffff8416907f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d1290600090a2610477565b60405173ffffffffffffffffffffffffffffffffffffffff8416907ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe90600090a25b50600192915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610501576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610300565b73ffffffffffffffffffffffffffffffffffffffff81166105a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610300565b6105ad816107e6565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610300565b7fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8416016107435760408051600080825260208201909252339084906040516106909190612576565b60006040518083038185875af1925050503d80600081146106cd576040519150601f19603f3d011682016040523d82523d6000602084013e6106d2565b606091505b505090508061073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f44655061793a207769746864726177206661696c6564210000000000000000006044820152606401610300565b50610477565b61047773ffffffffffffffffffffffffffffffffffffffff8416338461085b565b600080600061077284610934565b909250905061078084610bb0565b61078984610db4565b610794848383610e2b565b5060019392505050565b60008060006107ac87610934565b90925090506107bc86868661122e565b6107c587610bb0565b6107ce87610db4565b6107d9878383610e2b565b5060019695505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261092f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526112dd565b505050565b60008042836101a00135116109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44655061793a205061796d656e7420646561646c696e6520686173207061737360448201527f65642100000000000000000000000000000000000000000000000000000000006064820152608401610300565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6109f060a08501608086016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603610a1c57610a153447612592565b9150610abf565b610a2c60a08401608085016124b7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc91906125cc565b91505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610ae460e0850160c086016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603610b1057610b093447612592565b9050915091565b610b2060e0840160c085016124b7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0991906125cc565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610bd560a08301608084016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603610c815780353410156105ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44655061793a20496e73756666696369656e7420616d6f756e7420706169642060448201527f696e2100000000000000000000000000000000000000000000000000000000006064820152608401610300565b610c9160408201602083016125e5565b15610d7f5773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166336c7851633308435610ce660a08701608088016124b7565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9485166004820152928416602484015290831660448301529091166064820152608401600060405180830381600087803b158015610d6457600080fd5b505af1158015610d78573d6000803e3d6000fd5b5050505050565b6105ad33308335610d9660a08601608087016124b7565b73ffffffffffffffffffffffffffffffffffffffff169291906113e9565b6000610dc660c0830160a084016124b7565b73ffffffffffffffffffffffffffffffffffffffff1614610dea57610dea8161144d565b610df38161179f565b6000610e07610120830161010084016124b7565b73ffffffffffffffffffffffffffffffffffffffff16146105ad576105ad81611ca2565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610e5060a08501608086016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603610f005781471015610efb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f44655061793a20496e73756666696369656e742062616c616e6365496e20616660448201527f746572207061796d656e742100000000000000000000000000000000000000006064820152608401610300565b61102f565b81610f1160a08501608086016124b7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa191906125cc565b101561102f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f44655061793a20496e73756666696369656e742062616c616e6365496e20616660448201527f746572207061796d656e742100000000000000000000000000000000000000006064820152608401610300565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61105460e0850160c086016124b7565b73ffffffffffffffffffffffffffffffffffffffff16036110ff578047101561092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44655061793a20496e73756666696369656e742062616c616e63654f7574206160448201527f66746572207061796d656e7421000000000000000000000000000000000000006064820152608401610300565b8061111060e0850160c086016124b7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa15801561117c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a091906125cc565b101561092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44655061793a20496e73756666696369656e742062616c616e63654f7574206160448201527f66746572207061796d656e7421000000000000000000000000000000000000006064820152608401610300565b6040517f2b67b57000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632b67b570906112a690339087908790879060040161264b565b600060405180830381600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b50505050505050565b600061133f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611ea19092919063ffffffff16565b80519091501561092f578080602001905181019061135d91906126ce565b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610300565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526114479085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016108ad565b50505050565b6001600061146160c0840160a085016124b7565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff16611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44655061793a2045786368616e676520686173206e6f74206265656e2061707060448201527f726f7665642100000000000000000000000000000000000000000000000000006064820152608401610300565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61153e60a08401608085016124b7565b73ffffffffffffffffffffffffffffffffffffffff16036115e95761156960c0830160a084016124b7565b73ffffffffffffffffffffffffffffffffffffffff163461158e6101608501856126eb565b60405161159c929190612750565b60006040518083038185875af1925050503d80600081146115d9576040519150601f19603f3d011682016040523d82523d6000602084013e6115de565b606091505b505080915050611734565b6115fb61014083016101208401612771565b60ff1660010361164c5761164761161860c0840160a085016124b7565b833561162a60a08601608087016124b7565b73ffffffffffffffffffffffffffffffffffffffff169190611eba565b6116aa565b61165e61014083016101208401612771565b60ff166002036116aa576116aa61167b60c0840160a085016124b7565b833561168d60a08601608087016124b7565b73ffffffffffffffffffffffffffffffffffffffff16919061085b565b6116ba60c0830160a084016124b7565b73ffffffffffffffffffffffffffffffffffffffff166116de6101608401846126eb565b6040516116ec929190612750565b6000604051808303816000865af19150503d8060008114611729576040519150601f19603f3d011682016040523d82523d6000602084013e61172e565b606091505b50909150505b8061179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f44655061793a2065786368616e67652063616c6c206661696c656421000000006044820152606401610300565b5050565b6117b161016082016101408301612771565b60ff1615611a9c57600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6117e060e0840160c085016124b7565b73ffffffffffffffffffffffffffffffffffffffff160361191e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316ea02af8360400135846040518363ffffffff1660e01b815260040161185991906127f0565b60206040518083038185885af1158015611877573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061189c91906126ce565b90506118af610100830160e084016124b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040013560405161191191815260200190565b60405180910390a3611a0f565b6119577f0000000000000000000000000000000000000000000000000000000000000000604084013561168d60e0860160c087016124b7565b6040517f16ea02af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316ea02af906119c99085906004016127f0565b6020604051808303816000875af11580156119e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0c91906126ce565b90505b8061179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44655061793a20466f7277617264696e67207061796d656e7420746f20636f6e60448201527f7472616374206661696c656421000000000000000000000000000000000000006064820152608401610300565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611ac160e0830160c084016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603611c79576000611aef610100830160e084016124b7565b60408051600081526020810180835273ffffffffffffffffffffffffffffffffffffffff93909316929185013591611b279190612576565b60006040518083038185875af1925050503d8060008114611b64576040519150601f19603f3d011682016040523d82523d6000602084013e611b69565b606091505b5050905080611bfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f44655061793a204e4154495645207061796d656e74207265636569766572207060448201527f6179206f7574206661696c6564210000000000000000000000000000000000006064820152608401610300565b611c0b610100830160e084016124b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460400135604051611c6d91815260200190565b60405180910390a35050565b6105ad611c8d610100830160e084016124b7565b604083013561168d60e0850160c086016124b7565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611cc760e0830160c084016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603611e77576000611cf6610120830161010084016124b7565b6040805160008152602081019182905273ffffffffffffffffffffffffffffffffffffffff9290921691606085013591611d309190612576565b60006040518083038185875af1925050503d8060008114611d6d576040519150601f19603f3d011682016040523d82523d6000602084013e611d72565b606091505b5050905080611e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f44655061793a204e41544956452066656520726563656976657220706179206f60448201527f7574206661696c656421000000000000000000000000000000000000000000006064820152608401610300565b611e15610120830161010084016124b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460600135604051611c6d91815260200190565b6105ad611e8c610120830161010084016124b7565b606083013561168d60e0850160c086016124b7565b6060611eb0848460008561203c565b90505b9392505050565b801580611f5a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5891906125cc565b155b611fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610300565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261092f9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016108ad565b6060824710156120ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610300565b843b612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610300565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161215f9190612576565b60006040518083038185875af1925050503d806000811461219c576040519150601f19603f3d011682016040523d82523d6000602084013e6121a1565b606091505b50915091506121b18282866121bc565b979650505050505050565b606083156121cb575081611eb3565b8251156121db5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030091906129c5565b60006101c0828403121561222257600080fd5b50919050565b60006020828403121561223a57600080fd5b813567ffffffffffffffff81111561225157600080fd5b61225d8482850161220f565b949350505050565b6040516060810167ffffffffffffffff811182821017156122af577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b6040516080810167ffffffffffffffff811182821017156122af577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105ad57600080fd5b803561232c816122ff565b919050565b803565ffffffffffff8116811461232c57600080fd5b60008083601f84011261235957600080fd5b50813567ffffffffffffffff81111561237157600080fd5b60208301915083602082850101111561238957600080fd5b9250929050565b6000806000808486036101008112156123a857600080fd5b853567ffffffffffffffff808211156123c057600080fd5b6123cc89838a0161220f565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301925060c083121561240157600080fd5b612409612265565b9150608083121561241957600080fd5b6124216122b5565b92506020880135612431816122ff565b83526040880135612441816122ff565b602084015261245260608901612331565b604084015261246360808901612331565b606084015282825261247760a08901612321565b602083015260c0880135604083015281955060e088013592508083111561249d57600080fd5b50506124ab87828801612347565b95989497509550505050565b6000602082840312156124c957600080fd5b8135611eb3816122ff565b80151581146105ad57600080fd5b803561232c816124d4565b6000806040838503121561250057600080fd5b823561250b816122ff565b9150602083013561251b816124d4565b809150509250929050565b6000806040838503121561253957600080fd5b8235612544816122ff565b946020939093013593505050565b60005b8381101561256d578181015183820152602001612555565b50506000910152565b60008251612588818460208701612552565b9190910192915050565b81810381811115610266577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000602082840312156125de57600080fd5b5051919050565b6000602082840312156125f757600080fd5b8135611eb3816124d4565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010073ffffffffffffffffffffffffffffffffffffffff80881684528651818151166020860152816020820151166040860152604081015165ffffffffffff80821660608801528060608401511660808801525050508060208801511660a085015250604086015160c08401528060e08401526121b18184018587612602565b6000602082840312156126e057600080fd5b8151611eb3816124d4565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261272057600080fd5b83018035915067ffffffffffffffff82111561273b57600080fd5b60200191503681900382131561238957600080fd5b8183823760009101908152919050565b803560ff8116811461232c57600080fd5b60006020828403121561278357600080fd5b611eb382612760565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127c157600080fd5b830160208101925035905067ffffffffffffffff8111156127e157600080fd5b80360382131561238957600080fd5b60208152813560208201526000612809602084016124e2565b801515604084015250604083013560608301526060830135608083015261283260808401612321565b73ffffffffffffffffffffffffffffffffffffffff811660a08401525061285b60a08401612321565b73ffffffffffffffffffffffffffffffffffffffff811660c08401525061288460c08401612321565b73ffffffffffffffffffffffffffffffffffffffff811660e0840152506128ad60e08401612321565b6101006128d18185018373ffffffffffffffffffffffffffffffffffffffff169052565b6128dc818601612321565b9150506101206129038185018373ffffffffffffffffffffffffffffffffffffffff169052565b61290e818601612760565b9150506101406129228185018360ff169052565b61292d818601612760565b9150506101606129418185018360ff169052565b61294d8186018661278c565b925090506101c0610180818187015261296b6101e087018585612602565b93506129798188018861278c565b935090506101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087860301818801526129b4858584612602565b970135919095015250929392505050565b60208152600082518060208401526129e4816040850160208701612552565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212206397791d9984b699c901a2d0ea2696bfe0d981c227c325996caee3f7a0c2ac9f64736f6c63430008120033000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000dac2064178831b8c2ed5f08b7cf207c01a989b23
Deployed Bytecode
0x6080604052600436106100b55760003560e01c80638da5cb5b11610069578063ec9736421161004e578063ec973642146101fb578063f2fde38b1461021b578063f3fef3a31461023b57600080fd5b80638da5cb5b1461019c578063ca2ad973146101c757600080fd5b8063705c9b141161009a578063705c9b1414610142578063715018a6146101555780637412dbb31461016c57600080fd5b8063422feecb146100c15780636afdd850146100e957600080fd5b366100bc57005b600080fd5b6100d46100cf366004612228565b61025b565b60405190151581526020015b60405180910390f35b3480156100f557600080fd5b5061011d7f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba381565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b6100d4610150366004612390565b61026c565b34801561016157600080fd5b5061016a610283565b005b34801561017857600080fd5b506100d46101873660046124b7565b60016020526000908152604090205460ff1681565b3480156101a857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661011d565b3480156101d357600080fd5b5061011d7f000000000000000000000000dac2064178831b8c2ed5f08b7cf207c01a989b2381565b34801561020757600080fd5b506100d46102163660046124ed565b610315565b34801561022757600080fd5b5061016a6102363660046124b7565b610480565b34801561024757600080fd5b506100d4610256366004612526565b6105b0565b600061026682610764565b92915050565b600061027a8585858561079e565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61031360006107e6565b565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610300565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683158015919091179091556104355760405173ffffffffffffffffffffffffffffffffffffffff8416907f44bcce471802f9158ee4390426e4a931d186757cc50d302f6747504c17516d1290600090a2610477565b60405173ffffffffffffffffffffffffffffffffffffffff8416907ff54453d15e2e6aee566733e6da03165ea58500408e802e05aa4e75f2408f59fe90600090a25b50600192915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610501576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610300565b73ffffffffffffffffffffffffffffffffffffffff81166105a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610300565b6105ad816107e6565b50565b6000805473ffffffffffffffffffffffffffffffffffffffff163314610632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610300565b7fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8416016107435760408051600080825260208201909252339084906040516106909190612576565b60006040518083038185875af1925050503d80600081146106cd576040519150601f19603f3d011682016040523d82523d6000602084013e6106d2565b606091505b505090508061073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f44655061793a207769746864726177206661696c6564210000000000000000006044820152606401610300565b50610477565b61047773ffffffffffffffffffffffffffffffffffffffff8416338461085b565b600080600061077284610934565b909250905061078084610bb0565b61078984610db4565b610794848383610e2b565b5060019392505050565b60008060006107ac87610934565b90925090506107bc86868661122e565b6107c587610bb0565b6107ce87610db4565b6107d9878383610e2b565b5060019695505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261092f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526112dd565b505050565b60008042836101a00135116109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44655061793a205061796d656e7420646561646c696e6520686173207061737360448201527f65642100000000000000000000000000000000000000000000000000000000006064820152608401610300565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6109f060a08501608086016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603610a1c57610a153447612592565b9150610abf565b610a2c60a08401608085016124b7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abc91906125cc565b91505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610ae460e0850160c086016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603610b1057610b093447612592565b9050915091565b610b2060e0840160c085016124b7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0991906125cc565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610bd560a08301608084016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603610c815780353410156105ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44655061793a20496e73756666696369656e7420616d6f756e7420706169642060448201527f696e2100000000000000000000000000000000000000000000000000000000006064820152608401610300565b610c9160408201602083016125e5565b15610d7f5773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3166336c7851633308435610ce660a08701608088016124b7565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9485166004820152928416602484015290831660448301529091166064820152608401600060405180830381600087803b158015610d6457600080fd5b505af1158015610d78573d6000803e3d6000fd5b5050505050565b6105ad33308335610d9660a08601608087016124b7565b73ffffffffffffffffffffffffffffffffffffffff169291906113e9565b6000610dc660c0830160a084016124b7565b73ffffffffffffffffffffffffffffffffffffffff1614610dea57610dea8161144d565b610df38161179f565b6000610e07610120830161010084016124b7565b73ffffffffffffffffffffffffffffffffffffffff16146105ad576105ad81611ca2565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610e5060a08501608086016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603610f005781471015610efb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f44655061793a20496e73756666696369656e742062616c616e6365496e20616660448201527f746572207061796d656e742100000000000000000000000000000000000000006064820152608401610300565b61102f565b81610f1160a08501608086016124b7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa191906125cc565b101561102f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f44655061793a20496e73756666696369656e742062616c616e6365496e20616660448201527f746572207061796d656e742100000000000000000000000000000000000000006064820152608401610300565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61105460e0850160c086016124b7565b73ffffffffffffffffffffffffffffffffffffffff16036110ff578047101561092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44655061793a20496e73756666696369656e742062616c616e63654f7574206160448201527f66746572207061796d656e7421000000000000000000000000000000000000006064820152608401610300565b8061111060e0850160c086016124b7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa15801561117c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a091906125cc565b101561092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44655061793a20496e73756666696369656e742062616c616e63654f7574206160448201527f66746572207061796d656e7421000000000000000000000000000000000000006064820152608401610300565b6040517f2b67b57000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba31690632b67b570906112a690339087908790879060040161264b565b600060405180830381600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b50505050505050565b600061133f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611ea19092919063ffffffff16565b80519091501561092f578080602001905181019061135d91906126ce565b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610300565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526114479085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016108ad565b50505050565b6001600061146160c0840160a085016124b7565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff16611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44655061793a2045786368616e676520686173206e6f74206265656e2061707060448201527f726f7665642100000000000000000000000000000000000000000000000000006064820152608401610300565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61153e60a08401608085016124b7565b73ffffffffffffffffffffffffffffffffffffffff16036115e95761156960c0830160a084016124b7565b73ffffffffffffffffffffffffffffffffffffffff163461158e6101608501856126eb565b60405161159c929190612750565b60006040518083038185875af1925050503d80600081146115d9576040519150601f19603f3d011682016040523d82523d6000602084013e6115de565b606091505b505080915050611734565b6115fb61014083016101208401612771565b60ff1660010361164c5761164761161860c0840160a085016124b7565b833561162a60a08601608087016124b7565b73ffffffffffffffffffffffffffffffffffffffff169190611eba565b6116aa565b61165e61014083016101208401612771565b60ff166002036116aa576116aa61167b60c0840160a085016124b7565b833561168d60a08601608087016124b7565b73ffffffffffffffffffffffffffffffffffffffff16919061085b565b6116ba60c0830160a084016124b7565b73ffffffffffffffffffffffffffffffffffffffff166116de6101608401846126eb565b6040516116ec929190612750565b6000604051808303816000865af19150503d8060008114611729576040519150601f19603f3d011682016040523d82523d6000602084013e61172e565b606091505b50909150505b8061179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f44655061793a2065786368616e67652063616c6c206661696c656421000000006044820152606401610300565b5050565b6117b161016082016101408301612771565b60ff1615611a9c57600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6117e060e0840160c085016124b7565b73ffffffffffffffffffffffffffffffffffffffff160361191e577f000000000000000000000000dac2064178831b8c2ed5f08b7cf207c01a989b2373ffffffffffffffffffffffffffffffffffffffff166316ea02af8360400135846040518363ffffffff1660e01b815260040161185991906127f0565b60206040518083038185885af1158015611877573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061189c91906126ce565b90506118af610100830160e084016124b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040013560405161191191815260200190565b60405180910390a3611a0f565b6119577f000000000000000000000000dac2064178831b8c2ed5f08b7cf207c01a989b23604084013561168d60e0860160c087016124b7565b6040517f16ea02af00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000dac2064178831b8c2ed5f08b7cf207c01a989b2316906316ea02af906119c99085906004016127f0565b6020604051808303816000875af11580156119e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0c91906126ce565b90505b8061179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44655061793a20466f7277617264696e67207061796d656e7420746f20636f6e60448201527f7472616374206661696c656421000000000000000000000000000000000000006064820152608401610300565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611ac160e0830160c084016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603611c79576000611aef610100830160e084016124b7565b60408051600081526020810180835273ffffffffffffffffffffffffffffffffffffffff93909316929185013591611b279190612576565b60006040518083038185875af1925050503d8060008114611b64576040519150601f19603f3d011682016040523d82523d6000602084013e611b69565b606091505b5050905080611bfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f44655061793a204e4154495645207061796d656e74207265636569766572207060448201527f6179206f7574206661696c6564210000000000000000000000000000000000006064820152608401610300565b611c0b610100830160e084016124b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460400135604051611c6d91815260200190565b60405180910390a35050565b6105ad611c8d610100830160e084016124b7565b604083013561168d60e0850160c086016124b7565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611cc760e0830160c084016124b7565b73ffffffffffffffffffffffffffffffffffffffff1603611e77576000611cf6610120830161010084016124b7565b6040805160008152602081019182905273ffffffffffffffffffffffffffffffffffffffff9290921691606085013591611d309190612576565b60006040518083038185875af1925050503d8060008114611d6d576040519150601f19603f3d011682016040523d82523d6000602084013e611d72565b606091505b5050905080611e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f44655061793a204e41544956452066656520726563656976657220706179206f60448201527f7574206661696c656421000000000000000000000000000000000000000000006064820152608401610300565b611e15610120830161010084016124b7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460600135604051611c6d91815260200190565b6105ad611e8c610120830161010084016124b7565b606083013561168d60e0850160c086016124b7565b6060611eb0848460008561203c565b90505b9392505050565b801580611f5a57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5891906125cc565b155b611fe6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610300565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261092f9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016108ad565b6060824710156120ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610300565b843b612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610300565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161215f9190612576565b60006040518083038185875af1925050503d806000811461219c576040519150601f19603f3d011682016040523d82523d6000602084013e6121a1565b606091505b50915091506121b18282866121bc565b979650505050505050565b606083156121cb575081611eb3565b8251156121db5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030091906129c5565b60006101c0828403121561222257600080fd5b50919050565b60006020828403121561223a57600080fd5b813567ffffffffffffffff81111561225157600080fd5b61225d8482850161220f565b949350505050565b6040516060810167ffffffffffffffff811182821017156122af577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b6040516080810167ffffffffffffffff811182821017156122af577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105ad57600080fd5b803561232c816122ff565b919050565b803565ffffffffffff8116811461232c57600080fd5b60008083601f84011261235957600080fd5b50813567ffffffffffffffff81111561237157600080fd5b60208301915083602082850101111561238957600080fd5b9250929050565b6000806000808486036101008112156123a857600080fd5b853567ffffffffffffffff808211156123c057600080fd5b6123cc89838a0161220f565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301925060c083121561240157600080fd5b612409612265565b9150608083121561241957600080fd5b6124216122b5565b92506020880135612431816122ff565b83526040880135612441816122ff565b602084015261245260608901612331565b604084015261246360808901612331565b606084015282825261247760a08901612321565b602083015260c0880135604083015281955060e088013592508083111561249d57600080fd5b50506124ab87828801612347565b95989497509550505050565b6000602082840312156124c957600080fd5b8135611eb3816122ff565b80151581146105ad57600080fd5b803561232c816124d4565b6000806040838503121561250057600080fd5b823561250b816122ff565b9150602083013561251b816124d4565b809150509250929050565b6000806040838503121561253957600080fd5b8235612544816122ff565b946020939093013593505050565b60005b8381101561256d578181015183820152602001612555565b50506000910152565b60008251612588818460208701612552565b9190910192915050565b81810381811115610266577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000602082840312156125de57600080fd5b5051919050565b6000602082840312156125f757600080fd5b8135611eb3816124d4565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010073ffffffffffffffffffffffffffffffffffffffff80881684528651818151166020860152816020820151166040860152604081015165ffffffffffff80821660608801528060608401511660808801525050508060208801511660a085015250604086015160c08401528060e08401526121b18184018587612602565b6000602082840312156126e057600080fd5b8151611eb3816124d4565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261272057600080fd5b83018035915067ffffffffffffffff82111561273b57600080fd5b60200191503681900382131561238957600080fd5b8183823760009101908152919050565b803560ff8116811461232c57600080fd5b60006020828403121561278357600080fd5b611eb382612760565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126127c157600080fd5b830160208101925035905067ffffffffffffffff8111156127e157600080fd5b80360382131561238957600080fd5b60208152813560208201526000612809602084016124e2565b801515604084015250604083013560608301526060830135608083015261283260808401612321565b73ffffffffffffffffffffffffffffffffffffffff811660a08401525061285b60a08401612321565b73ffffffffffffffffffffffffffffffffffffffff811660c08401525061288460c08401612321565b73ffffffffffffffffffffffffffffffffffffffff811660e0840152506128ad60e08401612321565b6101006128d18185018373ffffffffffffffffffffffffffffffffffffffff169052565b6128dc818601612321565b9150506101206129038185018373ffffffffffffffffffffffffffffffffffffffff169052565b61290e818601612760565b9150506101406129228185018360ff169052565b61292d818601612760565b9150506101606129418185018360ff169052565b61294d8186018661278c565b925090506101c0610180818187015261296b6101e087018585612602565b93506129798188018861278c565b935090506101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087860301818801526129b4858584612602565b970135919095015250929392505050565b60208152600082518060208401526129e4816040850160208701612552565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212206397791d9984b699c901a2d0ea2696bfe0d981c227c325996caee3f7a0c2ac9f64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000dac2064178831b8c2ed5f08b7cf207c01a989b23
-----Decoded View---------------
Arg [0] : _PERMIT2 (address): 0x000000000022D473030F116dDEE9F6B43aC78BA3
Arg [1] : _FORWARDER (address): 0xDAC2064178831b8C2Ed5f08b7Cf207C01A989b23
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3
Arg [1] : 000000000000000000000000dac2064178831b8c2ed5f08b7cf207c01a989b23
Deployed Bytecode Sourcemap
21302:8816:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22744:127;;;;;;:::i;:::-;;:::i;:::-;;;796:14:1;;789:22;771:41;;759:2;744:18;22744:127:0;;;;;;;;21549:32;;;;;;;;;;;;;;;;;;1131:42:1;1119:55;;;1101:74;;1089:2;1074:18;21549:32:0;955:226:1;23506:231:0;;;;;;:::i;:::-;;:::i;2721:103::-;;;;;;;;;;;;;:::i;:::-;;21725:42;;;;;;;;;;-1:-1:-1;21725:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;2070:87;;;;;;;;;;-1:-1:-1;2116:7:0;2143:6;;;2070:87;;21636:34;;;;;;;;;;;;;;;29461:244;;;;;;;;;;-1:-1:-1;29461:244:0;;;;;:::i;:::-;;:::i;2979:201::-;;;;;;;;;;-1:-1:-1;2979:201:0;;;;;:::i;:::-;;:::i;29762:353::-;;;;;;;;;;-1:-1:-1;29762:353:0;;;;;:::i;:::-;;:::i;22744:127::-;22833:4;22852:13;22857:7;22852:4;:13::i;:::-;22845:20;22744:127;-1:-1:-1;;22744:127:0:o;23506:231::-;23674:4;23693:38;23698:7;23707:12;23721:9;;23693:4;:38::i;:::-;23686:45;23506:231;-1:-1:-1;;;;;23506:231:0:o;2721:103::-;2116:7;2143:6;2290:23;2143:6;804:10;2290:23;2282:68;;;;;;;6048:2:1;2282:68:0;;;6030:21:1;;;6067:18;;;6060:30;6126:34;6106:18;;;6099:62;6178:18;;2282:68:0;;;;;;;;;2786:30:::1;2813:1;2786:18;:30::i;:::-;2721:103::o:0;29461:244::-;29536:4;2143:6;;2290:23;2143:6;804:10;2290:23;2282:68;;;;;;;6048:2:1;2282:68:0;;;6030:21:1;;;6067:18;;;6060:30;6126:34;6106:18;;;6099:62;6178:18;;2282:68:0;5846:356:1;2282:68:0;29549:19:::1;::::0;::::1;;::::0;;;:9:::1;:19;::::0;;;;:29;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;29585:97:::1;;29611:17;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;29585:97;;;29656:18;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;29585:97;-1:-1:-1::0;29695:4:0::1;29461:244:::0;;;;:::o;2979:201::-;2116:7;2143:6;2290:23;2143:6;804:10;2290:23;2282:68;;;;;;;6048:2:1;2282:68:0;;;6030:21:1;;;6067:18;;;6060:30;6126:34;6106:18;;;6099:62;6178:18;;2282:68:0;5846:356:1;2282:68:0;3068:22:::1;::::0;::::1;3060:73;;;::::0;::::1;::::0;;6409:2:1;3060:73:0::1;::::0;::::1;6391:21:1::0;6448:2;6428:18;;;6421:30;6487:34;6467:18;;;6460:62;6558:8;6538:18;;;6531:36;6584:19;;3060:73:0::1;6207:402:1::0;3060:73:0::1;3144:28;3163:8;3144:18;:28::i;:::-;2979:201:::0;:::o;29762:353::-;29850:4;2143:6;;2290:23;2143:6;804:10;2290:23;2282:68;;;;;;;6048:2:1;2282:68:0;;;6030:21:1;;;6067:18;;;6060:30;6126:34;6106:18;;;6099:62;6178:18;;2282:68:0;5846:356:1;2282:68:0;29866:15;::::1;::::0;::::1;::::0;29863:229:::1;;29950:12;::::0;;29893::::1;29950::::0;;;::::1;::::0;::::1;::::0;;;29918:10:::1;::::0;29942:6;;29910:53:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29892:71;;;29980:7;29972:43;;;::::0;::::1;::::0;;7363:2:1;29972:43:0::1;::::0;::::1;7345:21:1::0;7402:2;7382:18;;;7375:30;7441:25;7421:18;;;7414:53;7484:18;;29972:43:0::1;7161:347:1::0;29972:43:0::1;29883:140;29863:229;;;30038:46;:26;::::0;::::1;30065:10;30077:6:::0;30038:26:::1;:46::i;22283:379::-:0;22365:4;22377:23;22407:24;22478:31;22501:7;22478:22;:31::i;:::-;22440:69;;-1:-1:-1;22440:69:0;-1:-1:-1;22516:15:0;22523:7;22516:6;:15::i;:::-;22538:24;22554:7;22538:15;:24::i;:::-;22569:67;22593:7;22602:15;22619:16;22569:23;:67::i;:::-;-1:-1:-1;22652:4:0;;22283:379;-1:-1:-1;;;22283:379:0:o;22940:497::-;23101:4;23113:23;23143:24;23214:31;23237:7;23214:22;:31::i;:::-;23176:69;;-1:-1:-1;23176:69:0;-1:-1:-1;23252:32:0;23260:12;23274:9;;23252:7;:32::i;:::-;23291:15;23298:7;23291:6;:15::i;:::-;23313:24;23329:7;23313:15;:24::i;:::-;23344:67;23368:7;23377:15;23394:16;23344:23;:67::i;:::-;-1:-1:-1;23427:4:0;;22940:497;-1:-1:-1;;;;;;22940:497:0:o;3340:191::-;3414:16;3433:6;;;3450:17;;;;;;;;;;3483:40;;3433:6;;;;;;;3483:40;;3414:16;3483:40;3403:128;3340:191;:::o;15439:211::-;15583:58;;7717:42:1;7705:55;;15583:58:0;;;7687:74:1;7777:18;;;7770:34;;;15556:86:0;;15576:5;;15606:23;;7660:18:1;;15583:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15556:19;:86::i;:::-;15439:211;;;:::o;23743:813::-;23833:23;23858:24;23978:15;23959:7;:16;;;:34;23951:82;;;;;;;8017:2:1;23951:82:0;;;7999:21:1;8056:2;8036:18;;;8029:30;8095:34;8075:18;;;8068:62;8166:5;8146:18;;;8139:33;8189:19;;23951:82:0;7815:399:1;23951:82:0;21475:42;24092:22;;;;;;;;:::i;:::-;:32;;;24089:201;;24153:33;24177:9;24153:21;:33;:::i;:::-;24135:51;;24089:201;;;24234:22;;;;;;;;:::i;:::-;24227:55;;;;;24276:4;24227:55;;;1101:74:1;24227:40:0;;;;;;;;1074:18:1;;24227:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24209:73;;24089:201;21475:42;24349:23;;;;;;;;:::i;:::-;:33;;;24346:205;;24412:33;24436:9;24412:21;:33;:::i;:::-;24393:52;;23743:813;;;:::o;24346:205::-;24494:23;;;;;;;;:::i;:::-;24487:56;;;;;24537:4;24487:56;;;1101:74:1;24487:41:0;;;;;;;;1074:18:1;;24487:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24881:558::-;21475:42;25040:22;;;;;;;;:::i;:::-;:32;;;25037:397;;25104:16;;25091:9;:29;;25083:77;;;;;;;8897:2:1;25083:77:0;;;8879:21:1;8936:2;8916:18;;;8909:30;8975:34;8955:18;;;8948:62;9046:5;9026:18;;;9019:33;9069:19;;25083:77:0;8695:399:1;25037:397:0;25177:15;;;;;;;;:::i;:::-;25174:260;;;25203:30;25212:7;25203:30;;25234:10;25254:4;25269:16;;25288:22;;;;;;;;:::i;:::-;25203:108;;;;;;;;;;9586:42:1;9655:15;;;25203:108:0;;;9637:34:1;9707:15;;;9687:18;;;9680:43;9759:15;;;9739:18;;;9732:43;9811:15;;;9791:18;;;9784:43;9548:19;;25203:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2979:201;:::o;25174:260::-;25334:92;25382:10;25402:4;25409:16;;25341:22;;;;;;;;:::i;:::-;25334:47;;;:92;;:47;:92::i;25445:400::-;25604:1;25569:23;;;;;;;;:::i;:::-;:37;;;25566:76;;25617:17;25626:7;25617:8;:17::i;:::-;25693:21;25706:7;25693:12;:21::i;:::-;25803:1;25765:26;;;;;;;;:::i;:::-;:40;;;25762:78;;25816:16;25824:7;25816;:16::i;25851:864::-;21475:42;26044:22;;;;;;;;:::i;:::-;:32;;;26041:305;;26120:15;26095:21;:40;;26087:97;;;;;;;10040:2:1;26087:97:0;;;10022:21:1;10079:2;10059:18;;;10052:30;10118:34;10098:18;;;10091:62;10189:14;10169:18;;;10162:42;10221:19;;26087:97:0;9838:408:1;26087:97:0;26041:305;;;26274:15;26222:22;;;;;;;;:::i;:::-;26215:55;;;;;26264:4;26215:55;;;1101:74:1;26215:40:0;;;;;;;;1074:18:1;;26215:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;26207:131;;;;;;;10040:2:1;26207:131:0;;;10022:21:1;10079:2;10059:18;;;10052:30;10118:34;10098:18;;;10091:62;10189:14;10169:18;;;10162:42;10221:19;;26207:131:0;9838:408:1;26207:131:0;21475:42;26402:23;;;;;;;;:::i;:::-;:33;;;26399:311;;26479:16;26454:21;:41;;26446:99;;;;;;;10453:2:1;26446:99:0;;;10435:21:1;10492:2;10472:18;;;10465:30;10531:34;10511:18;;;10504:62;10602:15;10582:18;;;10575:43;10635:19;;26446:99:0;10251:409:1;26399:311:0;26636:16;26583:23;;;;;;;;:::i;:::-;26576:56;;;;;26626:4;26576:56;;;1101:74:1;26576:41:0;;;;;;;;1074:18:1;;26576:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:76;;26568:134;;;;;;;10453:2:1;26568:134:0;;;10435:21:1;10492:2;10472:18;;;10465:30;10531:34;10511:18;;;10504:62;10602:15;10582:18;;;10575:43;10635:19;;26568:134:0;10251:409:1;24576:223:0;24695:98;;;;;:24;24704:7;24695:24;;;;:98;;24728:10;;24756:12;;24777:9;;;;24695:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24576:223;;;:::o;18012:716::-;18436:23;18462:69;18490:4;18462:69;;;;;;;;;;;;;;;;;18470:5;18462:27;;;;:69;;;;;:::i;:::-;18546:17;;18436:95;;-1:-1:-1;18546:21:0;18542:179;;18643:10;18632:30;;;;;;;;;;;;:::i;:::-;18624:85;;;;;;;12429:2:1;18624:85:0;;;12411:21:1;12468:2;12448:18;;;12441:30;12507:34;12487:18;;;12480:62;12578:12;12558:18;;;12551:40;12608:19;;18624:85:0;12227:406:1;15658:248:0;15829:68;;12850:42:1;12919:15;;;15829:68:0;;;12901:34:1;12971:15;;12951:18;;;12944:43;13003:18;;;12996:34;;;15802:96:0;;15822:5;;15852:27;;12813:18:1;;15829:68:0;12638:398:1;15802:96:0;15658:248;;;;:::o;26721:778::-;26804:9;:34;26814:23;;;;;;;;:::i;:::-;26804:34;;;;;;;;;;;;;-1:-1:-1;26804:34:0;;;;26796:85;;;;;;;13243:2:1;26796:85:0;;;13225:21:1;13282:2;13262:18;;;13255:30;13321:34;13301:18;;;13294:62;13392:8;13372:18;;;13365:36;13418:19;;26796:85:0;13041:402:1;26796:85:0;26888:12;21475:42;26910:22;;;;;;;;:::i;:::-;:32;;;26907:532;;26966:23;;;;;;;;:::i;:::-;:28;;27002:9;27013:24;;;;:7;:24;:::i;:::-;26966:72;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26953:85;;;;;26907:532;;;27064:20;;;;;;;;:::i;:::-;:25;;27088:1;27064:25;27061:295;;27110:85;27153:23;;;;;;;;:::i;:::-;27178:16;;27117:22;;;;;;;;:::i;:::-;27110:42;;;:85;:42;:85::i;:::-;27061:295;;;27214:20;;;;;;;;:::i;:::-;:25;;27238:1;27214:25;27211:145;;27260:86;27304:23;;;;;;;;:::i;:::-;27329:16;;27267:22;;;;;;;;:::i;:::-;27260:43;;;:86;:43;:86::i;:::-;27377:23;;;;;;;;:::i;:::-;:28;;27406:24;;;;:7;:24;:::i;:::-;27377:54;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27364:67:0;;-1:-1:-1;;26907:532:0;27453:7;27445:48;;;;;;;14859:2:1;27445:48:0;;;14841:21:1;14898:2;14878:18;;;14871:30;14937;14917:18;;;14910:58;14985:18;;27445:48:0;14657:352:1;27445:48:0;26789:710;26721:778;:::o;27505:1203::-;27587:20;;;;;;;;:::i;:::-;:25;;;27584:1119;;27662:12;21475:42;27688:23;;;;;;;;:::i;:::-;:33;;;27685:418;;27764:9;27746:36;;;27790:7;:21;;;27813:7;27746:75;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27736:85;-1:-1:-1;27860:30:0;;;;;;;;:::i;:::-;27839:75;;27848:10;27839:75;;;27892:7;:21;;;27839:75;;;;18014:25:1;;18002:2;17987:18;;17868:177;27839:75:0;;;;;;;;27685:418;;;27945:78;27990:9;28001:21;;;;27952:23;;;;;;;;:::i;27945:78::-;28046:45;;;;;:36;28064:9;28046:36;;;;:45;;28083:7;;28046:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28036:55;;27685:418;28121:7;28113:65;;;;;;;18252:2:1;28113:65:0;;;18234:21:1;18291:2;18271:18;;;18264:30;18330:34;18310:18;;;18303:62;18401:15;18381:18;;;18374:43;18434:19;;28113:65:0;18050:409:1;27584:1119:0;21475:42;28249:23;;;;;;;;:::i;:::-;:33;;;28246:450;;28296:12;28313:30;;;;;;;;:::i;:::-;28356:21;28379:12;;28389:1;28379:12;;;;;;;;28313:35;;;;;;28356:21;;;;;28313:79;;28379:12;28313:79;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28295:97;;;28411:7;28403:66;;;;;;;18666:2:1;28403:66:0;;;18648:21:1;18705:2;18685:18;;;18678:30;18744:34;18724:18;;;18717:62;18815:16;18795:18;;;18788:44;18849:19;;28403:66:0;18464:410:1;28403:66:0;28506:30;;;;;;;;:::i;:::-;28485:75;;28494:10;28485:75;;;28538:7;:21;;;28485:75;;;;18014:25:1;;18002:2;17987:18;;17868:177;28485:75:0;;;;;;;;28284:286;2979:201;:::o;28246:450::-;28587:99;28632:30;;;;;;;;:::i;:::-;28664:21;;;;28594:23;;;;;;;;:::i;28714:489::-;21475:42;28791:23;;;;;;;;:::i;:::-;:33;;;28788:410;;28836:12;28853:26;;;;;;;;:::i;:::-;28911:12;;;28921:1;28911:12;;;;;;;;;28853:31;;;;;;28892:17;;;;;28853:71;;28911:12;28853:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28835:89;;;28941:7;28933:62;;;;;;;19081:2:1;28933:62:0;;;19063:21:1;19120:2;19100:18;;;19093:30;19159:34;19139:18;;;19132:62;19230:12;19210:18;;;19203:40;19260:19;;28933:62:0;18879:406:1;28933:62:0;29030:26;;;;;;;;:::i;:::-;29009:67;;29018:10;29009:67;;;29058:7;:17;;;29009:67;;;;18014:25:1;;18002:2;17987:18;;17868:177;28788:410:0;29099:91;29144:26;;;;;;;;:::i;:::-;29172:17;;;;29106:23;;;;;;;;:::i;10088:229::-;10225:12;10257:52;10279:6;10287:4;10293:1;10296:12;10257:21;:52::i;:::-;10250:59;;10088:229;;;;;;:::o;16175:616::-;16539:10;;;16538:62;;-1:-1:-1;16555:39:0;;;;;16579:4;16555:39;;;19525:34:1;16555:15:0;19595::1;;;19575:18;;;19568:43;16555:15:0;;;;;19437:18:1;;16555:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;16538:62;16516:166;;;;;;;19824:2:1;16516:166:0;;;19806:21:1;19863:2;19843:18;;;19836:30;19902:34;19882:18;;;19875:62;19973:24;19953:18;;;19946:52;20015:19;;16516:166:0;19622:418:1;16516:166:0;16720:62;;7717:42:1;7705:55;;16720:62:0;;;7687:74:1;7777:18;;;7770:34;;;16693:90:0;;16713:5;;16743:22;;7660:18:1;;16720:62:0;7513:297:1;11208:510:0;11378:12;11436:5;11411:21;:30;;11403:81;;;;;;;20247:2:1;11403:81:0;;;20229:21:1;20286:2;20266:18;;;20259:30;20325:34;20305:18;;;20298:62;20396:8;20376:18;;;20369:36;20422:19;;11403:81:0;20045:402:1;11403:81:0;7605:20;;11495:60;;;;;;;20654:2:1;11495:60:0;;;20636:21:1;20693:2;20673:18;;;20666:30;20732:31;20712:18;;;20705:59;20781:18;;11495:60:0;20452:353:1;11495:60:0;11569:12;11583:23;11610:6;:11;;11629:5;11636:4;11610:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11568:73;;;;11659:51;11676:7;11685:10;11697:12;11659:16;:51::i;:::-;11652:58;11208:510;-1:-1:-1;;;;;;;11208:510:0:o;13894:712::-;14044:12;14073:7;14069:530;;;-1:-1:-1;14104:10:0;14097:17;;14069:530;14218:17;;:21;14214:374;;14416:10;14410:17;14477:15;14464:10;14460:2;14456:19;14449:44;14214:374;14559:12;14552: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:355::-;260:6;313:2;301:9;292:7;288:23;284:32;281:52;;;329:1;326;319:12;281:52;369:9;356:23;402:18;394:6;391:30;388:50;;;434:1;431;424:12;388:50;457:67;516:7;507:6;496:9;492:22;457:67;:::i;:::-;447:77;175:355;-1:-1:-1;;;;175:355:1:o;1375:402::-;1442:2;1436:9;1484:4;1472:17;;1519:18;1504:34;;1540:22;;;1501:62;1498:242;;;1596:77;1593:1;1586:88;1697:4;1694:1;1687:15;1725:4;1722:1;1715:15;1498:242;1756:2;1749:22;1375:402;:::o;1782:407::-;1854:2;1848:9;1896:4;1884:17;;1931:18;1916:34;;1952:22;;;1913:62;1910:242;;;2008:77;2005:1;1998:88;2109:4;2106:1;2099:15;2137:4;2134:1;2127:15;2194:154;2280:42;2273:5;2269:54;2262:5;2259:65;2249:93;;2338:1;2335;2328:12;2353:134;2421:20;;2450:31;2421:20;2450:31;:::i;:::-;2353:134;;;:::o;2492:167::-;2559:20;;2619:14;2608:26;;2598:37;;2588:65;;2649:1;2646;2639:12;2664:347;2715:8;2725:6;2779:3;2772:4;2764:6;2760:17;2756:27;2746:55;;2797:1;2794;2787:12;2746:55;-1:-1:-1;2820:20:1;;2863:18;2852:30;;2849:50;;;2895:1;2892;2885:12;2849:50;2932:4;2924:6;2920:17;2908:29;;2984:3;2977:4;2968:6;2960;2956:19;2952:30;2949:39;2946:59;;;3001:1;2998;2991:12;2946:59;2664:347;;;;;:::o;3016:1610::-;3159:6;3167;3175;3183;3227:9;3218:7;3214:23;3257:3;3253:2;3249:12;3246:32;;;3274:1;3271;3264:12;3246:32;3314:9;3301:23;3343:18;3384:2;3376:6;3373:14;3370:34;;;3400:1;3397;3390:12;3370:34;3423:67;3482:7;3473:6;3462:9;3458:22;3423:67;:::i;:::-;3413:77;;3517:66;3513:2;3509:75;3499:85;;3604:4;3600:2;3596:13;3593:33;;;3622:1;3619;3612:12;3593:33;3648:17;;:::i;:::-;3635:30;;3685:4;3681:2;3677:13;3674:33;;;3703:1;3700;3693:12;3674:33;3731:22;;:::i;:::-;3716:37;;3805:2;3794:9;3790:18;3777:32;3818:33;3843:7;3818:33;:::i;:::-;3860:24;;3936:2;3921:18;;3908:32;3949:33;3908:32;3949:33;:::i;:::-;4011:2;3998:16;;3991:33;4058:39;4091:4;4076:20;;4058:39;:::i;:::-;4053:2;4044:7;4040:16;4033:65;4134:39;4167:4;4156:9;4152:20;4134:39;:::i;:::-;4127:4;4118:7;4114:18;4107:67;4197:7;4190:5;4183:22;4237:39;4271:3;4260:9;4256:19;4237:39;:::i;:::-;4232:2;4225:5;4221:14;4214:63;4337:4;4326:9;4322:20;4309:34;4304:2;4297:5;4293:14;4286:58;4363:5;4353:15;;4421:3;4410:9;4406:19;4393:33;4377:49;;4451:2;4441:8;4438:16;4435:36;;;4467:1;4464;4457:12;4435:36;;;4506:60;4558:7;4547:8;4536:9;4532:24;4506:60;:::i;:::-;3016:1610;;;;-1:-1:-1;4585:8:1;-1:-1:-1;;;;3016:1610:1:o;4631:247::-;4690:6;4743:2;4731:9;4722:7;4718:23;4714:32;4711:52;;;4759:1;4756;4749:12;4711:52;4798:9;4785:23;4817:31;4842:5;4817:31;:::i;4883:118::-;4969:5;4962:13;4955:21;4948:5;4945:32;4935:60;;4991:1;4988;4981:12;5006:128;5071:20;;5100:28;5071:20;5100:28;:::i;5139:382::-;5204:6;5212;5265:2;5253:9;5244:7;5240:23;5236:32;5233:52;;;5281:1;5278;5271:12;5233:52;5320:9;5307:23;5339:31;5364:5;5339:31;:::i;:::-;5389:5;-1:-1:-1;5446:2:1;5431:18;;5418:32;5459:30;5418:32;5459:30;:::i;:::-;5508:7;5498:17;;;5139:382;;;;;:::o;5526:315::-;5594:6;5602;5655:2;5643:9;5634:7;5630:23;5626:32;5623:52;;;5671:1;5668;5661:12;5623:52;5710:9;5697:23;5729:31;5754:5;5729:31;:::i;:::-;5779:5;5831:2;5816:18;;;;5803:32;;-1:-1:-1;;;5526:315:1:o;6614:250::-;6699:1;6709:113;6723:6;6720:1;6717:13;6709:113;;;6799:11;;;6793:18;6780:11;;;6773:39;6745:2;6738:10;6709:113;;;-1:-1:-1;;6856:1:1;6838:16;;6831:27;6614:250::o;6869:287::-;6998:3;7036:6;7030:13;7052:66;7111:6;7106:3;7099:4;7091:6;7087:17;7052:66;:::i;:::-;7134:16;;;;;6869:287;-1:-1:-1;;6869:287:1:o;8219:282::-;8286:9;;;8307:11;;;8304:191;;;8351:77;8348:1;8341:88;8452:4;8449:1;8442:15;8480:4;8477:1;8470:15;8506:184;8576:6;8629:2;8617:9;8608:7;8604:23;8600:32;8597:52;;;8645:1;8642;8635:12;8597:52;-1:-1:-1;8668:16:1;;8506:184;-1:-1:-1;8506:184:1:o;9099:241::-;9155:6;9208:2;9196:9;9187:7;9183:23;9179:32;9176:52;;;9224:1;9221;9214:12;9176:52;9263:9;9250:23;9282:28;9304:5;9282:28;:::i;10665:325::-;10753:6;10748:3;10741:19;10805:6;10798:5;10791:4;10786:3;10782:14;10769:43;;10857:1;10850:4;10841:6;10836:3;10832:16;10828:27;10821:38;10723:3;10979:4;10909:66;10904:2;10896:6;10892:15;10888:88;10883:3;10879:98;10875:109;10868:116;;10665:325;;;;:::o;10995:977::-;11229:4;11258:3;11280:42;11361:2;11353:6;11349:15;11338:9;11331:34;11390:6;11384:13;11448:2;11443;11437:9;11433:18;11428:2;11417:9;11413:18;11406:46;11512:2;11506;11502;11498:11;11492:18;11488:27;11483:2;11472:9;11468:18;11461:55;11559:2;11555;11551:11;11545:18;11582:14;11650:2;11636:12;11632:21;11627:2;11616:9;11612:18;11605:49;11715:2;11709;11705;11701:11;11695:18;11691:27;11685:3;11674:9;11670:19;11663:56;;;;11784:2;11778;11770:6;11766:15;11760:22;11756:31;11750:3;11739:9;11735:19;11728:60;;11843:2;11835:6;11831:15;11825:22;11819:3;11808:9;11804:19;11797:51;11885:2;11879:3;11868:9;11864:19;11857:31;11905:61;11962:2;11951:9;11947:18;11939:6;11931;11905:61;:::i;11977:245::-;12044:6;12097:2;12085:9;12076:7;12072:23;12068:32;12065:52;;;12113:1;12110;12103:12;12065:52;12145:9;12139:16;12164:28;12186:5;12164:28;:::i;13448:580::-;13525:4;13531:6;13591:11;13578:25;13681:66;13670:8;13654:14;13650:29;13646:102;13626:18;13622:127;13612:155;;13763:1;13760;13753:12;13612:155;13790:33;;13842:20;;;-1:-1:-1;13885:18:1;13874:30;;13871:50;;;13917:1;13914;13907:12;13871:50;13950:4;13938:17;;-1:-1:-1;13981:14:1;13977:27;;;13967:38;;13964:58;;;14018:1;14015;14008:12;14033:271;14216:6;14208;14203:3;14190:33;14172:3;14242:16;;14267:13;;;14242:16;14033:271;-1:-1:-1;14033:271:1:o;14309:156::-;14375:20;;14435:4;14424:16;;14414:27;;14404:55;;14455:1;14452;14445:12;14470:182;14527:6;14580:2;14568:9;14559:7;14555:23;14551:32;14548:52;;;14596:1;14593;14586:12;14548:52;14619:27;14636:9;14619:27;:::i;15094:559::-;15152:5;15159:6;15219:3;15206:17;15301:66;15290:8;15274:14;15270:29;15266:102;15246:18;15242:127;15232:155;;15383:1;15380;15373:12;15232:155;15411:33;;15515:4;15502:18;;;-1:-1:-1;15463:21:1;;-1:-1:-1;15543:18:1;15532:30;;15529:50;;;15575:1;15572;15565:12;15529:50;15622:6;15606:14;15602:27;15595:5;15591:39;15588:59;;;15643:1;15640;15633:12;15658:2205;15837:2;15826:9;15819:21;15889:6;15876:20;15871:2;15860:9;15856:18;15849:48;15800:4;15926:32;15954:2;15946:6;15942:15;15926:32;:::i;:::-;605:13;;598:21;16012:2;15997:18;;586:34;15967:49;16077:2;16069:6;16065:15;16052:29;16047:2;16036:9;16032:18;16025:57;16144:2;16136:6;16132:15;16119:29;16113:3;16102:9;16098:19;16091:58;16180:36;16211:3;16203:6;16199:16;16180:36;:::i;:::-;900:42;889:54;;16275:3;16260:19;;877:67;16225:55;16311:36;16342:3;16334:6;16330:16;16311:36;:::i;:::-;900:42;889:54;;16406:3;16391:19;;877:67;16356:55;16442:36;16473:3;16465:6;16461:16;16442:36;:::i;:::-;900:42;889:54;;16537:3;16522:19;;877:67;16487:55;16573:36;16604:3;16596:6;16592:16;16573:36;:::i;:::-;16628:3;16640:54;16690:2;16679:9;16675:18;16659:14;900:42;889:54;877:67;;823:127;16640:54;16725:35;16756:2;16748:6;16744:15;16725:35;:::i;:::-;16703:57;;;16779:3;16791:54;16841:2;16830:9;16826:18;16810:14;900:42;889:54;877:67;;823:127;16791:54;16876:33;16905:2;16897:6;16893:15;16876:33;:::i;:::-;16854:55;;;16928:3;16940:52;16988:2;16977:9;16973:18;16957:14;15081:4;15070:16;15058:29;;15014:75;16940:52;17023:33;17052:2;17044:6;17040:15;17023:33;:::i;:::-;17001:55;;;17075:3;17087:52;17135:2;17124:9;17120:18;17104:14;15081:4;15070:16;15058:29;;15014:75;17087:52;17184:55;17235:2;17227:6;17223:15;17215:6;17184:55;:::i;:::-;17148:91;;;;17258:6;17283:3;17322:2;17317;17306:9;17302:18;17295:30;17348:76;17419:3;17408:9;17404:19;17390:12;17374:14;17348:76;:::i;:::-;17334:90;;17471:55;17522:2;17514:6;17510:15;17502:6;17471:55;:::i;:::-;17433:93;;;;17545:3;17612:66;17600:9;17592:6;17588:22;17584:95;17579:2;17568:9;17564:18;17557:123;17703:65;17761:6;17745:14;17729;17703:65;:::i;:::-;17817:15;;17804:29;17784:18;;;;17777:57;-1:-1:-1;17817:15:1;;17689:79;-1:-1:-1;;;15658:2205:1:o;20810:455::-;20959:2;20948:9;20941:21;20922:4;20991:6;20985:13;21034:6;21029:2;21018:9;21014:18;21007:34;21050:79;21122:6;21117:2;21106:9;21102:18;21097:2;21089:6;21085:15;21050:79;:::i;:::-;21181:2;21169:15;21186:66;21165:88;21150:104;;;;21256:2;21146:113;;20810:455;-1:-1:-1;;20810:455:1:o
Swarm Source
ipfs://6397791d9984b699c901a2d0ea2696bfe0d981c227c325996caee3f7a0c2ac9f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.