Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,623 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19139424 | 325 days ago | IN | 0 ETH | 0.00131652 | ||||
Withdraw | 19139421 | 325 days ago | IN | 0 ETH | 0.00130297 | ||||
Withdraw | 19139420 | 325 days ago | IN | 0 ETH | 0.00113862 | ||||
Withdraw | 19139418 | 325 days ago | IN | 0 ETH | 0.001169 | ||||
Route | 19134305 | 326 days ago | IN | 0.11 ETH | 0.00503379 | ||||
Route | 19129591 | 326 days ago | IN | 0.11 ETH | 0.00516786 | ||||
Route | 19127629 | 327 days ago | IN | 0.109 ETH | 0.00179923 | ||||
Route | 19125702 | 327 days ago | IN | 0.00433 ETH | 0.00286809 | ||||
Route | 19125647 | 327 days ago | IN | 0.00433 ETH | 0.00345222 | ||||
Route | 19125643 | 327 days ago | IN | 0.00433 ETH | 0.00332536 | ||||
Route | 19125635 | 327 days ago | IN | 0.00433 ETH | 0.00354786 | ||||
Route | 19124875 | 327 days ago | IN | 0.0212 ETH | 0.00283352 | ||||
Route | 19124862 | 327 days ago | IN | 0.0212 ETH | 0.00340559 | ||||
Route | 19124612 | 327 days ago | IN | 0.0212 ETH | 0.00257107 | ||||
Route | 19124595 | 327 days ago | IN | 0.0212 ETH | 0.00327206 | ||||
Route | 19124053 | 327 days ago | IN | 0.107 ETH | 0.00384606 | ||||
Route | 19124041 | 327 days ago | IN | 0.107 ETH | 0.00381076 | ||||
Route | 19123957 | 327 days ago | IN | 0.879 ETH | 0.00296 | ||||
Route | 19122700 | 327 days ago | IN | 0.107 ETH | 0.00320078 | ||||
Route | 19122666 | 327 days ago | IN | 0.107 ETH | 0.00342546 | ||||
Route | 19122441 | 327 days ago | IN | 0.106 ETH | 0.00373543 | ||||
Route | 19122350 | 327 days ago | IN | 0.106 ETH | 0.00391238 | ||||
Route | 19122128 | 327 days ago | IN | 0.0208 ETH | 0.0036989 | ||||
Route | 19121897 | 327 days ago | IN | 0.00848 ETH | 0.00430231 | ||||
Route | 19120993 | 328 days ago | IN | 0.106 ETH | 0.00563332 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
19134305 | 326 days ago | 0.11 ETH | ||||
19129591 | 326 days ago | 0.11 ETH | ||||
19127629 | 327 days ago | 0.109 ETH | ||||
19125702 | 327 days ago | 0.00433 ETH | ||||
19125647 | 327 days ago | 0.00433 ETH | ||||
19125643 | 327 days ago | 0.00433 ETH | ||||
19125635 | 327 days ago | 0.00433 ETH | ||||
19124875 | 327 days ago | 0.0212 ETH | ||||
19124862 | 327 days ago | 0.0212 ETH | ||||
19124612 | 327 days ago | 0.0212 ETH | ||||
19124595 | 327 days ago | 0.0212 ETH | ||||
19124053 | 327 days ago | 0.107 ETH | ||||
19124041 | 327 days ago | 0.107 ETH | ||||
19123957 | 327 days ago | 0.879 ETH | ||||
19122700 | 327 days ago | 0.107 ETH | ||||
19122666 | 327 days ago | 0.107 ETH | ||||
19122441 | 327 days ago | 0.106 ETH | ||||
19122350 | 327 days ago | 0.106 ETH | ||||
19122128 | 327 days ago | 0.0208 ETH | ||||
19121897 | 327 days ago | 0.00848 ETH | ||||
19120993 | 328 days ago | 0.106 ETH | ||||
19119782 | 328 days ago | 0.109 ETH | ||||
19119582 | 328 days ago | 0.109 ETH | ||||
19117531 | 328 days ago | 0.109 ETH | ||||
19116134 | 328 days ago | 0.452 ETH |
Loading...
Loading
Contract Name:
DePayRouterV1
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-27 */ // Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT // pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * // importANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Dependency file: @openzeppelin/contracts/math/SafeMath.sol // pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Dependency file: @openzeppelin/contracts/utils/Address.sol // pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [// importANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * // importANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Dependency file: @openzeppelin/contracts/token/ERC20/SafeERC20.sol // pragma solidity >=0.6.0 <0.8.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/math/SafeMath.sol"; // import "@openzeppelin/contracts/utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Dependency file: contracts/interfaces/IDePayRouterV1Plugin.sol // pragma solidity >=0.7.5 <0.8.0; pragma abicoder v2; interface IDePayRouterV1Plugin { function execute( address[] calldata path, uint[] calldata amounts, address[] calldata addresses, string[] calldata data ) external payable returns(bool); function delegate() external returns(bool); } // Dependency file: contracts/libraries/Helper.sol // Helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library Helper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'Helper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'Helper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'Helper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'Helper::safeTransferETH: ETH transfer failed'); } } // Dependency file: @openzeppelin/contracts/GSN/Context.sol // pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // Dependency file: @openzeppelin/contracts/access/Ownable.sol // pragma solidity >=0.6.0 <0.8.0; // import "@openzeppelin/contracts/GSN/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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // Dependency file: contracts/DePayRouterV1Configuration.sol // pragma solidity >=0.7.5 <0.8.0; // import "@openzeppelin/contracts/access/Ownable.sol"; // Prevents unwanted access to configuration in DePayRouterV1 // Potentially occuring through delegatecall(ing) plugins. contract DePayRouterV1Configuration is Ownable { // List of approved plugins. Use approvePlugin to add new plugins. mapping (address => address) public approvedPlugins; // Approves the provided plugin. function approvePlugin(address plugin) external onlyOwner returns(bool) { approvedPlugins[plugin] = plugin; emit PluginApproved(plugin); return true; } // Event to emit newly approved plugin. event PluginApproved( address indexed pluginAddress ); // Disapproves the provided plugin. function disapprovePlugin(address plugin) external onlyOwner returns(bool) { approvedPlugins[plugin] = address(0); emit PluginDisapproved(plugin); return true; } // Event to emit disapproved plugin. event PluginDisapproved( address indexed pluginAddress ); } // Root file: contracts/DePayRouterV1.sol pragma solidity >=0.7.5 <0.8.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/math/SafeMath.sol"; // import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; // import 'contracts/interfaces/IDePayRouterV1Plugin.sol'; // import 'contracts/libraries/Helper.sol'; // import 'contracts/DePayRouterV1Configuration.sol'; contract DePayRouterV1 { using SafeMath for uint; using SafeERC20 for IERC20; // Address representating ETH (e.g. in payment routing paths) address public constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // Instance of DePayRouterV1Configuration DePayRouterV1Configuration public immutable configuration; // Pass immutable instance to configuration. // This protects from potential delegatecall and access overlay attacks: // https://github.com/DePayFi/depay-ethereum-payments/blob/master/docs/Audit3.md#H02 constructor ( address _configuration ) public { configuration = DePayRouterV1Configuration(_configuration); } // Proxy modifier to DePayRouterV1Configuration modifier onlyOwner() { require(configuration.owner() == msg.sender, "Ownable: caller is not the owner"); _; } receive() external payable { // Accepts ETH payments which is require in order // to swap from and to ETH // especially unwrapping WETH as part of token swaps. } // The main function to route transactions. function route( // The path of the token conversion. address[] calldata path, // Amounts passed to proccessors: // e.g. [amountIn, amountOut, deadline] uint[] calldata amounts, // Addresses passed to plugins: // e.g. [receiver] address[] calldata addresses, // List and order of plugins to be executed for this payment: // e.g. [Uniswap,paymentPlugin] to swap and pay address[] calldata plugins, // Data passed to plugins: // e.g. ["signatureOfSmartContractFunction(address,uint)"] receiving the payment string[] calldata data ) external payable returns(bool) { uint balanceBefore = _balanceBefore(path[path.length-1]); _ensureTransferIn(path[0], amounts[0]); _execute(path, amounts, addresses, plugins, data); _ensureBalance(path[path.length-1], balanceBefore); return true; } // Returns the balance for a token (or ETH) before the payment is executed. // In case of ETH we need to deduct what has been payed in as part of the transaction itself. function _balanceBefore(address token) private returns (uint balance) { balance = _balance(token); if(token == ETH) { balance -= msg.value; } } // This makes sure that the sender has payed in the token (or ETH) // required to perform the payment. function _ensureTransferIn(address tokenIn, uint amountIn) private { if(tokenIn == ETH) { require(msg.value >= amountIn, 'DePay: Insufficient ETH amount payed in!'); } else { Helper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn); } } // Executes plugins in the given order. function _execute( address[] calldata path, uint[] calldata amounts, address[] calldata addresses, address[] calldata plugins, string[] calldata data ) internal { for (uint i = 0; i < plugins.length; i++) { require(_isApproved(plugins[i]), 'DePay: Plugin not approved!'); IDePayRouterV1Plugin plugin = IDePayRouterV1Plugin(configuration.approvedPlugins(plugins[i])); if(plugin.delegate()) { (bool success, bytes memory returnData) = address(plugin).delegatecall(abi.encodeWithSelector( plugin.execute.selector, path, amounts, addresses, data )); require(success, string(returnData)); } else { (bool success, bytes memory returnData) = address(plugin).call(abi.encodeWithSelector( plugin.execute.selector, path, amounts, addresses, data )); require(success, string(returnData)); } } } // This makes sure that the balance after the payment not less than before. // Prevents draining of the contract. function _ensureBalance(address tokenOut, uint balanceBefore) private view { require(_balance(tokenOut) >= balanceBefore, 'DePay: Insufficient balance after payment!'); } // Returns the balance of the payment plugin contract for a token (or ETH). function _balance(address token) private view returns(uint) { if(token == ETH) { return address(this).balance; } else { return IERC20(token).balanceOf(address(this)); } } // Function to check if a plugin address is approved. function isApproved( address pluginAddress ) external view returns(bool){ return _isApproved(pluginAddress); } // Internal function to check if a plugin address is approved. function _isApproved( address pluginAddress ) internal view returns(bool) { return (configuration.approvedPlugins(pluginAddress) != address(0)); } // Allows to withdraw accidentally sent ETH or tokens. function withdraw( address token, uint amount ) external onlyOwner returns(bool) { if(token == ETH) { Helper.safeTransferETH(payable(configuration.owner()), amount); } else { Helper.safeTransfer(token, payable(configuration.owner()), amount); } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_configuration","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"configuration","outputs":[{"internalType":"contract DePayRouterV1Configuration","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pluginAddress","type":"address"}],"name":"isApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"address[]","name":"plugins","type":"address[]"},{"internalType":"string[]","name":"data","type":"string[]"}],"name":"route","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a060405234801561001057600080fd5b5060405161131338038061131383398101604081905261002f91610044565b60601b6001600160601b031916608052610072565b600060208284031215610055578081fd5b81516001600160a01b038116811461006b578182fd5b9392505050565b60805160601c61126b6100a86000398061010f5280610219528061030152806103a1528061045352806105d9525061126b6000f3fe60806040526004361061004e5760003560e01c8063673448dd1461005a5780636c70bee9146100905780638322fff2146100b2578063b7d29a35146100c7578063f3fef3a3146100da57610055565b3661005557005b600080fd5b34801561006657600080fd5b5061007a610075366004610c70565b6100fa565b6040516100879190610fd7565b60405180910390f35b34801561009c57600080fd5b506100a561010d565b6040516100879190610e8b565b3480156100be57600080fd5b506100a5610131565b61007a6100d5366004610cda565b610149565b3480156100e657600080fd5b5061007a6100f5366004610caf565b61020b565b60006101058261043f565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6000806101798c8c600019810181811061015f57fe5b90506020020160208101906101749190610c70565b6104f1565b90506101b98c8c600081811061018b57fe5b90506020020160208101906101a09190610c70565b8b8b60008181106101ad57fe5b9050602002013561052b565b6101cb8c8c8c8c8c8c8c8c8c8c610585565b6101f98c8c60001981018181106101de57fe5b90506020020160208101906101f39190610c70565b826108df565b5060019b9a5050505050505050505050565b6000336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561027057600080fd5b505afa158015610284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a89190610c93565b6001600160a01b0316146102d75760405162461bcd60e51b81526004016102ce90611181565b60405180910390fd5b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561039b576103967f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561035857600080fd5b505afa15801561036c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103909190610c93565b83610907565b610436565b610436837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104309190610c93565b84610999565b50600192915050565b604051637445e0c360e01b815260009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637445e0c390610490908690600401610e8b565b60206040518083038186803b1580156104a857600080fd5b505afa1580156104bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e09190610c93565b6001600160a01b0316141592915050565b60006104fc82610a86565b90506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561010857349003919050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561057557803410156105705760405162461bcd60e51b81526004016102ce9061105e565b610581565b61058182333084610b37565b5050565b60005b838110156108d2576105b985858381811061059f57fe5b90506020020160208101906105b49190610c70565b61043f565b6105d55760405162461bcd60e51b81526004016102ce906111b6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637445e0c387878581811061061257fe5b90506020020160208101906106279190610c70565b6040518263ffffffff1660e01b81526004016106439190610e8b565b60206040518083038186803b15801561065b57600080fd5b505afa15801561066f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106939190610c93565b9050806001600160a01b031663c89e43616040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106d057600080fd5b505af11580156106e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107089190610dc5565b156107ec57600080826001600160a01b031663b869495960e01b8f8f8f8f8f8f8d8d604051602401610741989796959493929190610edc565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161077f9190610e6f565b600060405180830381855af49150503d80600081146107ba576040519150601f19603f3d011682016040523d82523d6000602084013e6107bf565b606091505b50915091508181906107e45760405162461bcd60e51b81526004016102ce9190610fe2565b5050506108c9565b600080826001600160a01b031663b869495960e01b8f8f8f8f8f8f8d8d604051602401610820989796959493929190610edc565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161085e9190610e6f565b6000604051808303816000865af19150503d806000811461089b576040519150601f19603f3d011682016040523d82523d6000602084013e6108a0565b606091505b50915091508181906108c55760405162461bcd60e51b81526004016102ce9190610fe2565b5050505b50600101610588565b5050505050505050505050565b806108e983610a86565b10156105815760405162461bcd60e51b81526004016102ce906110a6565b604080516000808252602082019092526001600160a01b0384169083906040516109319190610e6f565b60006040518083038185875af1925050503d806000811461096e576040519150601f19603f3d011682016040523d82523d6000602084013e610973565b606091505b50509050806109945760405162461bcd60e51b81526004016102ce90611135565b505050565b600080846001600160a01b031663a9059cbb85856040516024016109be929190610ec3565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516109f79190610e6f565b6000604051808303816000865af19150503d8060008114610a34576040519150601f19603f3d011682016040523d82523d6000602084013e610a39565b606091505b5091509150818015610a63575080511580610a63575080806020019051810190610a639190610dc5565b610a7f5760405162461bcd60e51b81526004016102ce906110f0565b5050505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610ab4575047610108565b6040516370a0823160e01b81526001600160a01b038316906370a0823190610ae0903090600401610e8b565b60206040518083038186803b158015610af857600080fd5b505afa158015610b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b309190610de5565b9050610108565b600080856001600160a01b03166323b872dd868686604051602401610b5e93929190610e9f565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051610b979190610e6f565b6000604051808303816000865af19150503d8060008114610bd4576040519150601f19603f3d011682016040523d82523d6000602084013e610bd9565b606091505b5091509150818015610c03575080511580610c03575080806020019051810190610c039190610dc5565b610c1f5760405162461bcd60e51b81526004016102ce90611015565b505050505050565b60008083601f840112610c38578182fd5b50813567ffffffffffffffff811115610c4f578182fd5b6020830191508360208083028501011115610c6957600080fd5b9250929050565b600060208284031215610c81578081fd5b8135610c8c8161121d565b9392505050565b600060208284031215610ca4578081fd5b8151610c8c8161121d565b60008060408385031215610cc1578081fd5b8235610ccc8161121d565b946020939093013593505050565b60008060008060008060008060008060a08b8d031215610cf8578586fd5b8a3567ffffffffffffffff80821115610d0f578788fd5b610d1b8e838f01610c27565b909c509a5060208d0135915080821115610d33578788fd5b610d3f8e838f01610c27565b909a50985060408d0135915080821115610d57578788fd5b610d638e838f01610c27565b909850965060608d0135915080821115610d7b578586fd5b610d878e838f01610c27565b909650945060808d0135915080821115610d9f578384fd5b50610dac8d828e01610c27565b915080935050809150509295989b9194979a5092959850565b600060208284031215610dd6578081fd5b81518015158114610c8c578182fd5b600060208284031215610df6578081fd5b5051919050565b60008284526020808501945082825b85811015610e3a578135610e1f8161121d565b6001600160a01b031687529582019590820190600101610e0c565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008251610e818184602087016111ed565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b600060808252610ef0608083018a8c610dfd565b8281036020848101919091528882526001600160fb1b03891115610f12578283fd5b808902808b8385013780830192505080820183815281858403016040860152610f3c81898b610dfd565b85810360608701528681529250508082018186028301820187855b88811015610fc357858303601f190184528135368b9003601e19018112610f7c578788fd5b8a01803567ffffffffffffffff811115610f94578889fd5b8036038c1315610fa2578889fd5b610faf8582898501610e45565b958701959450505090840190600101610f57565b50909e9d5050505050505050505050505050565b901515815260200190565b60006020825282518060208401526110018160408501602087016111ed565b601f01601f19169190910160400192915050565b60208082526029908201527f48656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726040820152681bdb4819985a5b195960ba1b606082015260800190565b60208082526028908201527f44655061793a20496e73756666696369656e742045544820616d6f756e7420706040820152676179656420696e2160c01b606082015260800190565b6020808252602a908201527f44655061793a20496e73756666696369656e742062616c616e6365206166746560408201526972207061796d656e742160b01b606082015260800190565b60208082526025908201527f48656c7065723a3a736166655472616e736665723a207472616e736665722066604082015264185a5b195960da1b606082015260800190565b6020808252602c908201527f48656c7065723a3a736166655472616e736665724554483a204554482074726160408201526b1b9cd9995c8819985a5b195960a21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f44655061793a20506c7567696e206e6f7420617070726f766564210000000000604082015260600190565b60005b838110156112085781810151838201526020016111f0565b83811115611217576000848401525b50505050565b6001600160a01b038116811461123257600080fd5b5056fea264697066735822122086e1b934ef1af4112b4c1bc210c27a1f9b1f5f98b0de94fb465182a1a90bf3c264736f6c634300070600330000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff
Deployed Bytecode
0x60806040526004361061004e5760003560e01c8063673448dd1461005a5780636c70bee9146100905780638322fff2146100b2578063b7d29a35146100c7578063f3fef3a3146100da57610055565b3661005557005b600080fd5b34801561006657600080fd5b5061007a610075366004610c70565b6100fa565b6040516100879190610fd7565b60405180910390f35b34801561009c57600080fd5b506100a561010d565b6040516100879190610e8b565b3480156100be57600080fd5b506100a5610131565b61007a6100d5366004610cda565b610149565b3480156100e657600080fd5b5061007a6100f5366004610caf565b61020b565b60006101058261043f565b90505b919050565b7f0000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff81565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6000806101798c8c600019810181811061015f57fe5b90506020020160208101906101749190610c70565b6104f1565b90506101b98c8c600081811061018b57fe5b90506020020160208101906101a09190610c70565b8b8b60008181106101ad57fe5b9050602002013561052b565b6101cb8c8c8c8c8c8c8c8c8c8c610585565b6101f98c8c60001981018181106101de57fe5b90506020020160208101906101f39190610c70565b826108df565b5060019b9a5050505050505050505050565b6000336001600160a01b03167f0000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561027057600080fd5b505afa158015610284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a89190610c93565b6001600160a01b0316146102d75760405162461bcd60e51b81526004016102ce90611181565b60405180910390fd5b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561039b576103967f0000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561035857600080fd5b505afa15801561036c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103909190610c93565b83610907565b610436565b610436837f0000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103f857600080fd5b505afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104309190610c93565b84610999565b50600192915050565b604051637445e0c360e01b815260009081907f0000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff6001600160a01b031690637445e0c390610490908690600401610e8b565b60206040518083038186803b1580156104a857600080fd5b505afa1580156104bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e09190610c93565b6001600160a01b0316141592915050565b60006104fc82610a86565b90506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561010857349003919050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561057557803410156105705760405162461bcd60e51b81526004016102ce9061105e565b610581565b61058182333084610b37565b5050565b60005b838110156108d2576105b985858381811061059f57fe5b90506020020160208101906105b49190610c70565b61043f565b6105d55760405162461bcd60e51b81526004016102ce906111b6565b60007f0000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff6001600160a01b0316637445e0c387878581811061061257fe5b90506020020160208101906106279190610c70565b6040518263ffffffff1660e01b81526004016106439190610e8b565b60206040518083038186803b15801561065b57600080fd5b505afa15801561066f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106939190610c93565b9050806001600160a01b031663c89e43616040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106d057600080fd5b505af11580156106e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107089190610dc5565b156107ec57600080826001600160a01b031663b869495960e01b8f8f8f8f8f8f8d8d604051602401610741989796959493929190610edc565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161077f9190610e6f565b600060405180830381855af49150503d80600081146107ba576040519150601f19603f3d011682016040523d82523d6000602084013e6107bf565b606091505b50915091508181906107e45760405162461bcd60e51b81526004016102ce9190610fe2565b5050506108c9565b600080826001600160a01b031663b869495960e01b8f8f8f8f8f8f8d8d604051602401610820989796959493929190610edc565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161085e9190610e6f565b6000604051808303816000865af19150503d806000811461089b576040519150601f19603f3d011682016040523d82523d6000602084013e6108a0565b606091505b50915091508181906108c55760405162461bcd60e51b81526004016102ce9190610fe2565b5050505b50600101610588565b5050505050505050505050565b806108e983610a86565b10156105815760405162461bcd60e51b81526004016102ce906110a6565b604080516000808252602082019092526001600160a01b0384169083906040516109319190610e6f565b60006040518083038185875af1925050503d806000811461096e576040519150601f19603f3d011682016040523d82523d6000602084013e610973565b606091505b50509050806109945760405162461bcd60e51b81526004016102ce90611135565b505050565b600080846001600160a01b031663a9059cbb85856040516024016109be929190610ec3565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516109f79190610e6f565b6000604051808303816000865af19150503d8060008114610a34576040519150601f19603f3d011682016040523d82523d6000602084013e610a39565b606091505b5091509150818015610a63575080511580610a63575080806020019051810190610a639190610dc5565b610a7f5760405162461bcd60e51b81526004016102ce906110f0565b5050505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610ab4575047610108565b6040516370a0823160e01b81526001600160a01b038316906370a0823190610ae0903090600401610e8b565b60206040518083038186803b158015610af857600080fd5b505afa158015610b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b309190610de5565b9050610108565b600080856001600160a01b03166323b872dd868686604051602401610b5e93929190610e9f565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051610b979190610e6f565b6000604051808303816000865af19150503d8060008114610bd4576040519150601f19603f3d011682016040523d82523d6000602084013e610bd9565b606091505b5091509150818015610c03575080511580610c03575080806020019051810190610c039190610dc5565b610c1f5760405162461bcd60e51b81526004016102ce90611015565b505050505050565b60008083601f840112610c38578182fd5b50813567ffffffffffffffff811115610c4f578182fd5b6020830191508360208083028501011115610c6957600080fd5b9250929050565b600060208284031215610c81578081fd5b8135610c8c8161121d565b9392505050565b600060208284031215610ca4578081fd5b8151610c8c8161121d565b60008060408385031215610cc1578081fd5b8235610ccc8161121d565b946020939093013593505050565b60008060008060008060008060008060a08b8d031215610cf8578586fd5b8a3567ffffffffffffffff80821115610d0f578788fd5b610d1b8e838f01610c27565b909c509a5060208d0135915080821115610d33578788fd5b610d3f8e838f01610c27565b909a50985060408d0135915080821115610d57578788fd5b610d638e838f01610c27565b909850965060608d0135915080821115610d7b578586fd5b610d878e838f01610c27565b909650945060808d0135915080821115610d9f578384fd5b50610dac8d828e01610c27565b915080935050809150509295989b9194979a5092959850565b600060208284031215610dd6578081fd5b81518015158114610c8c578182fd5b600060208284031215610df6578081fd5b5051919050565b60008284526020808501945082825b85811015610e3a578135610e1f8161121d565b6001600160a01b031687529582019590820190600101610e0c565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008251610e818184602087016111ed565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b600060808252610ef0608083018a8c610dfd565b8281036020848101919091528882526001600160fb1b03891115610f12578283fd5b808902808b8385013780830192505080820183815281858403016040860152610f3c81898b610dfd565b85810360608701528681529250508082018186028301820187855b88811015610fc357858303601f190184528135368b9003601e19018112610f7c578788fd5b8a01803567ffffffffffffffff811115610f94578889fd5b8036038c1315610fa2578889fd5b610faf8582898501610e45565b958701959450505090840190600101610f57565b50909e9d5050505050505050505050505050565b901515815260200190565b60006020825282518060208401526110018160408501602087016111ed565b601f01601f19169190910160400192915050565b60208082526029908201527f48656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726040820152681bdb4819985a5b195960ba1b606082015260800190565b60208082526028908201527f44655061793a20496e73756666696369656e742045544820616d6f756e7420706040820152676179656420696e2160c01b606082015260800190565b6020808252602a908201527f44655061793a20496e73756666696369656e742062616c616e6365206166746560408201526972207061796d656e742160b01b606082015260800190565b60208082526025908201527f48656c7065723a3a736166655472616e736665723a207472616e736665722066604082015264185a5b195960da1b606082015260800190565b6020808252602c908201527f48656c7065723a3a736166655472616e736665724554483a204554482074726160408201526b1b9cd9995c8819985a5b195960a21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f44655061793a20506c7567696e206e6f7420617070726f766564210000000000604082015260600190565b60005b838110156112085781810151838201526020016111f0565b83811115611217576000848401525b50505050565b6001600160a01b038116811461123257600080fd5b5056fea264697066735822122086e1b934ef1af4112b4c1bc210c27a1f9b1f5f98b0de94fb465182a1a90bf3c264736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff
-----Decoded View---------------
Arg [0] : _configuration (address): 0x6EF8833d250f2Df4E7b66ECA01cA5A0D2a34B2fF
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006ef8833d250f2df4e7b66eca01ca5a0d2a34b2ff
Deployed Bytecode Sourcemap
26218:5108:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30588:126;;;;;;;;;;-1:-1:-1;30588:126:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26500:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26376:72::-;;;;;;;;;;;;;:::i;27318:878::-;;;;;;:::i;:::-;;:::i;31014:309::-;;;;;;;;;;-1:-1:-1;31014:309:0;;;;;:::i;:::-;;:::i;30588:126::-;30663:4;30682:26;30694:13;30682:11;:26::i;:::-;30675:33;;30588:126;;;;:::o;26500:57::-;;;:::o;26376:72::-;26406:42;26376:72;:::o;27318:878::-;27945:4;;27979:35;27994:4;;-1:-1:-1;;27999:13:0;;27994:19;;;;;;;;;;;;;;;;;;;;:::i;:::-;27979:14;:35::i;:::-;27958:56;;28021:38;28039:4;;28044:1;28039:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;28048;;28056:1;28048:10;;;;;;;;;;;;;28021:17;:38::i;:::-;28066:49;28075:4;;28081:7;;28090:9;;28101:7;;28110:4;;28066:8;:49::i;:::-;28122:50;28137:4;;-1:-1:-1;;28142:13:0;;28137:19;;;;;;;;;;;;;;;;;;;;:::i;:::-;28158:13;28122:14;:50::i;:::-;-1:-1:-1;28186:4:0;;27318:878;-1:-1:-1;;;;;;;;;;;27318:878:0:o;31014:309::-;31102:4;27019:10;-1:-1:-1;;;;;26994:35:0;:13;-1:-1:-1;;;;;26994:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26994:35:0;;26986:80;;;;-1:-1:-1;;;26986:80:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;31118:12:0;::::1;26406:42;31118:12;31115:185;;;31141:62;31172:13;-1:-1:-1::0;;;;;31172:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31196:6;31141:22;:62::i;:::-;31115:185;;;31226:66;31246:5;31261:13;-1:-1:-1::0;;;;;31261:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31285:6;31226:19;:66::i;:::-;-1:-1:-1::0;31313:4:0::1;31014:309:::0;;;;:::o;30786:162::-;30883:44;;-1:-1:-1;;;30883:44:0;;30862:4;;;;30883:13;-1:-1:-1;;;;;30883:29:0;;;;:44;;30913:13;;30883:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30883:58:0;;;;30786:162;-1:-1:-1;;30786:162:0:o;28378:156::-;28434:12;28465:15;28474:5;28465:8;:15::i;:::-;28455:25;-1:-1:-1;;;;;;28490:12:0;;26406:42;28490:12;28487:42;;;28517:9;28506:20;;28378:156;;;:::o;28649:283::-;-1:-1:-1;;;;;28726:14:0;;26406:42;28726:14;28723:204;;;28773:8;28760:9;:21;;28752:74;;;;-1:-1:-1;;;28752:74:0;;;;;;;:::i;:::-;28723:204;;;28850:69;28874:7;28883:10;28903:4;28910:8;28850:23;:69::i;:::-;28649:283;;:::o;28981:949::-;29182:6;29177:748;29194:18;;;29177:748;;;29236:23;29248:7;;29256:1;29248:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;29236:11;:23::i;:::-;29228:63;;;;-1:-1:-1;;;29228:63:0;;;;;;;:::i;:::-;29308:27;29359:13;-1:-1:-1;;;;;29359:29:0;;29389:7;;29397:1;29389:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;29359:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29308:93;;29415:6;-1:-1:-1;;;;;29415:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29412:506;;;29446:12;29460:23;29495:6;-1:-1:-1;;;;;29487:28:0;29553:23;;;29578:4;;29584:7;;29593:9;;29604:4;;29516:103;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29516:103:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29516:103:0;-1:-1:-1;;;;;;29516:103:0;;;;;;;;;;29487:133;;;;29516:103;29487:133;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29445:175;;;;29639:7;29655:10;29631:36;;;;;-1:-1:-1;;;29631:36:0;;;;;;;;:::i;:::-;;29412:506;;;;;29695:12;29709:23;29744:6;-1:-1:-1;;;;;29736:20:0;29794:23;;;29819:4;;29825:7;;29834:9;;29845:4;;29757:103;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29757:103:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29757:103:0;-1:-1:-1;;;;;;29757:103:0;;;;;;;;;;29736:125;;;;29757:103;29736:125;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29694:167;;;;29880:7;29896:10;29872:36;;;;;-1:-1:-1;;;29872:36:0;;;;;;;;:::i;:::-;;29412:506;;;-1:-1:-1;29214:3:0;;29177:748;;;;28981:949;;;;;;;;;;:::o;30056:178::-;30168:13;30146:18;30155:8;30146;:18::i;:::-;:35;;30138:90;;;;-1:-1:-1;;;30138:90:0;;;;;;;:::i;21078:199::-;21187:12;;;21147;21187;;;;;;;;;-1:-1:-1;;;;;21165:7:0;;;21180:5;;21165:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21146:54;;;21215:7;21207:64;;;;-1:-1:-1;;;21207:64:0;;;;;;;:::i;:::-;21078:199;;;:::o;20227:397::-;20391:12;20405:17;20426:5;-1:-1:-1;;;;;20426:10:0;20460;20472:2;20476:5;20437:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20437:45:0;;;;;;;;;;;20426:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20390:93;;;;20506:7;:57;;;;-1:-1:-1;20518:11:0;;:16;;:44;;;20549:4;20538:24;;;;;;;;;;;;:::i;:::-;20490:128;;;;-1:-1:-1;;;20490:128:0;;;;;;;:::i;:::-;20227:397;;;;;:::o;30319:206::-;30373:4;-1:-1:-1;;;;;30389:12:0;;26406:42;30389:12;30386:134;;;-1:-1:-1;30421:21:0;30414:28;;30386:134;30474:38;;-1:-1:-1;;;30474:38:0;;-1:-1:-1;;;;;30474:23:0;;;;;:38;;30506:4;;30474:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30467:45;;;;20630:442;20829:12;20843:17;20864:5;-1:-1:-1;;;;;20864:10:0;20898;20910:4;20916:2;20920:5;20875:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20875:51:0;;;;;;;;;;;20864:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20828:99;;;;20950:7;:57;;;;-1:-1:-1;20962:11:0;;:16;;:44;;;20993:4;20982:24;;;;;;;;;;;;:::i;:::-;20934:132;;;;-1:-1:-1;;;20934:132:0;;;;;;;:::i;:::-;20630:442;;;;;;:::o;14:404:1:-;;;147:3;140:4;132:6;128:17;124:27;114:2;;172:8;162;155:26;114:2;-1:-1:-1;202:20:1;;245:18;234:30;;231:2;;;284:8;274;267:26;231:2;328:4;320:6;316:17;304:29;;391:3;384:4;376;368:6;364:17;356:6;352:30;348:41;345:50;342:2;;;408:1;405;398:12;342:2;104:314;;;;;:::o;423:259::-;;535:2;523:9;514:7;510:23;506:32;503:2;;;556:6;548;541:22;503:2;600:9;587:23;619:33;646:5;619:33;:::i;:::-;671:5;493:189;-1:-1:-1;;;493:189:1:o;687:263::-;;810:2;798:9;789:7;785:23;781:32;778:2;;;831:6;823;816:22;778:2;868:9;862:16;887:33;914:5;887:33;:::i;955:327::-;;;1084:2;1072:9;1063:7;1059:23;1055:32;1052:2;;;1105:6;1097;1090:22;1052:2;1149:9;1136:23;1168:33;1195:5;1168:33;:::i;:::-;1220:5;1272:2;1257:18;;;;1244:32;;-1:-1:-1;;;1042:240:1:o;1287:1822::-;;;;;;;;;;;1654:3;1642:9;1633:7;1629:23;1625:33;1622:2;;;1676:6;1668;1661:22;1622:2;1721:9;1708:23;1750:18;1791:2;1783:6;1780:14;1777:2;;;1812:6;1804;1797:22;1777:2;1856:76;1924:7;1915:6;1904:9;1900:22;1856:76;:::i;:::-;1951:8;;-1:-1:-1;1830:102:1;-1:-1:-1;2039:2:1;2024:18;;2011:32;;-1:-1:-1;2055:16:1;;;2052:2;;;2089:6;2081;2074:22;2052:2;2133:78;2203:7;2192:8;2181:9;2177:24;2133:78;:::i;:::-;2230:8;;-1:-1:-1;2107:104:1;-1:-1:-1;2318:2:1;2303:18;;2290:32;;-1:-1:-1;2334:16:1;;;2331:2;;;2368:6;2360;2353:22;2331:2;2412:78;2482:7;2471:8;2460:9;2456:24;2412:78;:::i;:::-;2509:8;;-1:-1:-1;2386:104:1;-1:-1:-1;2597:2:1;2582:18;;2569:32;;-1:-1:-1;2613:16:1;;;2610:2;;;2647:6;2639;2632:22;2610:2;2691:78;2761:7;2750:8;2739:9;2735:24;2691:78;:::i;:::-;2788:8;;-1:-1:-1;2665:104:1;-1:-1:-1;2876:3:1;2861:19;;2848:33;;-1:-1:-1;2893:16:1;;;2890:2;;;2927:6;2919;2912:22;2890:2;;2971:78;3041:7;3030:8;3019:9;3015:24;2971:78;:::i;:::-;2945:104;;3068:8;3058:18;;;3095:8;3085:18;;;1612:1497;;;;;;;;;;;;;:::o;3114:297::-;;3234:2;3222:9;3213:7;3209:23;3205:32;3202:2;;;3255:6;3247;3240:22;3202:2;3292:9;3286:16;3345:5;3338:13;3331:21;3324:5;3321:32;3311:2;;3372:6;3364;3357:22;3416:194;;3539:2;3527:9;3518:7;3514:23;3510:32;3507:2;;;3560:6;3552;3545:22;3507:2;-1:-1:-1;3588:16:1;;3497:113;-1:-1:-1;3497:113:1:o;3615:532::-;;3721:6;3716:3;3709:19;3747:4;3776:2;3771:3;3767:12;3760:19;;3802:5;3825:3;3837:285;3851:6;3848:1;3845:13;3837:285;;;3928:6;3915:20;3948:35;3975:7;3948:35;:::i;:::-;-1:-1:-1;;;;;4008:33:1;3996:46;;4062:12;;;;4097:15;;;;4038:1;3866:9;3837:285;;;-1:-1:-1;4138:3:1;;3699:448;-1:-1:-1;;;;;3699:448:1:o;4152:271::-;;4243:6;4238:3;4231:19;4295:6;4288:5;4281:4;4276:3;4272:14;4259:43;4347:3;4340:4;4331:6;4326:3;4322:16;4318:27;4311:40;4412:4;4405:2;4401:7;4396:2;4388:6;4384:15;4380:29;4375:3;4371:39;4367:50;4360:57;;4221:202;;;;;:::o;4428:274::-;;4595:6;4589:13;4611:53;4657:6;4652:3;4645:4;4637:6;4633:17;4611:53;:::i;:::-;4680:16;;;;;4565:137;-1:-1:-1;;4565:137:1:o;4707:203::-;-1:-1:-1;;;;;4871:32:1;;;;4853:51;;4841:2;4826:18;;4808:102::o;5131:375::-;-1:-1:-1;;;;;5389:15:1;;;5371:34;;5441:15;;;;5436:2;5421:18;;5414:43;5488:2;5473:18;;5466:34;;;;5321:2;5306:18;;5288:218::o;5511:274::-;-1:-1:-1;;;;;5703:32:1;;;;5685:51;;5767:2;5752:18;;5745:34;5673:2;5658:18;;5640:145::o;5790:2093::-;;6265:3;6254:9;6247:22;6292:80;6367:3;6356:9;6352:19;6344:6;6336;6292:80;:::i;:::-;6429:22;;;6391:2;6409:18;;;6402:50;;;;6461:22;;;-1:-1:-1;;;;;6495:31:1;;6492:2;;;6542:4;6536;6529:18;6492:2;6584;6576:6;6572:15;6634:6;6626;6621:2;6613:6;6609:15;6596:45;6672:6;6664;6660:19;6650:29;;;6706:2;6702;6698:11;6729:4;6725:2;6718:16;6794:2;6782:9;6778:2;6774:18;6770:27;6765:2;6754:9;6750:18;6743:55;6821:63;6881:2;6873:6;6865;6821:63;:::i;:::-;6920:22;;;6915:2;6900:18;;6893:50;6978:22;;;6807:77;-1:-1:-1;;7016:15:1;;;7070;;;7058:28;;7054:37;;7114:6;7138:4;7151:703;7165:6;7162:1;7159:13;7151:703;;;7230:19;;;-1:-1:-1;;7226:33:1;7214:46;;7299:20;;7374:14;7370:27;;;-1:-1:-1;;7366:41:1;7342:66;;7332:2;;7425:4;7419;7412:18;7332:2;7458:31;;7518:19;;7566:18;7553:32;;7550:2;;;7601:4;7595;7588:18;7550:2;7656:8;7640:14;7636:29;7628:6;7624:42;7621:2;;;7682:4;7676;7669:18;7621:2;7712:62;7767:6;7757:8;7752:2;7745:5;7741:14;7712:62;:::i;:::-;7832:12;;;;7702:72;-1:-1:-1;;;7797:15:1;;;;7187:1;7180:9;7151:703;;;-1:-1:-1;7871:6:1;;6237:1646;-1:-1:-1;;;;;;;;;;;;;;6237:1646:1:o;7888:187::-;8053:14;;8046:22;8028:41;;8016:2;8001:18;;7983:92::o;8323:383::-;;8472:2;8461:9;8454:21;8504:6;8498:13;8547:6;8542:2;8531:9;8527:18;8520:34;8563:66;8622:6;8617:2;8606:9;8602:18;8597:2;8589:6;8585:15;8563:66;:::i;:::-;8690:2;8669:15;-1:-1:-1;;8665:29:1;8650:45;;;;8697:2;8646:54;;8444:262;-1:-1:-1;;8444:262:1:o;8711:405::-;8913:2;8895:21;;;8952:2;8932:18;;;8925:30;8991:34;8986:2;8971:18;;8964:62;-1:-1:-1;;;9057:2:1;9042:18;;9035:39;9106:3;9091:19;;8885:231::o;9121:404::-;9323:2;9305:21;;;9362:2;9342:18;;;9335:30;9401:34;9396:2;9381:18;;9374:62;-1:-1:-1;;;9467:2:1;9452:18;;9445:38;9515:3;9500:19;;9295:230::o;9530:406::-;9732:2;9714:21;;;9771:2;9751:18;;;9744:30;9810:34;9805:2;9790:18;;9783:62;-1:-1:-1;;;9876:2:1;9861:18;;9854:40;9926:3;9911:19;;9704:232::o;9941:401::-;10143:2;10125:21;;;10182:2;10162:18;;;10155:30;10221:34;10216:2;10201:18;;10194:62;-1:-1:-1;;;10287:2:1;10272:18;;10265:35;10332:3;10317:19;;10115:227::o;10347:408::-;10549:2;10531:21;;;10588:2;10568:18;;;10561:30;10627:34;10622:2;10607:18;;10600:62;-1:-1:-1;;;10693:2:1;10678:18;;10671:42;10745:3;10730:19;;10521:234::o;10760:356::-;10962:2;10944:21;;;10981:18;;;10974:30;11040:34;11035:2;11020:18;;11013:62;11107:2;11092:18;;10934:182::o;11121:351::-;11323:2;11305:21;;;11362:2;11342:18;;;11335:30;11401:29;11396:2;11381:18;;11374:57;11463:2;11448:18;;11295:177::o;11477:258::-;11549:1;11559:113;11573:6;11570:1;11567:13;11559:113;;;11649:11;;;11643:18;11630:11;;;11623:39;11595:2;11588:10;11559:113;;;11690:6;11687:1;11684:13;11681:2;;;11725:1;11716:6;11711:3;11707:16;11700:27;11681:2;;11530:205;;;:::o;11740:133::-;-1:-1:-1;;;;;11817:31:1;;11807:42;;11797:2;;11863:1;11860;11853:12;11797:2;11787:86;:::o
Swarm Source
ipfs://86e1b934ef1af4112b4c1bc210c27a1f9b1f5f98b0de94fb465182a1a90bf3c2
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.