Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 52 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Ftat Swap With P... | 18859367 | 231 days ago | IN | 0 ETH | 0.00520071 | ||||
Add Adapter | 18042549 | 345 days ago | IN | 0 ETH | 0.00234988 | ||||
Swap | 17194808 | 464 days ago | IN | 0 ETH | 0.03610984 | ||||
Swap | 17194795 | 464 days ago | IN | 0 ETH | 0.03949141 | ||||
Swap | 17194346 | 464 days ago | IN | 0 ETH | 0.03428129 | ||||
Swap | 17193884 | 465 days ago | IN | 0 ETH | 0.01816743 | ||||
Swap | 17193707 | 465 days ago | IN | 0.055 ETH | 0.01413163 | ||||
Swap | 17193681 | 465 days ago | IN | 0.055 ETH | 0.01135728 | ||||
Swap | 17193474 | 465 days ago | IN | 0.06 ETH | 0.01280398 | ||||
Swap | 17192713 | 465 days ago | IN | 0 ETH | 0.01702977 | ||||
Swap | 17189721 | 465 days ago | IN | 0.505 ETH | 0.01673385 | ||||
Swap | 17189719 | 465 days ago | IN | 0.505 ETH | 0.01583644 | ||||
Swap | 17187179 | 465 days ago | IN | 0.9 ETH | 0.01280886 | ||||
Swap | 17187117 | 465 days ago | IN | 0 ETH | 0.01176214 | ||||
Swap | 17178285 | 467 days ago | IN | 1 ETH | 0.00988467 | ||||
Swap | 17178282 | 467 days ago | IN | 1 ETH | 0.01091845 | ||||
Swap | 17171179 | 468 days ago | IN | 0 ETH | 0.01427491 | ||||
Swap | 17163793 | 469 days ago | IN | 0 ETH | 0.01769917 | ||||
Swap | 17159523 | 469 days ago | IN | 0 ETH | 0.01336595 | ||||
Swap | 17108334 | 477 days ago | IN | 1.035 ETH | 0.00741556 | ||||
Swap | 17102819 | 477 days ago | IN | 0.5 ETH | 0.00715702 | ||||
Swap | 17090911 | 479 days ago | IN | 0 ETH | 0.01659804 | ||||
Swap | 17090907 | 479 days ago | IN | 0 ETH | 0.01854681 | ||||
Swap | 17089793 | 479 days ago | IN | 0 ETH | 0.0123993 | ||||
Swap | 17089762 | 479 days ago | IN | 0 ETH | 0.01415322 |
Latest 16 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17193707 | 465 days ago | 0.055 ETH | ||||
17193681 | 465 days ago | 0.055 ETH | ||||
17193474 | 465 days ago | 0.06 ETH | ||||
17189721 | 465 days ago | 0.505 ETH | ||||
17189719 | 465 days ago | 0.505 ETH | ||||
17187179 | 465 days ago | 0.9 ETH | ||||
17178285 | 467 days ago | 1 ETH | ||||
17178282 | 467 days ago | 1 ETH | ||||
17108334 | 477 days ago | 1.035 ETH | ||||
17102819 | 477 days ago | 0.5 ETH | ||||
17081420 | 480 days ago | 0.6536 ETH | ||||
17081396 | 480 days ago | 0.6536 ETH | ||||
17078426 | 481 days ago | 1 ETH | ||||
17050913 | 485 days ago | 0.01 ETH | ||||
17024864 | 488 days ago | 0.7012898 ETH | ||||
17024864 | 488 days ago | 0.0021102 ETH |
Loading...
Loading
Contract Name:
Router
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* ,« ⁿφφ╔╓, ,φ░╚╚ ╘▒▒▒φ, φ░ ╠░▒▒φ ▄████▄ █▌ ██▀▀▀ φ ▒░░▒▒ ▄██ ██▌ ▄▄▄▄▄ ▄▄▄██▌ ▄▄▄ ▐██▄▄ ▄▄ ▄▄ ░ ╚░░░░ ██ ██ ▐█▌ ██ ▐██ █▌ ██ ██ ▐█▌ ▐█▌ ▐█▌ ░ ░░░░▒ ██▄ ▄██ ▐█▌ ██ ▐██ █▌ ██▀▀▀▀▀ ▐█▌ ██ ██ ░ φ░░░░ ▀██████▀ ▐█▌ ██ ▀█████▌ █████ ▐█▌ ███ ⁿ░≥», ,φ░░░∩ ▄▄██ `ⁿ≥ ,«φ░≥ⁿ` */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./AdapterBase.sol"; /** // @title Ondefy Router // @notice Acts as the registry for DEX aggregator adapters // @author Ondefy */ contract Router is Ownable { using SafeERC20 for IERC20; using SafeERC20 for IERC20Permit; address internal constant NATIVE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address private agent; address private ftatInputToken; uint16 private feeRateBps; event AgentshipTransferred(address oldAgent, address newAgent); event NewAdapter(address adapter, uint256 index); event FeeRateChange(uint16 indexed newFeeRateBps); struct Adapter { address deployedContract; bool isActivated; } /** // @dev The registry of adapters // 0 for 0x, 1 for 1inch, 2 for Paraswap... */ mapping(uint256 => Adapter) public adapters; /** * @dev Initializes the contract. Inherits parent constructor and sets the agent. */ constructor(address _agent, uint16 _feeRateBps, address _ftatInputToken) Ownable() { transferAgentship(_agent); setFeeRate( _feeRateBps); setFtatInput(_ftatInputToken); } /** * @dev Returns the address of the current owner. */ function getAgent() public view returns (address) { return agent; } /** * @dev Returns the address of the current ftat input token. */ function getFtatInputToken() public view returns (address) { return ftatInputToken; } /** * @dev Returns the fixed swap operation fee expressed in bps (not for FTAT operations). */ function getFeeRateBps() public view returns (uint16) { return feeRateBps; } /** * @dev Throws if called by any account other than the agent. */ modifier onlyAgent { require(agent == _msgSender(), "CALLER_IS_NOT_AGENT"); _; } /** // @dev Allows contract to receive ether */ receive() external payable {} /** // @dev Transfer funds and data to selected adapter in order to request swap execution // @param _adapterIndex index of the adapter to call // @param _inputToken input token address // @param _inputAmount swap input amount // @param _outputToken output token address // @param _swapCallData swap callData (intended for one specific protocol) // @notice swap amount in @param _swapCallData must be equal to @param _inputAmount - fee */ function swap(uint256 _adapterIndex, address _inputToken, uint256 _inputAmount, address _outputToken, bytes memory _swapCallData) public payable { require(adapters[_adapterIndex].deployedContract != address(0), "ADAPTER_NOT_DEPLOYED"); require(adapters[_adapterIndex].isActivated, "ADAPTER_NOT_ACTIVATED"); require(_inputToken != _outputToken, "SAME_INPUT_AND_OUTPUT_TOKENS"); uint256 fee = computeSwapFee(_inputAmount); uint256 swapInputAmount = _inputAmount - fee; address payable adapter = payable(adapters[_adapterIndex].deployedContract); if (_inputToken != NATIVE) { IERC20(_inputToken).safeTransferFrom(msg.sender, getAgent(), fee); IERC20(_inputToken).safeTransferFrom(msg.sender, address(adapters[_adapterIndex].deployedContract), swapInputAmount); AdapterBase(adapter).callAction(msg.sender, _inputToken, swapInputAmount, _outputToken, _swapCallData); } else { payable(getAgent()).transfer(fee); AdapterBase(adapter).callAction{value: swapInputAmount}(msg.sender, _inputToken, swapInputAmount, _outputToken, _swapCallData); } } function ftatSwapWithPermit( address _onBehalfOf, uint256 _adapterIndex, uint256 _permitAmount, uint256 _inputFee, uint256 _swapInputAmount, address _outputToken, bytes memory _swapCallData, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public payable onlyAgent { require(adapters[_adapterIndex].deployedContract != address(0), "ADAPTER_NOT_DEPLOYED"); require(adapters[_adapterIndex].isActivated, "ADAPTER_NOT_ACTIVATED"); require(_permitAmount >= _swapInputAmount + _inputFee, "PERMIT_AMOUNT_TOO_LOW"); IERC20Permit(ftatInputToken).safePermit(_onBehalfOf, address(this), _permitAmount, deadline, v, r, s); IERC20(ftatInputToken).safeTransferFrom(_onBehalfOf, getAgent(), _inputFee); address payable adapter = payable(adapters[_adapterIndex].deployedContract); IERC20(ftatInputToken).safeTransferFrom(_onBehalfOf, adapter, _swapInputAmount); AdapterBase(adapter).callAction(_onBehalfOf, ftatInputToken, _swapInputAmount, _outputToken, _swapCallData); } /** // @dev Computes swap fee for a given amount // @param amount amount to swap */ function computeSwapFee(uint256 amount) public view returns (uint) { return (5000 + (amount * feeRateBps)) / 10000; } // Only owner functions /** // @dev Activates selected adapters // @param index adapter index */ function activateAdapter(uint256 index) public onlyOwner { require(adapters[index].deployedContract != address(0), "ADAPTER_NOT_DEPLOYED"); require(!adapters[index].isActivated, "ADAPTER_ALREADY_ACTIVATED"); adapters[index].isActivated = true; } /** // @dev Deactivates selected adapters // @param index adapter index */ function deactivateAdapter(uint256 index) public onlyOwner { require(adapters[index].deployedContract != address(0), "ADAPTER_NOT_DEPLOYED"); require(adapters[index].isActivated, "ADAPTER_ALREADY_DEACTIVATED"); adapters[index].isActivated = false; } /** // @dev Modifies adapter at given index // @param index adapter index // @param _deployedContract address of the deployed contract // @param _isActivated true for activating right away, false otherwise // @dev an adapter must be already present at given index */ function modifyAdapter(uint256 index, address _deployedContract, bool _isActivated) public onlyOwner { adapters[index].deployedContract = _deployedContract; adapters[index].isActivated = _isActivated; emit NewAdapter(_deployedContract, index); } /** // @dev Adds adapter at given index // @param index adapter index // @param _deployedContract address of the deployed contract // @param _isActivated true for activating right away, false otherwise // @dev no adapter should be already present at given index */ function addAdapter(uint256 index, address _deployedContract, bool _isActivated) public onlyOwner { require(adapters[index].deployedContract == address(0), "EXISTING_ADAPTER_AT_GIVEN_INDEX"); modifyAdapter(index, _deployedContract, _isActivated); } /** // @dev Sets fee rate // @param _feeRateBps fee rate in bps */ function setFeeRate(uint16 _feeRateBps) public onlyOwner { require(_feeRateBps < 10000, "INVALID_FEE_RATE"); feeRateBps = _feeRateBps; emit FeeRateChange(_feeRateBps); } /** // @dev Transfers contract funds to userAddress // @param token token address, see NATIVE constant above for native asset transfer // @param recipient recipient of the transfer // @param amount amount to transfer */ function rescueFunds(address token, address recipient, uint256 amount) public onlyOwner { if (token != NATIVE) { IERC20(token).safeTransfer(recipient, amount); } else { payable(recipient).transfer(amount); } } /** // @dev Transfers adapter funds to userAddress // @param index adapter index // @param token token address, see NATIVE constant above for native asset transfer // @param recipient recipient of the transfer // @param amount amount to transfer */ function redeemAdapterFunds(uint256 index, address token, address recipient, uint256 amount) public onlyOwner { AdapterBase(payable(adapters[index].deployedContract)).rescueFunds(token, recipient, amount); } /** // @dev Transfers given adapater governance to _newGovernance // @param index adapter index // @param _newGovernance address of the new governance contract // @dev the new governance contract must implement necessary functions to manage adapter governance and actions */ function transferGovernance(uint256 index, address _newGovernance) public onlyOwner { AdapterBase(payable(adapters[index].deployedContract)).transferGovernance(_newGovernance); } /** * @dev Transfers agentship of the Router to _newAgent * @param _agent new agent */ function transferAgentship(address _agent) public virtual onlyOwner { require(_agent != address(0), "ZERO_ADDRESS_FORBIDDEN"); address oldAgent = agent; agent = _agent; emit OwnershipTransferred(oldAgent, _agent); } /** * @dev Sets FTAT input token and associated fee * @param _ftatInputToken new FTAT input token */ function setFtatInput(address _ftatInputToken) public virtual onlyOwner { require(_ftatInputToken != address(0), "ZERO_ADDRESS_FORBIDDEN"); ftatInputToken = _ftatInputToken; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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 functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// 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; } }
//SPDX-License-Identifier: Unlicensed pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; /** // @title Abstract Contract for protocol adapter. // @notice All adapters will follow this interface. */ abstract contract AdapterBase { using SafeERC20 for IERC20; address internal constant NATIVE = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public router; event GovernanceTransfer(address indexed from, address indexed to); event Swap(address indexed fromWallet, address indexed inputToken, uint256 inputTokenAmount, address indexed outputToken, uint256 returnAmount); /** * @dev Throws if called by any account other than the router. */ modifier onlyDispatcher { require(router == msg.sender, "UNAUTHORIZED"); _; } constructor(address _router) { require(_router != address(0), "ZERO_ADDRESS_FORBIDDEN"); router = _router; } /** // @dev Allows to receive ether */ receive() external payable {} /** // @dev Generic function to call swap protocol // @param _inputToken input token address // @param _inputTokenAmount input token amount // @param _outputToken output token address // @param _swapCallData swap callData (intended for one specific protocol) */ function callAction(address fromUser, address _inputToken, uint256 _inputTokenAmount, address _outputToken, bytes memory _swapCallData) public payable virtual; // onlyRouter functions /** // @dev Transfers funds to chosen recipient // @param token token address // @param recipient recipient of the transfer // @param amount amount to transfer */ function rescueFunds( address token, address recipient, uint256 amount ) external onlyDispatcher { if (token != NATIVE) { IERC20(token).safeTransfer(recipient, amount); } else { payable(recipient).transfer(amount); } } /** // @dev Transfer governance to another contract // @dev set a new value for router // @param _newRouter address of the new governance contract */ function transferGovernance(address _newRouter) public onlyDispatcher { require(_newRouter != address(0), "ZERO_ADDRESS_FORBIDDEN"); router = _newRouter; emit GovernanceTransfer(msg.sender, _newRouter); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_agent","type":"address"},{"internalType":"uint16","name":"_feeRateBps","type":"uint16"},{"internalType":"address","name":"_ftatInputToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAgent","type":"address"},{"indexed":false,"internalType":"address","name":"newAgent","type":"address"}],"name":"AgentshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"newFeeRateBps","type":"uint16"}],"name":"FeeRateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adapter","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"NewAdapter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"activateAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adapters","outputs":[{"internalType":"address","name":"deployedContract","type":"address"},{"internalType":"bool","name":"isActivated","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"_deployedContract","type":"address"},{"internalType":"bool","name":"_isActivated","type":"bool"}],"name":"addAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"computeSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"deactivateAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_onBehalfOf","type":"address"},{"internalType":"uint256","name":"_adapterIndex","type":"uint256"},{"internalType":"uint256","name":"_permitAmount","type":"uint256"},{"internalType":"uint256","name":"_inputFee","type":"uint256"},{"internalType":"uint256","name":"_swapInputAmount","type":"uint256"},{"internalType":"address","name":"_outputToken","type":"address"},{"internalType":"bytes","name":"_swapCallData","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ftatSwapWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAgent","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeRateBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFtatInputToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"_deployedContract","type":"address"},{"internalType":"bool","name":"_isActivated","type":"bool"}],"name":"modifyAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemAdapterFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_feeRateBps","type":"uint16"}],"name":"setFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ftatInputToken","type":"address"}],"name":"setFtatInput","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_adapterIndex","type":"uint256"},{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"uint256","name":"_inputAmount","type":"uint256"},{"internalType":"address","name":"_outputToken","type":"address"},{"internalType":"bytes","name":"_swapCallData","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_agent","type":"address"}],"name":"transferAgentship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"_newGovernance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620038003803806200380083398181016040528101906200003791906200057e565b620000576200004b6200009360201b60201c565b6200009b60201b60201c565b62000068836200015f60201b60201c565b6200007982620002a860201b60201c565b6200008a816200035460201b60201c565b50505062000741565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200016f6200041b60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620001e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d9906200063b565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002b86200041b60201b60201c565b6127108161ffff161062000303576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fa90620006ad565b60405180910390fd5b80600260146101000a81548161ffff021916908361ffff1602179055508061ffff167f7e4a45ed1f20afcb4cee45f6fe29a8a840843ad6a3bc7cbe3b90bc343f20d76e60405160405180910390a250565b620003646200041b60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620003d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ce906200063b565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6200042b6200009360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000451620004ac60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a1906200071f565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200050782620004da565b9050919050565b6200051981620004fa565b81146200052557600080fd5b50565b60008151905062000539816200050e565b92915050565b600061ffff82169050919050565b62000558816200053f565b81146200056457600080fd5b50565b60008151905062000578816200054d565b92915050565b6000806000606084860312156200059a5762000599620004d5565b5b6000620005aa8682870162000528565b9350506020620005bd8682870162000567565b9250506040620005d08682870162000528565b9150509250925092565b600082825260208201905092915050565b7f5a45524f5f414444524553535f464f5242494444454e00000000000000000000600082015250565b600062000623601683620005da565b91506200063082620005eb565b602082019050919050565b60006020820190508181036000830152620006568162000614565b9050919050565b7f494e56414c49445f4645455f5241544500000000000000000000000000000000600082015250565b600062000695601083620005da565b9150620006a2826200065d565b602082019050919050565b60006020820190508181036000830152620006c88162000686565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000707602083620005da565b91506200071482620006cf565b602082019050919050565b600060208201905081810360008301526200073a81620006f8565b9050919050565b6130af80620007516000396000f3fe6080604052600436106101235760003560e01c80636ccae054116100a057806393e18f211161006457806393e18f2114610397578063dcdfb86d146103c2578063f1001e21146103eb578063f2fde38b14610414578063f551eb191461043d5761012a565b80636ccae054146102e7578063715018a61461031057806379aff3e9146103275780638da5cb5b146103505780638fb3c7bc1461037b5761012a565b80633e9b60d4116100e75780633e9b60d4146101fe578063426393311461023b57806342c004df146102575780634ef501ac146102805780635871bd77146102be5761012a565b80630c840cd31461012f57806329ff0773146101585780632f2c11601461018157806336ab0e6a146101ac57806337469683146101d55761012a565b3661012a57005b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190611e39565b610468565b005b34801561016457600080fd5b5061017f600480360381019061017a9190611eda565b61051b565b005b34801561018d57600080fd5b506101966105bc565b6040516101a39190611f16565b60405180910390f35b3480156101b857600080fd5b506101d360048036038101906101ce9190611f31565b6105e6565b005b3480156101e157600080fd5b506101fc60048036038101906101f79190611f96565b610729565b005b34801561020a57600080fd5b5061022560048036038101906102209190611f31565b6107e6565b6040516102329190611ff8565b60405180910390f35b61025560048036038101906102509190612159565b610829565b005b34801561026357600080fd5b5061027e600480360381019061027991906121f0565b610c1c565b005b34801561028c57600080fd5b506102a760048036038101906102a29190611f31565b610d5a565b6040516102b592919061222c565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190611f31565b610dab565b005b3480156102f357600080fd5b5061030e60048036038101906103099190612255565b610eef565b005b34801561031c57600080fd5b50610325610fbb565b005b34801561033357600080fd5b5061034e600480360381019061034991906121f0565b610fcf565b005b34801561035c57600080fd5b5061036561108b565b6040516103729190611f16565b60405180910390f35b61039560048036038101906103909190612317565b6110b4565b005b3480156103a357600080fd5b506103ac61147c565b6040516103b99190612436565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190611f96565b611494565b005b3480156103f757600080fd5b50610412600480360381019061040d9190612451565b61155d565b005b34801561042057600080fd5b5061043b600480360381019061043691906121f0565b61160a565b005b34801561044957600080fd5b5061045261168e565b60405161045f9190611f16565b60405180910390f35b6104706116b8565b6003600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ccae0548484846040518463ffffffff1660e01b81526004016104e393929190612491565b600060405180830381600087803b1580156104fd57600080fd5b505af1158015610511573d6000803e3d6000fd5b5050505050505050565b6105236116b8565b6127108161ffff161061056b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056290612525565b60405180910390fd5b80600260146101000a81548161ffff021916908361ffff1602179055508061ffff167f7e4a45ed1f20afcb4cee45f6fe29a8a840843ad6a3bc7cbe3b90bc343f20d76e60405160405180910390a250565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6105ee6116b8565b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068b90612591565b60405180910390fd5b6003600082815260200190815260200160002060000160149054906101000a900460ff166106f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ee906125fd565b60405180910390fd5b60006003600083815260200190815260200160002060000160146101000a81548160ff02191690831515021790555050565b6107316116b8565b600073ffffffffffffffffffffffffffffffffffffffff166003600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd90612669565b60405180910390fd5b6107e1838383611494565b505050565b6000612710600260149054906101000a900461ffff1661ffff168361080b91906126b8565b6113886108189190612712565b6108229190612797565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff166003600087815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c690612591565b60405180910390fd5b6003600086815260200190815260200160002060000160149054906101000a900460ff16610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092990612814565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099890612880565b60405180910390fd5b60006109ac846107e6565b9050600081856109bc91906128a0565b905060006003600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610b4f57610a7433610a4c61168e565b858a73ffffffffffffffffffffffffffffffffffffffff16611736909392919063ffffffff16565b610ad733600360008b815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848a73ffffffffffffffffffffffffffffffffffffffff16611736909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff166306871d5033898589896040518663ffffffff1660e01b8152600401610b1895949392919061295c565b600060405180830381600087803b158015610b3257600080fd5b505af1158015610b46573d6000803e3d6000fd5b50505050610c12565b610b5761168e565b73ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610b9c573d6000803e3d6000fd5b508073ffffffffffffffffffffffffffffffffffffffff166306871d5083338a868a8a6040518763ffffffff1660e01b8152600401610bdf95949392919061295c565b6000604051808303818588803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b50505050505b5050505050505050565b610c246116b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90612a02565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60036020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16905082565b610db36116b8565b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090612591565b60405180910390fd5b6003600082815260200190815260200160002060000160149054906101000a900460ff1615610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490612a6e565b60405180910390fd5b60016003600083815260200190815260200160002060000160146101000a81548160ff02191690831515021790555050565b610ef76116b8565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610f6e57610f6982828573ffffffffffffffffffffffffffffffffffffffff166117bf9092919063ffffffff16565b610fb6565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fb4573d6000803e3d6000fd5b505b505050565b610fc36116b8565b610fcd6000611845565b565b610fd76116b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90612a02565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110bc611909565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461114b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114290612ada565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e890612591565b60405180910390fd5b600360008b815260200190815260200160002060000160149054906101000a900460ff16611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b90612814565b60405180910390fd5b87876112609190612712565b8910156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990612b46565b60405180910390fd5b6112f98b308b87878787600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661191190979695949392919063ffffffff16565b61134f8b61130561168e565b8a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611736909392919063ffffffff16565b6000600360008c815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506113d98c828a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611736909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff166306871d508d600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b8b8b6040518663ffffffff1660e01b815260040161143c95949392919061295c565b600060405180830381600087803b15801561145657600080fd5b505af115801561146a573d6000803e3d6000fd5b50505050505050505050505050505050565b6000600260149054906101000a900461ffff16905090565b61149c6116b8565b816003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806003600085815260200190815260200160002060000160146101000a81548160ff0219169083151502179055507f5fed70baf9cdf785632d99a5e13a6ba0b7437e20fe78fa43c082726b553d07968284604051611550929190612b66565b60405180910390a1505050565b6115656116b8565b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d38bfff4826040518263ffffffff1660e01b81526004016115d49190611f16565b600060405180830381600087803b1580156115ee57600080fd5b505af1158015611602573d6000803e3d6000fd5b505050505050565b6116126116b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990612c01565b60405180910390fd5b61168b81611845565b50565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116c0611909565b73ffffffffffffffffffffffffffffffffffffffff166116de61108b565b73ffffffffffffffffffffffffffffffffffffffff1614611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b90612c6d565b60405180910390fd5b565b6117b9846323b872dd60e01b85858560405160240161175793929190612491565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611afc565b50505050565b6118408363a9059cbb60e01b84846040516024016117de929190612b66565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611afc565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60008873ffffffffffffffffffffffffffffffffffffffff16637ecebe00896040518263ffffffff1660e01b815260040161194c9190611f16565b60206040518083038186803b15801561196457600080fd5b505afa158015611978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199c9190612ca2565b90508873ffffffffffffffffffffffffffffffffffffffff1663d505accf898989898989896040518863ffffffff1660e01b81526004016119e39796959493929190612ced565b600060405180830381600087803b1580156119fd57600080fd5b505af1158015611a11573d6000803e3d6000fd5b5050505060008973ffffffffffffffffffffffffffffffffffffffff16637ecebe008a6040518263ffffffff1660e01b8152600401611a509190611f16565b60206040518083038186803b158015611a6857600080fd5b505afa158015611a7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa09190612ca2565b9050600182611aaf9190612712565b8114611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790612dce565b60405180910390fd5b50505050505050505050565b6000611b5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611bc39092919063ffffffff16565b9050600081511115611bbe5780806020019051810190611b7e9190612e03565b611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612ea2565b60405180910390fd5b5b505050565b6060611bd28484600085611bdb565b90509392505050565b606082471015611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790612f34565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c499190612f90565b60006040518083038185875af1925050503d8060008114611c86576040519150601f19603f3d011682016040523d82523d6000602084013e611c8b565b606091505b5091509150611c9c87838387611ca8565b92505050949350505050565b60608315611d0b57600083511415611d0357611cc385611d1e565b611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990612ff3565b60405180910390fd5b5b829050611d16565b611d158383611d41565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115611d545781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d889190613057565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611db881611da5565b8114611dc357600080fd5b50565b600081359050611dd581611daf565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e0682611ddb565b9050919050565b611e1681611dfb565b8114611e2157600080fd5b50565b600081359050611e3381611e0d565b92915050565b60008060008060808587031215611e5357611e52611d9b565b5b6000611e6187828801611dc6565b9450506020611e7287828801611e24565b9350506040611e8387828801611e24565b9250506060611e9487828801611dc6565b91505092959194509250565b600061ffff82169050919050565b611eb781611ea0565b8114611ec257600080fd5b50565b600081359050611ed481611eae565b92915050565b600060208284031215611ef057611eef611d9b565b5b6000611efe84828501611ec5565b91505092915050565b611f1081611dfb565b82525050565b6000602082019050611f2b6000830184611f07565b92915050565b600060208284031215611f4757611f46611d9b565b5b6000611f5584828501611dc6565b91505092915050565b60008115159050919050565b611f7381611f5e565b8114611f7e57600080fd5b50565b600081359050611f9081611f6a565b92915050565b600080600060608486031215611faf57611fae611d9b565b5b6000611fbd86828701611dc6565b9350506020611fce86828701611e24565b9250506040611fdf86828701611f81565b9150509250925092565b611ff281611da5565b82525050565b600060208201905061200d6000830184611fe9565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6120668261201d565b810181811067ffffffffffffffff821117156120855761208461202e565b5b80604052505050565b6000612098611d91565b90506120a4828261205d565b919050565b600067ffffffffffffffff8211156120c4576120c361202e565b5b6120cd8261201d565b9050602081019050919050565b82818337600083830152505050565b60006120fc6120f7846120a9565b61208e565b90508281526020810184848401111561211857612117612018565b5b6121238482856120da565b509392505050565b600082601f8301126121405761213f612013565b5b81356121508482602086016120e9565b91505092915050565b600080600080600060a0868803121561217557612174611d9b565b5b600061218388828901611dc6565b955050602061219488828901611e24565b94505060406121a588828901611dc6565b93505060606121b688828901611e24565b925050608086013567ffffffffffffffff8111156121d7576121d6611da0565b5b6121e38882890161212b565b9150509295509295909350565b60006020828403121561220657612205611d9b565b5b600061221484828501611e24565b91505092915050565b61222681611f5e565b82525050565b60006040820190506122416000830185611f07565b61224e602083018461221d565b9392505050565b60008060006060848603121561226e5761226d611d9b565b5b600061227c86828701611e24565b935050602061228d86828701611e24565b925050604061229e86828701611dc6565b9150509250925092565b600060ff82169050919050565b6122be816122a8565b81146122c957600080fd5b50565b6000813590506122db816122b5565b92915050565b6000819050919050565b6122f4816122e1565b81146122ff57600080fd5b50565b600081359050612311816122eb565b92915050565b60008060008060008060008060008060006101608c8e03121561233d5761233c611d9b565b5b600061234b8e828f01611e24565b9b5050602061235c8e828f01611dc6565b9a5050604061236d8e828f01611dc6565b995050606061237e8e828f01611dc6565b985050608061238f8e828f01611dc6565b97505060a06123a08e828f01611e24565b96505060c08c013567ffffffffffffffff8111156123c1576123c0611da0565b5b6123cd8e828f0161212b565b95505060e06123de8e828f01611dc6565b9450506101006123f08e828f016122cc565b9350506101206124028e828f01612302565b9250506101406124148e828f01612302565b9150509295989b509295989b9093969950565b61243081611ea0565b82525050565b600060208201905061244b6000830184612427565b92915050565b6000806040838503121561246857612467611d9b565b5b600061247685828601611dc6565b925050602061248785828601611e24565b9150509250929050565b60006060820190506124a66000830186611f07565b6124b36020830185611f07565b6124c06040830184611fe9565b949350505050565b600082825260208201905092915050565b7f494e56414c49445f4645455f5241544500000000000000000000000000000000600082015250565b600061250f6010836124c8565b915061251a826124d9565b602082019050919050565b6000602082019050818103600083015261253e81612502565b9050919050565b7f414441505445525f4e4f545f4445504c4f594544000000000000000000000000600082015250565b600061257b6014836124c8565b915061258682612545565b602082019050919050565b600060208201905081810360008301526125aa8161256e565b9050919050565b7f414441505445525f414c52454144595f44454143544956415445440000000000600082015250565b60006125e7601b836124c8565b91506125f2826125b1565b602082019050919050565b60006020820190508181036000830152612616816125da565b9050919050565b7f4558495354494e475f414441505445525f41545f474956454e5f494e44455800600082015250565b6000612653601f836124c8565b915061265e8261261d565b602082019050919050565b6000602082019050818103600083015261268281612646565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126c382611da5565b91506126ce83611da5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561270757612706612689565b5b828202905092915050565b600061271d82611da5565b915061272883611da5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561275d5761275c612689565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127a282611da5565b91506127ad83611da5565b9250826127bd576127bc612768565b5b828204905092915050565b7f414441505445525f4e4f545f4143544956415445440000000000000000000000600082015250565b60006127fe6015836124c8565b9150612809826127c8565b602082019050919050565b6000602082019050818103600083015261282d816127f1565b9050919050565b7f53414d455f494e5055545f414e445f4f55545055545f544f4b454e5300000000600082015250565b600061286a601c836124c8565b915061287582612834565b602082019050919050565b600060208201905081810360008301526128998161285d565b9050919050565b60006128ab82611da5565b91506128b683611da5565b9250828210156128c9576128c8612689565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561290e5780820151818401526020810190506128f3565b8381111561291d576000848401525b50505050565b600061292e826128d4565b61293881856128df565b93506129488185602086016128f0565b6129518161201d565b840191505092915050565b600060a0820190506129716000830188611f07565b61297e6020830187611f07565b61298b6040830186611fe9565b6129986060830185611f07565b81810360808301526129aa8184612923565b90509695505050505050565b7f5a45524f5f414444524553535f464f5242494444454e00000000000000000000600082015250565b60006129ec6016836124c8565b91506129f7826129b6565b602082019050919050565b60006020820190508181036000830152612a1b816129df565b9050919050565b7f414441505445525f414c52454144595f41435449564154454400000000000000600082015250565b6000612a586019836124c8565b9150612a6382612a22565b602082019050919050565b60006020820190508181036000830152612a8781612a4b565b9050919050565b7f43414c4c45525f49535f4e4f545f4147454e5400000000000000000000000000600082015250565b6000612ac46013836124c8565b9150612acf82612a8e565b602082019050919050565b60006020820190508181036000830152612af381612ab7565b9050919050565b7f5045524d49545f414d4f554e545f544f4f5f4c4f570000000000000000000000600082015250565b6000612b306015836124c8565b9150612b3b82612afa565b602082019050919050565b60006020820190508181036000830152612b5f81612b23565b9050919050565b6000604082019050612b7b6000830185611f07565b612b886020830184611fe9565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612beb6026836124c8565b9150612bf682612b8f565b604082019050919050565b60006020820190508181036000830152612c1a81612bde565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c576020836124c8565b9150612c6282612c21565b602082019050919050565b60006020820190508181036000830152612c8681612c4a565b9050919050565b600081519050612c9c81611daf565b92915050565b600060208284031215612cb857612cb7611d9b565b5b6000612cc684828501612c8d565b91505092915050565b612cd8816122a8565b82525050565b612ce7816122e1565b82525050565b600060e082019050612d02600083018a611f07565b612d0f6020830189611f07565b612d1c6040830188611fe9565b612d296060830187611fe9565b612d366080830186612ccf565b612d4360a0830185612cde565b612d5060c0830184612cde565b98975050505050505050565b7f5361666545524332303a207065726d697420646964206e6f742073756363656560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612db86021836124c8565b9150612dc382612d5c565b604082019050919050565b60006020820190508181036000830152612de781612dab565b9050919050565b600081519050612dfd81611f6a565b92915050565b600060208284031215612e1957612e18611d9b565b5b6000612e2784828501612dee565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612e8c602a836124c8565b9150612e9782612e30565b604082019050919050565b60006020820190508181036000830152612ebb81612e7f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612f1e6026836124c8565b9150612f2982612ec2565b604082019050919050565b60006020820190508181036000830152612f4d81612f11565b9050919050565b600081905092915050565b6000612f6a826128d4565b612f748185612f54565b9350612f848185602086016128f0565b80840191505092915050565b6000612f9c8284612f5f565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612fdd601d836124c8565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b600081519050919050565b600061302982613013565b61303381856124c8565b93506130438185602086016128f0565b61304c8161201d565b840191505092915050565b60006020820190508181036000830152613071818461301e565b90509291505056fea264697066735822122047e3da003645d5371374aed80f970aa335e495b80b875f71287cc6ecb995156264736f6c6343000809003300000000000000000000000047e739ae6bdf1a04436d4d24fd1580bd20986dff000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Deployed Bytecode
0x6080604052600436106101235760003560e01c80636ccae054116100a057806393e18f211161006457806393e18f2114610397578063dcdfb86d146103c2578063f1001e21146103eb578063f2fde38b14610414578063f551eb191461043d5761012a565b80636ccae054146102e7578063715018a61461031057806379aff3e9146103275780638da5cb5b146103505780638fb3c7bc1461037b5761012a565b80633e9b60d4116100e75780633e9b60d4146101fe578063426393311461023b57806342c004df146102575780634ef501ac146102805780635871bd77146102be5761012a565b80630c840cd31461012f57806329ff0773146101585780632f2c11601461018157806336ab0e6a146101ac57806337469683146101d55761012a565b3661012a57005b600080fd5b34801561013b57600080fd5b5061015660048036038101906101519190611e39565b610468565b005b34801561016457600080fd5b5061017f600480360381019061017a9190611eda565b61051b565b005b34801561018d57600080fd5b506101966105bc565b6040516101a39190611f16565b60405180910390f35b3480156101b857600080fd5b506101d360048036038101906101ce9190611f31565b6105e6565b005b3480156101e157600080fd5b506101fc60048036038101906101f79190611f96565b610729565b005b34801561020a57600080fd5b5061022560048036038101906102209190611f31565b6107e6565b6040516102329190611ff8565b60405180910390f35b61025560048036038101906102509190612159565b610829565b005b34801561026357600080fd5b5061027e600480360381019061027991906121f0565b610c1c565b005b34801561028c57600080fd5b506102a760048036038101906102a29190611f31565b610d5a565b6040516102b592919061222c565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190611f31565b610dab565b005b3480156102f357600080fd5b5061030e60048036038101906103099190612255565b610eef565b005b34801561031c57600080fd5b50610325610fbb565b005b34801561033357600080fd5b5061034e600480360381019061034991906121f0565b610fcf565b005b34801561035c57600080fd5b5061036561108b565b6040516103729190611f16565b60405180910390f35b61039560048036038101906103909190612317565b6110b4565b005b3480156103a357600080fd5b506103ac61147c565b6040516103b99190612436565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190611f96565b611494565b005b3480156103f757600080fd5b50610412600480360381019061040d9190612451565b61155d565b005b34801561042057600080fd5b5061043b600480360381019061043691906121f0565b61160a565b005b34801561044957600080fd5b5061045261168e565b60405161045f9190611f16565b60405180910390f35b6104706116b8565b6003600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ccae0548484846040518463ffffffff1660e01b81526004016104e393929190612491565b600060405180830381600087803b1580156104fd57600080fd5b505af1158015610511573d6000803e3d6000fd5b5050505050505050565b6105236116b8565b6127108161ffff161061056b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056290612525565b60405180910390fd5b80600260146101000a81548161ffff021916908361ffff1602179055508061ffff167f7e4a45ed1f20afcb4cee45f6fe29a8a840843ad6a3bc7cbe3b90bc343f20d76e60405160405180910390a250565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6105ee6116b8565b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068b90612591565b60405180910390fd5b6003600082815260200190815260200160002060000160149054906101000a900460ff166106f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ee906125fd565b60405180910390fd5b60006003600083815260200190815260200160002060000160146101000a81548160ff02191690831515021790555050565b6107316116b8565b600073ffffffffffffffffffffffffffffffffffffffff166003600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd90612669565b60405180910390fd5b6107e1838383611494565b505050565b6000612710600260149054906101000a900461ffff1661ffff168361080b91906126b8565b6113886108189190612712565b6108229190612797565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff166003600087815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156108cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c690612591565b60405180910390fd5b6003600086815260200190815260200160002060000160149054906101000a900460ff16610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092990612814565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099890612880565b60405180910390fd5b60006109ac846107e6565b9050600081856109bc91906128a0565b905060006003600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610b4f57610a7433610a4c61168e565b858a73ffffffffffffffffffffffffffffffffffffffff16611736909392919063ffffffff16565b610ad733600360008b815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848a73ffffffffffffffffffffffffffffffffffffffff16611736909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff166306871d5033898589896040518663ffffffff1660e01b8152600401610b1895949392919061295c565b600060405180830381600087803b158015610b3257600080fd5b505af1158015610b46573d6000803e3d6000fd5b50505050610c12565b610b5761168e565b73ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610b9c573d6000803e3d6000fd5b508073ffffffffffffffffffffffffffffffffffffffff166306871d5083338a868a8a6040518763ffffffff1660e01b8152600401610bdf95949392919061295c565b6000604051808303818588803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b50505050505b5050505050505050565b610c246116b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90612a02565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60036020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16905082565b610db36116b8565b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090612591565b60405180910390fd5b6003600082815260200190815260200160002060000160149054906101000a900460ff1615610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490612a6e565b60405180910390fd5b60016003600083815260200190815260200160002060000160146101000a81548160ff02191690831515021790555050565b610ef76116b8565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610f6e57610f6982828573ffffffffffffffffffffffffffffffffffffffff166117bf9092919063ffffffff16565b610fb6565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fb4573d6000803e3d6000fd5b505b505050565b610fc36116b8565b610fcd6000611845565b565b610fd76116b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90612a02565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110bc611909565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461114b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114290612ada565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360008c815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e890612591565b60405180910390fd5b600360008b815260200190815260200160002060000160149054906101000a900460ff16611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b90612814565b60405180910390fd5b87876112609190612712565b8910156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990612b46565b60405180910390fd5b6112f98b308b87878787600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661191190979695949392919063ffffffff16565b61134f8b61130561168e565b8a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611736909392919063ffffffff16565b6000600360008c815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506113d98c828a600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611736909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff166306871d508d600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b8b8b6040518663ffffffff1660e01b815260040161143c95949392919061295c565b600060405180830381600087803b15801561145657600080fd5b505af115801561146a573d6000803e3d6000fd5b50505050505050505050505050505050565b6000600260149054906101000a900461ffff16905090565b61149c6116b8565b816003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806003600085815260200190815260200160002060000160146101000a81548160ff0219169083151502179055507f5fed70baf9cdf785632d99a5e13a6ba0b7437e20fe78fa43c082726b553d07968284604051611550929190612b66565b60405180910390a1505050565b6115656116b8565b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d38bfff4826040518263ffffffff1660e01b81526004016115d49190611f16565b600060405180830381600087803b1580156115ee57600080fd5b505af1158015611602573d6000803e3d6000fd5b505050505050565b6116126116b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990612c01565b60405180910390fd5b61168b81611845565b50565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116c0611909565b73ffffffffffffffffffffffffffffffffffffffff166116de61108b565b73ffffffffffffffffffffffffffffffffffffffff1614611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b90612c6d565b60405180910390fd5b565b6117b9846323b872dd60e01b85858560405160240161175793929190612491565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611afc565b50505050565b6118408363a9059cbb60e01b84846040516024016117de929190612b66565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611afc565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60008873ffffffffffffffffffffffffffffffffffffffff16637ecebe00896040518263ffffffff1660e01b815260040161194c9190611f16565b60206040518083038186803b15801561196457600080fd5b505afa158015611978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199c9190612ca2565b90508873ffffffffffffffffffffffffffffffffffffffff1663d505accf898989898989896040518863ffffffff1660e01b81526004016119e39796959493929190612ced565b600060405180830381600087803b1580156119fd57600080fd5b505af1158015611a11573d6000803e3d6000fd5b5050505060008973ffffffffffffffffffffffffffffffffffffffff16637ecebe008a6040518263ffffffff1660e01b8152600401611a509190611f16565b60206040518083038186803b158015611a6857600080fd5b505afa158015611a7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa09190612ca2565b9050600182611aaf9190612712565b8114611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790612dce565b60405180910390fd5b50505050505050505050565b6000611b5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611bc39092919063ffffffff16565b9050600081511115611bbe5780806020019051810190611b7e9190612e03565b611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612ea2565b60405180910390fd5b5b505050565b6060611bd28484600085611bdb565b90509392505050565b606082471015611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790612f34565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611c499190612f90565b60006040518083038185875af1925050503d8060008114611c86576040519150601f19603f3d011682016040523d82523d6000602084013e611c8b565b606091505b5091509150611c9c87838387611ca8565b92505050949350505050565b60608315611d0b57600083511415611d0357611cc385611d1e565b611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990612ff3565b60405180910390fd5b5b829050611d16565b611d158383611d41565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115611d545781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d889190613057565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611db881611da5565b8114611dc357600080fd5b50565b600081359050611dd581611daf565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e0682611ddb565b9050919050565b611e1681611dfb565b8114611e2157600080fd5b50565b600081359050611e3381611e0d565b92915050565b60008060008060808587031215611e5357611e52611d9b565b5b6000611e6187828801611dc6565b9450506020611e7287828801611e24565b9350506040611e8387828801611e24565b9250506060611e9487828801611dc6565b91505092959194509250565b600061ffff82169050919050565b611eb781611ea0565b8114611ec257600080fd5b50565b600081359050611ed481611eae565b92915050565b600060208284031215611ef057611eef611d9b565b5b6000611efe84828501611ec5565b91505092915050565b611f1081611dfb565b82525050565b6000602082019050611f2b6000830184611f07565b92915050565b600060208284031215611f4757611f46611d9b565b5b6000611f5584828501611dc6565b91505092915050565b60008115159050919050565b611f7381611f5e565b8114611f7e57600080fd5b50565b600081359050611f9081611f6a565b92915050565b600080600060608486031215611faf57611fae611d9b565b5b6000611fbd86828701611dc6565b9350506020611fce86828701611e24565b9250506040611fdf86828701611f81565b9150509250925092565b611ff281611da5565b82525050565b600060208201905061200d6000830184611fe9565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6120668261201d565b810181811067ffffffffffffffff821117156120855761208461202e565b5b80604052505050565b6000612098611d91565b90506120a4828261205d565b919050565b600067ffffffffffffffff8211156120c4576120c361202e565b5b6120cd8261201d565b9050602081019050919050565b82818337600083830152505050565b60006120fc6120f7846120a9565b61208e565b90508281526020810184848401111561211857612117612018565b5b6121238482856120da565b509392505050565b600082601f8301126121405761213f612013565b5b81356121508482602086016120e9565b91505092915050565b600080600080600060a0868803121561217557612174611d9b565b5b600061218388828901611dc6565b955050602061219488828901611e24565b94505060406121a588828901611dc6565b93505060606121b688828901611e24565b925050608086013567ffffffffffffffff8111156121d7576121d6611da0565b5b6121e38882890161212b565b9150509295509295909350565b60006020828403121561220657612205611d9b565b5b600061221484828501611e24565b91505092915050565b61222681611f5e565b82525050565b60006040820190506122416000830185611f07565b61224e602083018461221d565b9392505050565b60008060006060848603121561226e5761226d611d9b565b5b600061227c86828701611e24565b935050602061228d86828701611e24565b925050604061229e86828701611dc6565b9150509250925092565b600060ff82169050919050565b6122be816122a8565b81146122c957600080fd5b50565b6000813590506122db816122b5565b92915050565b6000819050919050565b6122f4816122e1565b81146122ff57600080fd5b50565b600081359050612311816122eb565b92915050565b60008060008060008060008060008060006101608c8e03121561233d5761233c611d9b565b5b600061234b8e828f01611e24565b9b5050602061235c8e828f01611dc6565b9a5050604061236d8e828f01611dc6565b995050606061237e8e828f01611dc6565b985050608061238f8e828f01611dc6565b97505060a06123a08e828f01611e24565b96505060c08c013567ffffffffffffffff8111156123c1576123c0611da0565b5b6123cd8e828f0161212b565b95505060e06123de8e828f01611dc6565b9450506101006123f08e828f016122cc565b9350506101206124028e828f01612302565b9250506101406124148e828f01612302565b9150509295989b509295989b9093969950565b61243081611ea0565b82525050565b600060208201905061244b6000830184612427565b92915050565b6000806040838503121561246857612467611d9b565b5b600061247685828601611dc6565b925050602061248785828601611e24565b9150509250929050565b60006060820190506124a66000830186611f07565b6124b36020830185611f07565b6124c06040830184611fe9565b949350505050565b600082825260208201905092915050565b7f494e56414c49445f4645455f5241544500000000000000000000000000000000600082015250565b600061250f6010836124c8565b915061251a826124d9565b602082019050919050565b6000602082019050818103600083015261253e81612502565b9050919050565b7f414441505445525f4e4f545f4445504c4f594544000000000000000000000000600082015250565b600061257b6014836124c8565b915061258682612545565b602082019050919050565b600060208201905081810360008301526125aa8161256e565b9050919050565b7f414441505445525f414c52454144595f44454143544956415445440000000000600082015250565b60006125e7601b836124c8565b91506125f2826125b1565b602082019050919050565b60006020820190508181036000830152612616816125da565b9050919050565b7f4558495354494e475f414441505445525f41545f474956454e5f494e44455800600082015250565b6000612653601f836124c8565b915061265e8261261d565b602082019050919050565b6000602082019050818103600083015261268281612646565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126c382611da5565b91506126ce83611da5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561270757612706612689565b5b828202905092915050565b600061271d82611da5565b915061272883611da5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561275d5761275c612689565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127a282611da5565b91506127ad83611da5565b9250826127bd576127bc612768565b5b828204905092915050565b7f414441505445525f4e4f545f4143544956415445440000000000000000000000600082015250565b60006127fe6015836124c8565b9150612809826127c8565b602082019050919050565b6000602082019050818103600083015261282d816127f1565b9050919050565b7f53414d455f494e5055545f414e445f4f55545055545f544f4b454e5300000000600082015250565b600061286a601c836124c8565b915061287582612834565b602082019050919050565b600060208201905081810360008301526128998161285d565b9050919050565b60006128ab82611da5565b91506128b683611da5565b9250828210156128c9576128c8612689565b5b828203905092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561290e5780820151818401526020810190506128f3565b8381111561291d576000848401525b50505050565b600061292e826128d4565b61293881856128df565b93506129488185602086016128f0565b6129518161201d565b840191505092915050565b600060a0820190506129716000830188611f07565b61297e6020830187611f07565b61298b6040830186611fe9565b6129986060830185611f07565b81810360808301526129aa8184612923565b90509695505050505050565b7f5a45524f5f414444524553535f464f5242494444454e00000000000000000000600082015250565b60006129ec6016836124c8565b91506129f7826129b6565b602082019050919050565b60006020820190508181036000830152612a1b816129df565b9050919050565b7f414441505445525f414c52454144595f41435449564154454400000000000000600082015250565b6000612a586019836124c8565b9150612a6382612a22565b602082019050919050565b60006020820190508181036000830152612a8781612a4b565b9050919050565b7f43414c4c45525f49535f4e4f545f4147454e5400000000000000000000000000600082015250565b6000612ac46013836124c8565b9150612acf82612a8e565b602082019050919050565b60006020820190508181036000830152612af381612ab7565b9050919050565b7f5045524d49545f414d4f554e545f544f4f5f4c4f570000000000000000000000600082015250565b6000612b306015836124c8565b9150612b3b82612afa565b602082019050919050565b60006020820190508181036000830152612b5f81612b23565b9050919050565b6000604082019050612b7b6000830185611f07565b612b886020830184611fe9565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612beb6026836124c8565b9150612bf682612b8f565b604082019050919050565b60006020820190508181036000830152612c1a81612bde565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c576020836124c8565b9150612c6282612c21565b602082019050919050565b60006020820190508181036000830152612c8681612c4a565b9050919050565b600081519050612c9c81611daf565b92915050565b600060208284031215612cb857612cb7611d9b565b5b6000612cc684828501612c8d565b91505092915050565b612cd8816122a8565b82525050565b612ce7816122e1565b82525050565b600060e082019050612d02600083018a611f07565b612d0f6020830189611f07565b612d1c6040830188611fe9565b612d296060830187611fe9565b612d366080830186612ccf565b612d4360a0830185612cde565b612d5060c0830184612cde565b98975050505050505050565b7f5361666545524332303a207065726d697420646964206e6f742073756363656560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612db86021836124c8565b9150612dc382612d5c565b604082019050919050565b60006020820190508181036000830152612de781612dab565b9050919050565b600081519050612dfd81611f6a565b92915050565b600060208284031215612e1957612e18611d9b565b5b6000612e2784828501612dee565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612e8c602a836124c8565b9150612e9782612e30565b604082019050919050565b60006020820190508181036000830152612ebb81612e7f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612f1e6026836124c8565b9150612f2982612ec2565b604082019050919050565b60006020820190508181036000830152612f4d81612f11565b9050919050565b600081905092915050565b6000612f6a826128d4565b612f748185612f54565b9350612f848185602086016128f0565b80840191505092915050565b6000612f9c8284612f5f565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612fdd601d836124c8565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b600081519050919050565b600061302982613013565b61303381856124c8565b93506130438185602086016128f0565b61304c8161201d565b840191505092915050565b60006020820190508181036000830152613071818461301e565b90509291505056fea264697066735822122047e3da003645d5371374aed80f970aa335e495b80b875f71287cc6ecb995156264736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000047e739ae6bdf1a04436d4d24fd1580bd20986dff000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
-----Decoded View---------------
Arg [0] : _agent (address): 0x47E739Ae6BdF1A04436d4D24Fd1580BD20986dff
Arg [1] : _feeRateBps (uint16): 30
Arg [2] : _ftatInputToken (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000047e739ae6bdf1a04436d4d24fd1580bd20986dff
Arg [1] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [2] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.