More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 27 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Pay Interest | 15566985 | 851 days ago | IN | 0 ETH | 0.00181661 | ||||
Pay Interest | 15566979 | 851 days ago | IN | 0 ETH | 0.00186353 | ||||
Claim Aave And P... | 15528044 | 857 days ago | IN | 0 ETH | 0.00155494 | ||||
Pay Interest | 15434170 | 872 days ago | IN | 0 ETH | 0.0035746 | ||||
Pay Interest | 15434165 | 872 days ago | IN | 0 ETH | 0.0043614 | ||||
Pay Interest | 15360127 | 884 days ago | IN | 0 ETH | 0.0048441 | ||||
Claim Aave And P... | 15255984 | 900 days ago | IN | 0 ETH | 0.00050945 | ||||
Pay Interest | 15255969 | 900 days ago | IN | 0 ETH | 0.00332687 | ||||
Pay Interest | 15255966 | 900 days ago | IN | 0 ETH | 0.00298602 | ||||
Pay Interest | 15094987 | 925 days ago | IN | 0 ETH | 0.00490035 | ||||
Pay Interest | 15094976 | 925 days ago | IN | 0 ETH | 0.00679811 | ||||
Pay Interest | 15017929 | 938 days ago | IN | 0 ETH | 0.00604231 | ||||
Pay Interest | 15017738 | 938 days ago | IN | 0 ETH | 0.00667041 | ||||
Pay Interest | 14915464 | 956 days ago | IN | 0 ETH | 0.02346161 | ||||
Pay Interest | 14915463 | 956 days ago | IN | 0 ETH | 0.02434242 | ||||
Claim Aave And P... | 14871834 | 963 days ago | IN | 0 ETH | 0.01331255 | ||||
Pay Interest | 14871832 | 963 days ago | IN | 0 ETH | 0.00585191 | ||||
Pay Interest | 14871824 | 963 days ago | IN | 0 ETH | 0.00917502 | ||||
Pay Interest | 14755904 | 982 days ago | IN | 0 ETH | 0.05001782 | ||||
Pay Interest | 14755899 | 982 days ago | IN | 0 ETH | 0.05480011 | ||||
Claim Aave And P... | 14659898 | 997 days ago | IN | 0 ETH | 0.01697148 | ||||
Pay Interest | 14659868 | 997 days ago | IN | 0 ETH | 0.01099966 | ||||
Pay Interest | 14659844 | 997 days ago | IN | 0 ETH | 0.01329588 | ||||
Transfer Ownersh... | 13421295 | 1190 days ago | IN | 0 ETH | 0.0025469 | ||||
Enable Interest ... | 13421288 | 1190 days ago | IN | 0 ETH | 0.01728374 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AAVEInterestERC20
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-15 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.7.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); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.7.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; } } // File: contracts/interfaces/IAToken.sol pragma solidity 0.7.5; interface IAToken is IERC20 { // solhint-disable-next-line func-name-mixedcase function UNDERLYING_ASSET_ADDRESS() external returns (address); } // File: contracts/interfaces/IOwnable.sol pragma solidity 0.7.5; interface IOwnable { function owner() external view returns (address); } // File: contracts/interfaces/ILendingPool.sol pragma solidity 0.7.5; interface ILendingPool { function deposit( address asset, uint256 amount, address onBehalfOf, uint16 referralCode ) external; function withdraw( address asset, uint256 amount, address to ) external returns (uint256); function borrow( address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf ) external returns (uint256); function repay( address asset, uint256 amount, uint256 rateMode, address onBehalfOf ) external returns (uint256); // workaround to omit usage of abicoder v2 // see real signature at https://github.com/aave/protocol-v2/blob/master/contracts/protocol/libraries/types/DataTypes.sol function getReserveData(address asset) external returns (address[12] memory); } // File: contracts/interfaces/IStakedTokenIncentivesController.sol pragma solidity 0.7.5; interface IStakedTokenIncentivesController { function claimRewards( address[] calldata assets, uint256 amount, address to ) external; function getRewardsBalance(address[] calldata assets, address user) external view returns (uint256); function configureAssets(address[] calldata assets, uint256[] calldata emissionsPerSecond) external; function setDistributionEnd(uint256 distributionEnd) external; function initialize(address addressesProvider) external; } // File: contracts/interfaces/ILegacyERC20.sol pragma solidity 0.7.5; interface ILegacyERC20 { function approve(address spender, uint256 amount) external; // returns (bool); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.7.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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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); } } } } // File: contracts/upgradeable_contracts/modules/OwnableModule.sol pragma solidity 0.7.5; /** * @title OwnableModule * @dev Common functionality for multi-token extension non-upgradeable module. */ contract OwnableModule { address public owner; /** * @dev Initializes this contract. * @param _owner address of the owner that is allowed to perform additional actions on the particular module. */ constructor(address _owner) { owner = _owner; } /** * @dev Throws if sender is not the owner of this contract. */ modifier onlyOwner { require(msg.sender == owner); _; } /** * @dev Changes the owner of this contract. * @param _newOwner address of the new owner. */ function transferOwnership(address _newOwner) external onlyOwner { owner = _newOwner; } } // File: contracts/upgradeable_contracts/modules/MediatorOwnableModule.sol pragma solidity 0.7.5; /** * @title MediatorOwnableModule * @dev Common functionality for non-upgradeable Omnibridge extension module. */ contract MediatorOwnableModule is OwnableModule { address public mediator; /** * @dev Initializes this contract. * @param _mediator address of the deployed Omnibridge extension for which this module is deployed. * @param _owner address of the owner that is allowed to perform additional actions on the particular module. */ constructor(address _mediator, address _owner) OwnableModule(_owner) { require(Address.isContract(_mediator)); mediator = _mediator; } /** * @dev Throws if sender is not the Omnibridge extension. */ modifier onlyMediator { require(msg.sender == mediator); _; } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.7.0; /** * @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"); } } } // File: contracts/interfaces/IInterestReceiver.sol pragma solidity 0.7.5; interface IInterestReceiver { function onInterestReceived(address _token) external; } // File: contracts/interfaces/IInterestImplementation.sol pragma solidity 0.7.5; interface IInterestImplementation { event InterestEnabled(address indexed token, address xToken); event InterestDustUpdated(address indexed token, uint96 dust); event InterestReceiverUpdated(address indexed token, address receiver); event MinInterestPaidUpdated(address indexed token, uint256 amount); event PaidInterest(address indexed token, address to, uint256 value); event ForceDisable(address indexed token, uint256 tokensAmount, uint256 xTokensAmount, uint256 investedAmount); function isInterestSupported(address _token) external view returns (bool); function invest(address _token, uint256 _amount) external; function withdraw(address _token, uint256 _amount) external; function investedAmount(address _token) external view returns (uint256); } // File: contracts/upgradeable_contracts/modules/interest/BaseInterestERC20.sol pragma solidity 0.7.5; /** * @title BaseInterestERC20 * @dev This contract contains common logic for investing ERC20 tokens into different interest-earning protocols. */ abstract contract BaseInterestERC20 is IInterestImplementation { using SafeERC20 for IERC20; /** * @dev Ensures that caller is an EOA. * Functions with such modifier cannot be called from other contract (as well as from GSN-like approaches) */ modifier onlyEOA { // solhint-disable-next-line avoid-tx-origin require(msg.sender == tx.origin); /* solcov ignore next */ _; } /** * @dev Internal function transferring interest tokens to the interest receiver. * Calls a callback on the receiver, interest receiver is a contract. * @param _receiver address of the tokens receiver. * @param _token address of the token contract to send. * @param _amount amount of tokens to transfer. */ function _transferInterest( address _receiver, address _token, uint256 _amount ) internal { require(_receiver != address(0)); IERC20(_token).safeTransfer(_receiver, _amount); if (Address.isContract(_receiver)) { IInterestReceiver(_receiver).onInterestReceived(_token); } emit PaidInterest(_token, _receiver, _amount); } } // File: contracts/upgradeable_contracts/modules/interest/AAVEInterestERC20.sol pragma solidity 0.7.5; /** * @title AAVEInterestERC20 * @dev This contract contains token-specific logic for investing ERC20 tokens into AAVE protocol. */ contract AAVEInterestERC20 is BaseInterestERC20, MediatorOwnableModule { using SafeMath for uint256; using SafeERC20 for IERC20; using SafeERC20 for IAToken; struct InterestParams { IAToken aToken; uint96 dust; uint256 investedAmount; address interestReceiver; uint256 minInterestPaid; } mapping(address => InterestParams) public interestParams; uint256 public minAavePaid; address public aaveReceiver; constructor( address _omnibridge, address _owner, uint256 _minAavePaid, address _aaveReceiver ) MediatorOwnableModule(_omnibridge, _owner) { minAavePaid = _minAavePaid; aaveReceiver = _aaveReceiver; } /** * @dev Tells the module interface version that this contract supports. * @return major value of the version * @return minor value of the version * @return patch value of the version */ function getModuleInterfacesVersion() external pure returns ( uint64 major, uint64 minor, uint64 patch ) { return (1, 0, 0); } /** * @dev Tells the address of the LendingPool contract in the Ethereum Mainnet. */ function lendingPool() public pure virtual returns (ILendingPool) { return ILendingPool(0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9); } /** * @dev Tells the address of the StakedTokenIncentivesController contract in the Ethereum Mainnet. */ function incentivesController() public pure virtual returns (IStakedTokenIncentivesController) { return IStakedTokenIncentivesController(0xd784927Ff2f95ba542BfC824c8a8a98F3495f6b5); } /** * @dev Tells the address of the StkAAVE token contract in the Ethereum Mainnet. */ function stkAAVEToken() public pure virtual returns (address) { return 0x4da27a545c0c5B758a6BA100e3a049001de870f5; } /** * @dev Enables support for interest earning through a specific aToken. * @param _token address of the token contract for which to enable interest. * @param _dust small amount of underlying tokens that cannot be paid as an interest. Accounts for possible truncation errors. * @param _interestReceiver address of the interest receiver for underlying token. * @param _minInterestPaid min amount of underlying tokens to be paid as an interest. */ function enableInterestToken( address _token, uint96 _dust, address _interestReceiver, uint256 _minInterestPaid ) external onlyOwner { IAToken aToken = IAToken(lendingPool().getReserveData(_token)[7]); require(aToken.UNDERLYING_ASSET_ADDRESS() == _token); // disallow reinitialization of tokens that were already initialized and invested require(interestParams[_token].investedAmount == 0); interestParams[_token] = InterestParams(aToken, _dust, 0, _interestReceiver, _minInterestPaid); // SafeERC20.safeApprove does not work here in case of possible interest reinitialization, // since it does not allow positive->positive allowance change. However, it would be safe to make such change here. ILegacyERC20(_token).approve(address(lendingPool()), uint256(-1)); emit InterestEnabled(_token, address(aToken)); emit InterestDustUpdated(_token, _dust); emit InterestReceiverUpdated(_token, _interestReceiver); emit MinInterestPaidUpdated(_token, _minInterestPaid); } /** * @dev Tells the current amount of underlying tokens that was invested into the AAVE protocol. * @param _token address of the underlying token. * @return currently invested value. */ function investedAmount(address _token) external view override returns (uint256) { return interestParams[_token].investedAmount; } /** * @dev Tells if interest earning is supported for the specific underlying token contract. * @param _token address of the token contract. * @return true, if interest earning is supported for the given token. */ function isInterestSupported(address _token) external view override returns (bool) { return address(interestParams[_token].aToken) != address(0); } /** * @dev Invests the given amount of tokens to the AAVE protocol. * Only Omnibridge contract is allowed to call this method. * Converts _amount of TOKENs into aTOKENs. * @param _token address of the invested token contract. * @param _amount amount of tokens to invest. */ function invest(address _token, uint256 _amount) external override onlyMediator { InterestParams storage params = interestParams[_token]; params.investedAmount = params.investedAmount.add(_amount); lendingPool().deposit(_token, _amount, address(this), 0); } /** * @dev Withdraws at least min(_amount, investedAmount) of tokens from the AAVE protocol. * Only Omnibridge contract is allowed to call this method. * Converts aTOKENs into _amount of TOKENs. * @param _token address of the invested token contract. * @param _amount minimal amount of tokens to withdraw. */ function withdraw(address _token, uint256 _amount) external override onlyMediator { InterestParams storage params = interestParams[_token]; uint256 invested = params.investedAmount; uint256 redeemed = _safeWithdraw(_token, _amount > invested ? invested : _amount); params.investedAmount = redeemed > invested ? 0 : invested - redeemed; IERC20(_token).safeTransfer(mediator, redeemed); } /** * @dev Tells the current accumulated interest on the invested tokens, that can be withdrawn and payed to the interest receiver. * @param _token address of the invested token contract. * @return amount of accumulated interest. */ function interestAmount(address _token) public view returns (uint256) { InterestParams storage params = interestParams[_token]; (IAToken aToken, uint96 dust) = (params.aToken, params.dust); uint256 balance = aToken.balanceOf(address(this)); // small portion of tokens are reserved for possible truncation/round errors uint256 reserved = params.investedAmount.add(dust); return balance > reserved ? balance - reserved : 0; } /** * @dev Pays collected interest for the underlying token. * Anyone can call this function. * Earned interest is withdrawn and transferred to the specified interest receiver account. * @param _token address of the invested token contract in which interest should be paid. */ function payInterest(address _token) external onlyEOA { InterestParams storage params = interestParams[_token]; uint256 interest = interestAmount(_token); require(interest >= params.minInterestPaid); _transferInterest(params.interestReceiver, address(_token), _safeWithdraw(_token, interest)); } /** * @dev Tells the amount of earned stkAAVE tokens for supplying assets into the protocol that can be withdrawn. * Intended to be called via eth_call to obtain the current accumulated value for stkAAVE. * @param _assets aTokens addresses to claim stkAAVE for. * @return amount of accumulated stkAAVE tokens across given markets. */ function aaveAmount(address[] calldata _assets) public view returns (uint256) { return incentivesController().getRewardsBalance(_assets, address(this)); } /** * @dev Claims stkAAVE token received by supplying underlying tokens and transfers it to the associated AAVE receiver. * @param _assets aTokens addresses to claim stkAAVE for. */ function claimAaveAndPay(address[] calldata _assets) external onlyEOA { uint256 balance = aaveAmount(_assets); require(balance >= minAavePaid); incentivesController().claimRewards(_assets, balance, address(this)); _transferInterest(aaveReceiver, stkAAVEToken(), balance); } /** * @dev Last-resort function for returning assets to the Omnibridge contract in case of some failures in the logic. * Disables this contract and transfers locked tokens back to the mediator. * Only owner is allowed to call this method. * @param _token address of the invested token contract that should be disabled. */ function forceDisable(address _token) external onlyOwner { InterestParams storage params = interestParams[_token]; IAToken aToken = params.aToken; uint256 aTokenBalance = 0; // try to redeem all aTokens // it is safe to specify uint256(-1) as max amount of redeemed tokens // since the withdraw method of the pool contract will return the entire balance try lendingPool().withdraw(_token, uint256(-1), mediator) {} catch { aTokenBalance = aToken.balanceOf(address(this)); aToken.safeTransfer(mediator, aTokenBalance); } uint256 balance = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(mediator, balance); IERC20(_token).safeApprove(address(lendingPool()), 0); emit ForceDisable(_token, balance, aTokenBalance, params.investedAmount); delete interestParams[_token]; } /** * @dev Updates dust parameter for the particular token. * Only owner is allowed to call this method. * @param _token address of the invested token contract. * @param _dust new amount of underlying tokens that cannot be paid as an interest. Accounts for possible truncation errors. */ function setDust(address _token, uint96 _dust) external onlyOwner { interestParams[_token].dust = _dust; emit InterestDustUpdated(_token, _dust); } /** * @dev Updates address of the interest receiver. Can be any address, EOA or contract. * Set to 0x00..00 to disable interest transfers. * Only owner is allowed to call this method. * @param _token address of the invested token contract. * @param _receiver address of the interest receiver. */ function setInterestReceiver(address _token, address _receiver) external onlyOwner { interestParams[_token].interestReceiver = _receiver; emit InterestReceiverUpdated(_token, _receiver); } /** * @dev Updates min interest amount that can be transferred in single call. * Only owner is allowed to call this method. * @param _token address of the invested token contract. * @param _minInterestPaid new amount of TOKENS and can be transferred to the interest receiver in single operation. */ function setMinInterestPaid(address _token, uint256 _minInterestPaid) external onlyOwner { interestParams[_token].minInterestPaid = _minInterestPaid; emit MinInterestPaidUpdated(_token, _minInterestPaid); } /** * @dev Updates min stkAAVE amount that can be transferred in single call. * Only owner is allowed to call this method. * @param _minAavePaid new amount of stkAAVE and can be transferred to the interest receiver in single operation. */ function setMinAavePaid(uint256 _minAavePaid) external onlyOwner { minAavePaid = _minAavePaid; emit MinInterestPaidUpdated(address(stkAAVEToken()), _minAavePaid); } /** * @dev Updates address of the accumulated stkAAVE receiver. Can be any address, EOA or contract. * Set to 0x00..00 to disable stkAAVE claims and transfers. * Only owner is allowed to call this method. * @param _receiver address of the interest receiver. */ function setAaveReceiver(address _receiver) external onlyOwner { aaveReceiver = _receiver; emit InterestReceiverUpdated(address(stkAAVEToken()), _receiver); } /** * @dev Internal function for securely withdrawing assets from the underlying protocol. * @param _token address of the invested token contract. * @param _amount minimal amount of underlying tokens to withdraw from AAVE. * @return amount of redeemed tokens, at least as much as was requested. */ function _safeWithdraw(address _token, uint256 _amount) private returns (uint256) { uint256 balance = IERC20(_token).balanceOf(address(this)); lendingPool().withdraw(_token, _amount, address(this)); uint256 redeemed = IERC20(_token).balanceOf(address(this)) - balance; require(redeemed >= _amount); return redeemed; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_omnibridge","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_minAavePaid","type":"uint256"},{"internalType":"address","name":"_aaveReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"xTokensAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"investedAmount","type":"uint256"}],"name":"ForceDisable","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint96","name":"dust","type":"uint96"}],"name":"InterestDustUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"xToken","type":"address"}],"name":"InterestEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"InterestReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinInterestPaidUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"PaidInterest","type":"event"},{"inputs":[{"internalType":"address[]","name":"_assets","type":"address[]"}],"name":"aaveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aaveReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assets","type":"address[]"}],"name":"claimAaveAndPay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint96","name":"_dust","type":"uint96"},{"internalType":"address","name":"_interestReceiver","type":"address"},{"internalType":"uint256","name":"_minInterestPaid","type":"uint256"}],"name":"enableInterestToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"forceDisable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getModuleInterfacesVersion","outputs":[{"internalType":"uint64","name":"major","type":"uint64"},{"internalType":"uint64","name":"minor","type":"uint64"},{"internalType":"uint64","name":"patch","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"incentivesController","outputs":[{"internalType":"contract IStakedTokenIncentivesController","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"interestAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"interestParams","outputs":[{"internalType":"contract IAToken","name":"aToken","type":"address"},{"internalType":"uint96","name":"dust","type":"uint96"},{"internalType":"uint256","name":"investedAmount","type":"uint256"},{"internalType":"address","name":"interestReceiver","type":"address"},{"internalType":"uint256","name":"minInterestPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"invest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"investedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"isInterestSupported","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lendingPool","outputs":[{"internalType":"contract ILendingPool","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"mediator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAavePaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"payInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"setAaveReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint96","name":"_dust","type":"uint96"}],"name":"setDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"setInterestReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAavePaid","type":"uint256"}],"name":"setMinAavePaid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_minInterestPaid","type":"uint256"}],"name":"setMinInterestPaid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stkAAVEToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5060405162001c5738038062001c578339818101604052608081101561003557600080fd5b5080516020808301516040840151606090940151600080546001600160a01b0319166001600160a01b038416179055929390929091849084906100819083906100c4811b6113c117901c565b61008a57600080fd5b50600180546001600160a01b03199081166001600160a01b0393841617909155600393909355600480549093169116179055506101009050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906100f857508115155b949350505050565b611b4780620001106000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063a59a9973116100de578063d007c64411610097578063eb361f2b11610071578063eb361f2b1461054b578063eb922f9714610553578063f2fde38b14610570578063f3fef3a31461059657610173565b8063d007c644146104ca578063e67afd9e146104f0578063e6c7c4b51461051657610173565b8063a59a997314610408578063af1df25514610410578063b9b8c24614610418578063bdd378a014610444578063c779c1c31461047e578063cff77444146104a457610173565b806381e1351f1161013057806381e1351f146102dc5780638da5cb5b14610310578063904377ec1461031857806395d1dab4146103465780639c5ab35f1461036c578063a36b85fd146103dc57610173565b806316b813d01461017857806330233bd5146101bd578063390848c2146101d75780633b466382146102405780635e215e43146102b05780636d0501f6146102d4575b600080fd5b6101bb6004803603608081101561018e57600080fd5b506001600160a01b0381358116916001600160601b036020820135169160408201351690606001356105c2565b005b6101c5610936565b60408051918252519081900360200190f35b6101fd600480360360208110156101ed57600080fd5b50356001600160a01b031661093c565b604080516001600160a01b0396871681526001600160601b0390951660208601528481019390935293166060830152608082019290925290519081900360a00190f35b6101c56004803603602081101561025657600080fd5b81019060208101813564010000000081111561027157600080fd5b82018360208201111561028357600080fd5b803590602001918460208302840111640100000000831117156102a557600080fd5b509092509050610981565b6102b8610a41565b604080516001600160a01b039092168252519081900360200190f35b6102b8610a59565b6102e4610a68565b6040805167ffffffffffffffff9485168152928416602084015292168183015290519081900360600190f35b6102b8610a71565b6101bb6004803603604081101561032e57600080fd5b506001600160a01b0381358116916020013516610a80565b6101bb6004803603602081101561035c57600080fd5b50356001600160a01b0316610b03565b6101bb6004803603602081101561038257600080fd5b81019060208101813564010000000081111561039d57600080fd5b8201836020820111156103af57600080fd5b803590602001918460208302840111640100000000831117156103d157600080fd5b509092509050610da4565b6101bb600480360360408110156103f257600080fd5b506001600160a01b038135169060200135610e9e565b6102b8610f0c565b6102b8610f24565b6101bb6004803603604081101561042e57600080fd5b506001600160a01b038135169060200135610f3c565b61046a6004803603602081101561045a57600080fd5b50356001600160a01b0316611001565b604080519115158252519081900360200190f35b6101c56004803603602081101561049457600080fd5b50356001600160a01b0316611021565b6101c5600480360360208110156104ba57600080fd5b50356001600160a01b03166110fb565b6101bb600480360360208110156104e057600080fd5b50356001600160a01b0316611119565b6101bb6004803603602081101561050657600080fd5b50356001600160a01b031661117c565b6101bb6004803603604081101561052c57600080fd5b5080356001600160a01b031690602001356001600160601b0316611202565b6102b8611288565b6101bb6004803603602081101561056957600080fd5b5035611297565b6101bb6004803603602081101561058657600080fd5b50356001600160a01b03166112fe565b6101bb600480360360408110156105ac57600080fd5b506001600160a01b038135169060200135611337565b6000546001600160a01b031633146105d957600080fd5b60006105e3610f0c565b6001600160a01b03166335ea6a75866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505061018060405180830381600087803b15801561063257600080fd5b505af1158015610646573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061018081101561066c57600080fd5b50600760200201519050846001600160a01b0316816001600160a01b031663b16a19de6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106bb57600080fd5b505af11580156106cf573d6000803e3d6000fd5b505050506040513d60208110156106e557600080fd5b50516001600160a01b0316146106fa57600080fd5b6001600160a01b0385166000908152600260205260409020600101541561072057600080fd5b6040805160a0810182526001600160a01b0380841682526001600160601b03808816602080850191825260008587018181528a861660608801908152608088018b81528e881680855260029586905299909320975188549551909616600160a01b029587166001600160a01b031995861617871695909517875551600187015592519085018054919094169116179091555160039091015563095ea7b36107c5610f0c565b6000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b5050604080516001600160a01b038581168252915191891693507f57a12de1fbd341dc640a243e65612d60f54ad87e845a70f9ca6b223cc58637db925081900360200190a2604080516001600160601b038616815290516001600160a01b038716917fe84f916544fb36a0dde4d8409f865de6485ec99d6972a5fb236bdcef3b5a6ac2919081900360200190a2604080516001600160a01b0385811682529151918716917f1cd91b1e3cbc0fe94a4727469d25aae6a3b76d57c18a2b34380ad8e64591dbf09181900360200190a26040805183815290516001600160a01b038716917f5351591afa7b9fc1f148ab4d296d2eb44053c69c032f38fb8622b28054b6be9e919081900360200190a25050505050565b60035481565b600260208190526000918252604090912080546001820154928201546003909201546001600160a01b0380831694600160a01b9093046001600160601b031693169085565b600061098b610f24565b6001600160a01b0316638b599f268484306040518463ffffffff1660e01b81526004018080602001836001600160a01b031681526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610a0e57600080fd5b505afa158015610a22573d6000803e3d6000fd5b505050506040513d6020811015610a3857600080fd5b50519392505050565b734da27a545c0c5b758a6ba100e3a049001de870f590565b6001546001600160a01b031681565b60016000809192565b6000546001600160a01b031681565b6000546001600160a01b03163314610a9757600080fd5b6001600160a01b0382811660008181526002602081815260409283902090910180546001600160a01b03191694861694851790558151938452905191927f1cd91b1e3cbc0fe94a4727469d25aae6a3b76d57c18a2b34380ad8e64591dbf0929081900390910190a25050565b6000546001600160a01b03163314610b1a57600080fd5b6001600160a01b038082166000908152600260205260408120805490921690610b41610f0c565b60015460408051631a4ca37b60e21b81526001600160a01b03888116600483015260001960248301529283166044820152905192909116916369328dec916064808201926020929091908290030181600087803b158015610ba157600080fd5b505af1925050508015610bc657506040513d6020811015610bc157600080fd5b505160015b610c5e57604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610c1057600080fd5b505afa158015610c24573d6000803e3d6000fd5b505050506040513d6020811015610c3a57600080fd5b5051600154909150610c59906001600160a01b038481169116836113fd565b610c60565b505b6000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610caf57600080fd5b505afa158015610cc3573d6000803e3d6000fd5b505050506040513d6020811015610cd957600080fd5b5051600154909150610cf8906001600160a01b038781169116836113fd565b610d15610d03610f0c565b6001600160a01b03871690600061144f565b6001840154604080518381526020810185905280820192909252516001600160a01b038716917f5c7774bb42e44555047b11d64dfcd0c9e0882d656f3a9496954768ab0e1b0668919081900360600190a2505050506001600160a01b0316600090815260026020819052604082208281556001810183905590810180546001600160a01b031916905560030155565b333214610db057600080fd5b6000610dbc8383610981565b9050600354811015610dcd57600080fd5b610dd5610f24565b6001600160a01b0316633111e7b3848484306040518563ffffffff1660e01b81526004018080602001848152602001836001600160a01b031681526020018281038252868682818152602001925060200280828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015610e6257600080fd5b505af1158015610e76573d6000803e3d6000fd5b5050600454610e9992506001600160a01b03169050610e93610a41565b83611562565b505050565b6000546001600160a01b03163314610eb557600080fd5b6001600160a01b038216600081815260026020908152604091829020600301849055815184815291517f5351591afa7b9fc1f148ab4d296d2eb44053c69c032f38fb8622b28054b6be9e9281900390910190a25050565b737d2768de32b0b80b7a3454c06bdac94a69ddc7a990565b73d784927ff2f95ba542bfc824c8a8a98f3495f6b590565b6001546001600160a01b03163314610f5357600080fd5b6001600160a01b03821660009081526002602052604090206001810154610f7a908361164a565b6001820155610f87610f0c565b6040805163e8eda9df60e01b81526001600160a01b03868116600483015260248201869052306044830152600060648301819052925193169263e8eda9df9260848084019391929182900301818387803b158015610fe457600080fd5b505af1158015610ff8573d6000803e3d6000fd5b50505050505050565b6001600160a01b0390811660009081526002602052604090205416151590565b6001600160a01b038181166000908152600260209081526040808320805482516370a0823160e01b815230600482015292519495919491811693600160a01b9091046001600160601b031692869285926370a082319260248082019391829003018186803b15801561109257600080fd5b505afa1580156110a6573d6000803e3d6000fd5b505050506040513d60208110156110bc57600080fd5b505160018501549091506000906110dc906001600160601b03851661164a565b90508082116110ec5760006110f0565b8082035b979650505050505050565b6001600160a01b031660009081526002602052604090206001015490565b33321461112557600080fd5b6001600160a01b03811660009081526002602052604081209061114783611021565b9050816003015481101561115a57600080fd5b6002820154610e99906001600160a01b03168461117781856116ab565b611562565b6000546001600160a01b0316331461119357600080fd5b600480546001600160a01b0319166001600160a01b0383161790556111b6610a41565b6001600160a01b03167f1cd91b1e3cbc0fe94a4727469d25aae6a3b76d57c18a2b34380ad8e64591dbf08260405180826001600160a01b0316815260200191505060405180910390a250565b6000546001600160a01b0316331461121957600080fd5b6001600160a01b0380831660008181526002602090815260409182902080546001600160601b038716600160a01b8102919096161790558151938452905191927fe84f916544fb36a0dde4d8409f865de6485ec99d6972a5fb236bdcef3b5a6ac2929081900390910190a25050565b6004546001600160a01b031681565b6000546001600160a01b031633146112ae57600080fd5b60038190556112bb610a41565b6001600160a01b03167f5351591afa7b9fc1f148ab4d296d2eb44053c69c032f38fb8622b28054b6be9e826040518082815260200191505060405180910390a250565b6000546001600160a01b0316331461131557600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461134e57600080fd5b6001600160a01b0382166000908152600260205260408120600181015490916113858583861161137e5785611380565b835b6116ab565b905081811161139657808203611399565b60005b600180850191909155546113ba906001600160a01b038781169116836113fd565b5050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906113f557508115155b949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e9990849061184b565b8015806114d5575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156114a757600080fd5b505afa1580156114bb573d6000803e3d6000fd5b505050506040513d60208110156114d157600080fd5b5051155b6115105760405162461bcd60e51b8152600401808060200182810382526036815260200180611adc6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610e9990849061184b565b6001600160a01b03831661157557600080fd5b6115896001600160a01b03831684836113fd565b611592836113c1565b156115ff57826001600160a01b03166381e3f276836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156115e657600080fd5b505af11580156115fa573d6000803e3d6000fd5b505050505b604080516001600160a01b038581168252602082018490528251908516927f222348fe8b30f078a8a4da2f55f16d24d70bc40d3ec49d295d7ad1d11e666887928290030190a2505050565b6000828201838110156116a4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156116fb57600080fd5b505afa15801561170f573d6000803e3d6000fd5b505050506040513d602081101561172557600080fd5b50519050611731610f0c565b6001600160a01b03166369328dec8585306040518463ffffffff1660e01b815260040180846001600160a01b03168152602001838152602001826001600160a01b031681526020019350505050602060405180830381600087803b15801561179857600080fd5b505af11580156117ac573d6000803e3d6000fd5b505050506040513d60208110156117c257600080fd5b5050604080516370a0823160e01b8152306004820152905160009183916001600160a01b038816916370a08231916024808301926020929190829003018186803b15801561180f57600080fd5b505afa158015611823573d6000803e3d6000fd5b505050506040513d602081101561183957600080fd5b5051039050838110156113f557600080fd5b60606118a0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118fc9092919063ffffffff16565b805190915015610e99578080602001905160208110156118bf57600080fd5b5051610e995760405162461bcd60e51b815260040180806020018281038252602a815260200180611ab2602a913960400191505060405180910390fd5b60606113f584846000856060611911856113c1565b611962576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119a15780518252601f199092019160209182019101611982565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a03576040519150601f19603f3d011682016040523d82523d6000602084013e611a08565b606091505b50915091508115611a1c5791506113f59050565b805115611a2c5780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a76578181015183820152602001611a5e565b50505050905090810190601f168015611aa35780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220eadb55bd06c5027cc4342ab4da4a21f5262397023b655b1310eb39b17e6f763e64736f6c6343000705003300000000000000000000000088ad09518695c6c3712ac10a214be5109a655671000000000000000000000000bf3d6f830ce263cae987193982192cd990442b530000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000b6559da32afc07dccb42c2a3819fb73f72e39267
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c8063a59a9973116100de578063d007c64411610097578063eb361f2b11610071578063eb361f2b1461054b578063eb922f9714610553578063f2fde38b14610570578063f3fef3a31461059657610173565b8063d007c644146104ca578063e67afd9e146104f0578063e6c7c4b51461051657610173565b8063a59a997314610408578063af1df25514610410578063b9b8c24614610418578063bdd378a014610444578063c779c1c31461047e578063cff77444146104a457610173565b806381e1351f1161013057806381e1351f146102dc5780638da5cb5b14610310578063904377ec1461031857806395d1dab4146103465780639c5ab35f1461036c578063a36b85fd146103dc57610173565b806316b813d01461017857806330233bd5146101bd578063390848c2146101d75780633b466382146102405780635e215e43146102b05780636d0501f6146102d4575b600080fd5b6101bb6004803603608081101561018e57600080fd5b506001600160a01b0381358116916001600160601b036020820135169160408201351690606001356105c2565b005b6101c5610936565b60408051918252519081900360200190f35b6101fd600480360360208110156101ed57600080fd5b50356001600160a01b031661093c565b604080516001600160a01b0396871681526001600160601b0390951660208601528481019390935293166060830152608082019290925290519081900360a00190f35b6101c56004803603602081101561025657600080fd5b81019060208101813564010000000081111561027157600080fd5b82018360208201111561028357600080fd5b803590602001918460208302840111640100000000831117156102a557600080fd5b509092509050610981565b6102b8610a41565b604080516001600160a01b039092168252519081900360200190f35b6102b8610a59565b6102e4610a68565b6040805167ffffffffffffffff9485168152928416602084015292168183015290519081900360600190f35b6102b8610a71565b6101bb6004803603604081101561032e57600080fd5b506001600160a01b0381358116916020013516610a80565b6101bb6004803603602081101561035c57600080fd5b50356001600160a01b0316610b03565b6101bb6004803603602081101561038257600080fd5b81019060208101813564010000000081111561039d57600080fd5b8201836020820111156103af57600080fd5b803590602001918460208302840111640100000000831117156103d157600080fd5b509092509050610da4565b6101bb600480360360408110156103f257600080fd5b506001600160a01b038135169060200135610e9e565b6102b8610f0c565b6102b8610f24565b6101bb6004803603604081101561042e57600080fd5b506001600160a01b038135169060200135610f3c565b61046a6004803603602081101561045a57600080fd5b50356001600160a01b0316611001565b604080519115158252519081900360200190f35b6101c56004803603602081101561049457600080fd5b50356001600160a01b0316611021565b6101c5600480360360208110156104ba57600080fd5b50356001600160a01b03166110fb565b6101bb600480360360208110156104e057600080fd5b50356001600160a01b0316611119565b6101bb6004803603602081101561050657600080fd5b50356001600160a01b031661117c565b6101bb6004803603604081101561052c57600080fd5b5080356001600160a01b031690602001356001600160601b0316611202565b6102b8611288565b6101bb6004803603602081101561056957600080fd5b5035611297565b6101bb6004803603602081101561058657600080fd5b50356001600160a01b03166112fe565b6101bb600480360360408110156105ac57600080fd5b506001600160a01b038135169060200135611337565b6000546001600160a01b031633146105d957600080fd5b60006105e3610f0c565b6001600160a01b03166335ea6a75866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505061018060405180830381600087803b15801561063257600080fd5b505af1158015610646573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061018081101561066c57600080fd5b50600760200201519050846001600160a01b0316816001600160a01b031663b16a19de6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106bb57600080fd5b505af11580156106cf573d6000803e3d6000fd5b505050506040513d60208110156106e557600080fd5b50516001600160a01b0316146106fa57600080fd5b6001600160a01b0385166000908152600260205260409020600101541561072057600080fd5b6040805160a0810182526001600160a01b0380841682526001600160601b03808816602080850191825260008587018181528a861660608801908152608088018b81528e881680855260029586905299909320975188549551909616600160a01b029587166001600160a01b031995861617871695909517875551600187015592519085018054919094169116179091555160039091015563095ea7b36107c5610f0c565b6000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561080e57600080fd5b505af1158015610822573d6000803e3d6000fd5b5050604080516001600160a01b038581168252915191891693507f57a12de1fbd341dc640a243e65612d60f54ad87e845a70f9ca6b223cc58637db925081900360200190a2604080516001600160601b038616815290516001600160a01b038716917fe84f916544fb36a0dde4d8409f865de6485ec99d6972a5fb236bdcef3b5a6ac2919081900360200190a2604080516001600160a01b0385811682529151918716917f1cd91b1e3cbc0fe94a4727469d25aae6a3b76d57c18a2b34380ad8e64591dbf09181900360200190a26040805183815290516001600160a01b038716917f5351591afa7b9fc1f148ab4d296d2eb44053c69c032f38fb8622b28054b6be9e919081900360200190a25050505050565b60035481565b600260208190526000918252604090912080546001820154928201546003909201546001600160a01b0380831694600160a01b9093046001600160601b031693169085565b600061098b610f24565b6001600160a01b0316638b599f268484306040518463ffffffff1660e01b81526004018080602001836001600160a01b031681526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201965060209550909350505081840390508186803b158015610a0e57600080fd5b505afa158015610a22573d6000803e3d6000fd5b505050506040513d6020811015610a3857600080fd5b50519392505050565b734da27a545c0c5b758a6ba100e3a049001de870f590565b6001546001600160a01b031681565b60016000809192565b6000546001600160a01b031681565b6000546001600160a01b03163314610a9757600080fd5b6001600160a01b0382811660008181526002602081815260409283902090910180546001600160a01b03191694861694851790558151938452905191927f1cd91b1e3cbc0fe94a4727469d25aae6a3b76d57c18a2b34380ad8e64591dbf0929081900390910190a25050565b6000546001600160a01b03163314610b1a57600080fd5b6001600160a01b038082166000908152600260205260408120805490921690610b41610f0c565b60015460408051631a4ca37b60e21b81526001600160a01b03888116600483015260001960248301529283166044820152905192909116916369328dec916064808201926020929091908290030181600087803b158015610ba157600080fd5b505af1925050508015610bc657506040513d6020811015610bc157600080fd5b505160015b610c5e57604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610c1057600080fd5b505afa158015610c24573d6000803e3d6000fd5b505050506040513d6020811015610c3a57600080fd5b5051600154909150610c59906001600160a01b038481169116836113fd565b610c60565b505b6000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610caf57600080fd5b505afa158015610cc3573d6000803e3d6000fd5b505050506040513d6020811015610cd957600080fd5b5051600154909150610cf8906001600160a01b038781169116836113fd565b610d15610d03610f0c565b6001600160a01b03871690600061144f565b6001840154604080518381526020810185905280820192909252516001600160a01b038716917f5c7774bb42e44555047b11d64dfcd0c9e0882d656f3a9496954768ab0e1b0668919081900360600190a2505050506001600160a01b0316600090815260026020819052604082208281556001810183905590810180546001600160a01b031916905560030155565b333214610db057600080fd5b6000610dbc8383610981565b9050600354811015610dcd57600080fd5b610dd5610f24565b6001600160a01b0316633111e7b3848484306040518563ffffffff1660e01b81526004018080602001848152602001836001600160a01b031681526020018281038252868682818152602001925060200280828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015610e6257600080fd5b505af1158015610e76573d6000803e3d6000fd5b5050600454610e9992506001600160a01b03169050610e93610a41565b83611562565b505050565b6000546001600160a01b03163314610eb557600080fd5b6001600160a01b038216600081815260026020908152604091829020600301849055815184815291517f5351591afa7b9fc1f148ab4d296d2eb44053c69c032f38fb8622b28054b6be9e9281900390910190a25050565b737d2768de32b0b80b7a3454c06bdac94a69ddc7a990565b73d784927ff2f95ba542bfc824c8a8a98f3495f6b590565b6001546001600160a01b03163314610f5357600080fd5b6001600160a01b03821660009081526002602052604090206001810154610f7a908361164a565b6001820155610f87610f0c565b6040805163e8eda9df60e01b81526001600160a01b03868116600483015260248201869052306044830152600060648301819052925193169263e8eda9df9260848084019391929182900301818387803b158015610fe457600080fd5b505af1158015610ff8573d6000803e3d6000fd5b50505050505050565b6001600160a01b0390811660009081526002602052604090205416151590565b6001600160a01b038181166000908152600260209081526040808320805482516370a0823160e01b815230600482015292519495919491811693600160a01b9091046001600160601b031692869285926370a082319260248082019391829003018186803b15801561109257600080fd5b505afa1580156110a6573d6000803e3d6000fd5b505050506040513d60208110156110bc57600080fd5b505160018501549091506000906110dc906001600160601b03851661164a565b90508082116110ec5760006110f0565b8082035b979650505050505050565b6001600160a01b031660009081526002602052604090206001015490565b33321461112557600080fd5b6001600160a01b03811660009081526002602052604081209061114783611021565b9050816003015481101561115a57600080fd5b6002820154610e99906001600160a01b03168461117781856116ab565b611562565b6000546001600160a01b0316331461119357600080fd5b600480546001600160a01b0319166001600160a01b0383161790556111b6610a41565b6001600160a01b03167f1cd91b1e3cbc0fe94a4727469d25aae6a3b76d57c18a2b34380ad8e64591dbf08260405180826001600160a01b0316815260200191505060405180910390a250565b6000546001600160a01b0316331461121957600080fd5b6001600160a01b0380831660008181526002602090815260409182902080546001600160601b038716600160a01b8102919096161790558151938452905191927fe84f916544fb36a0dde4d8409f865de6485ec99d6972a5fb236bdcef3b5a6ac2929081900390910190a25050565b6004546001600160a01b031681565b6000546001600160a01b031633146112ae57600080fd5b60038190556112bb610a41565b6001600160a01b03167f5351591afa7b9fc1f148ab4d296d2eb44053c69c032f38fb8622b28054b6be9e826040518082815260200191505060405180910390a250565b6000546001600160a01b0316331461131557600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461134e57600080fd5b6001600160a01b0382166000908152600260205260408120600181015490916113858583861161137e5785611380565b835b6116ab565b905081811161139657808203611399565b60005b600180850191909155546113ba906001600160a01b038781169116836113fd565b5050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906113f557508115155b949350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e9990849061184b565b8015806114d5575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156114a757600080fd5b505afa1580156114bb573d6000803e3d6000fd5b505050506040513d60208110156114d157600080fd5b5051155b6115105760405162461bcd60e51b8152600401808060200182810382526036815260200180611adc6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610e9990849061184b565b6001600160a01b03831661157557600080fd5b6115896001600160a01b03831684836113fd565b611592836113c1565b156115ff57826001600160a01b03166381e3f276836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156115e657600080fd5b505af11580156115fa573d6000803e3d6000fd5b505050505b604080516001600160a01b038581168252602082018490528251908516927f222348fe8b30f078a8a4da2f55f16d24d70bc40d3ec49d295d7ad1d11e666887928290030190a2505050565b6000828201838110156116a4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156116fb57600080fd5b505afa15801561170f573d6000803e3d6000fd5b505050506040513d602081101561172557600080fd5b50519050611731610f0c565b6001600160a01b03166369328dec8585306040518463ffffffff1660e01b815260040180846001600160a01b03168152602001838152602001826001600160a01b031681526020019350505050602060405180830381600087803b15801561179857600080fd5b505af11580156117ac573d6000803e3d6000fd5b505050506040513d60208110156117c257600080fd5b5050604080516370a0823160e01b8152306004820152905160009183916001600160a01b038816916370a08231916024808301926020929190829003018186803b15801561180f57600080fd5b505afa158015611823573d6000803e3d6000fd5b505050506040513d602081101561183957600080fd5b5051039050838110156113f557600080fd5b60606118a0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118fc9092919063ffffffff16565b805190915015610e99578080602001905160208110156118bf57600080fd5b5051610e995760405162461bcd60e51b815260040180806020018281038252602a815260200180611ab2602a913960400191505060405180910390fd5b60606113f584846000856060611911856113c1565b611962576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119a15780518252601f199092019160209182019101611982565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a03576040519150601f19603f3d011682016040523d82523d6000602084013e611a08565b606091505b50915091508115611a1c5791506113f59050565b805115611a2c5780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a76578181015183820152602001611a5e565b50505050905090810190601f168015611aa35780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220eadb55bd06c5027cc4342ab4da4a21f5262397023b655b1310eb39b17e6f763e64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000088ad09518695c6c3712ac10a214be5109a655671000000000000000000000000bf3d6f830ce263cae987193982192cd990442b530000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000b6559da32afc07dccb42c2a3819fb73f72e39267
-----Decoded View---------------
Arg [0] : _omnibridge (address): 0x88ad09518695c6c3712AC10a214bE5109a655671
Arg [1] : _owner (address): 0xBF3d6f830CE263CAE987193982192Cd990442B53
Arg [2] : _minAavePaid (uint256): 1000000000000000000
Arg [3] : _aaveReceiver (address): 0xb6559dA32aFC07dcCb42C2a3819fB73F72e39267
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000088ad09518695c6c3712ac10a214be5109a655671
Arg [1] : 000000000000000000000000bf3d6f830ce263cae987193982192cd990442b53
Arg [2] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [3] : 000000000000000000000000b6559da32afc07dccb42c2a3819fb73f72e39267
Deployed Bytecode Sourcemap
25057:12936:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27595:1124;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27595:1124:0;;;;;-1:-1:-1;;;;;27595:1124:0;;;;;;;;;;;;;;;;:::i;:::-;;25487:26;;;:::i;:::-;;;;;;;;;;;;;;;;25424:56;;;;;;;;;;;;;;;;-1:-1:-1;25424:56:0;-1:-1:-1;;;;;25424:56:0;;:::i;:::-;;;;-1:-1:-1;;;;;25424:56:0;;;;;-1:-1:-1;;;;;25424:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32690:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32690:168:0;;-1:-1:-1;32690:168:0;-1:-1:-1;32690:168:0;:::i;26969:130::-;;;:::i;:::-;;;;-1:-1:-1;;;;;26969:130:0;;;;;;;;;;;;;;17829:23;;;:::i;26052:220::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16878:20;;;:::i;35544:211::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35544:211:0;;;;;;;;;;:::i;33754:944::-;;;;;;;;;;;;;;;;-1:-1:-1;33754:944:0;-1:-1:-1;;;;;33754:944:0;;:::i;33071:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33071:318:0;;-1:-1:-1;33071:318:0;-1:-1:-1;33071:318:0;:::i;36097:229::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36097:229:0;;;;;;;;:::i;26382:148::-;;;:::i;26660:197::-;;;:::i;29822:289::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29822:289:0;;;;;;;;:::i;29338:161::-;;;;;;;;;;;;;;;;-1:-1:-1;29338:161:0;-1:-1:-1;;;;;29338:161:0;;:::i;:::-;;;;;;;;;;;;;;;;;;31175:482;;;;;;;;;;;;;;;;-1:-1:-1;31175:482:0;-1:-1:-1;;;;;31175:482:0;;:::i;28943:144::-;;;;;;;;;;;;;;;;-1:-1:-1;28943:144:0;-1:-1:-1;;;;;28943:144:0;;:::i;31977:336::-;;;;;;;;;;;;;;;;-1:-1:-1;31977:336:0;-1:-1:-1;;;;;31977:336:0;;:::i;37093:181::-;;;;;;;;;;;;;;;;-1:-1:-1;37093:181:0;-1:-1:-1;;;;;37093:181:0;;:::i;35029:170::-;;;;;;;;;;;;;;;;-1:-1:-1;35029:170:0;;-1:-1:-1;;;;;35029:170:0;;;;;-1:-1:-1;;;;;35029:170:0;;:::i;25520:27::-;;;:::i;36602:187::-;;;;;;;;;;;;;;;;-1:-1:-1;36602:187:0;;:::i;17436:101::-;;;;;;;;;;;;;;;;-1:-1:-1;17436:101:0;-1:-1:-1;;;;;17436:101:0;;:::i;30469:436::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30469:436:0;;;;;;;;:::i;27595:1124::-;17284:5;;-1:-1:-1;;;;;17284:5:0;17270:10;:19;17262:28;;;;;;27780:14:::1;27805:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;27805:28:0::1;;27834:6;27805:36;;;;;;;;;;;;;-1:-1:-1::0;;;;;27805:36:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27842:1:0::1;27805:39;;;;27780:65;;27901:6;-1:-1:-1::0;;;;;27864:43:0::1;:6;-1:-1:-1::0;;;;;27864:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27864:33:0;-1:-1:-1;;;;;27864:43:0::1;;27856:52;;;::::0;::::1;;-1:-1:-1::0;;;;;28020:22:0;::::1;;::::0;;;:14:::1;:22;::::0;;;;:37:::1;;::::0;:42;28012:51:::1;;;::::0;::::1;;28101:69;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;28101:69:0;;::::1;::::0;;-1:-1:-1;;;;;28101:69:0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;28101:69:0;;;;;;;;::::1;::::0;;;;;;;;;;;;28076:22;;::::1;::::0;;;:14:::1;:22:::0;;;;;;;;:94;;;;;;;;::::1;-1:-1:-1::0;;;28076:94:0::1;::::0;;::::1;-1:-1:-1::0;;;;;;28076:94:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;::::1;::::0;;::::1;::::0;28408:28:::1;28445:13;:11;:13::i;:::-;-1:-1:-1::0;;28408:65:0::1;;;;;;;;;;;;;-1:-1:-1::0;;;;;28408:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28491:40:0::1;::::0;;-1:-1:-1;;;;;28491:40:0;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;28491:40:0::1;::::0;-1:-1:-1;28491:40:0;;;::::1;::::0;;::::1;28547:34;::::0;;-1:-1:-1;;;;;28547:34:0;::::1;::::0;;;;-1:-1:-1;;;;;28547:34:0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;28597:50;::::0;;-1:-1:-1;;;;;28597:50:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;28663:48;::::0;;;;;;;-1:-1:-1;;;;;28663:48:0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;17301:1;27595:1124:::0;;;;:::o;25487:26::-;;;;:::o;25424:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25424:56:0;;;;-1:-1:-1;;;25424:56:0;;;-1:-1:-1;;;;;25424:56:0;;;;;:::o;32690:168::-;32759:7;32786:22;:20;:22::i;:::-;-1:-1:-1;;;;;32786:40:0;;32827:7;;32844:4;32786:64;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32786:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32786:64:0;;;;;-1:-1:-1;32786:64:0;;-1:-1:-1;32786:64:0;;-1:-1:-1;;;32786:64:0;;;;-1:-1:-1;32786:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32786:64:0;;32690:168;-1:-1:-1;;;32690:168:0:o;26969:130::-;27049:42;26969:130;:::o;17829:23::-;;;-1:-1:-1;;;;;17829:23:0;;:::o;26052:220::-;26256:1;26154:12;;26052:220;;:::o;16878:20::-;;;-1:-1:-1;;;;;16878:20:0;;:::o;35544:211::-;17284:5;;-1:-1:-1;;;;;17284:5:0;17270:10;:19;17262:28;;;;;;-1:-1:-1;;;;;35638:22:0;;::::1;;::::0;;;:14:::1;:22;::::0;;;;;;;;:39;;::::1;:51:::0;;-1:-1:-1;;;;;;35638:51:0::1;::::0;;::::1;::::0;;::::1;::::0;;35705:42;;;;;;;35638:22;;35705:42:::1;::::0;;;;;;;;;::::1;35544:211:::0;;:::o;33754:944::-;17284:5;;-1:-1:-1;;;;;17284:5:0;17270:10;:19;17262:28;;;;;;-1:-1:-1;;;;;33854:22:0;;::::1;33822:29;33854:22:::0;;;:14:::1;:22;::::0;;;;33904:13;;33854:22;;33904:13:::1;::::0;34177::::1;:11;:13::i;:::-;34221:8;::::0;34177:53:::1;::::0;;-1:-1:-1;;;34177:53:0;;-1:-1:-1;;;;;34177:53:0;;::::1;;::::0;::::1;::::0;-1:-1:-1;;34177:53:0;;;;34221:8;;::::1;34177:53:::0;;;;;;:22;;;::::1;::::0;::::1;::::0;:53;;;;;::::1;::::0;;;;;;;;;34221:8:::1;34177:22:::0;:53;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34177:53:0;::::1;;34173:200;;34271:31;::::0;;-1:-1:-1;;;34271:31:0;;34296:4:::1;34271:31;::::0;::::1;::::0;;;-1:-1:-1;;;;;34271:16:0;::::1;::::0;::::1;::::0;:31;;;;;::::1;::::0;;;;;;;;:16;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34271:31:0;34337:8:::1;::::0;34271:31;;-1:-1:-1;34317:44:0::1;::::0;-1:-1:-1;;;;;34317:19:0;;::::1;::::0;34337:8:::1;34271:31:::0;34317:19:::1;:44::i;:::-;34173:200;;;;;34385:15;34410:6;-1:-1:-1::0;;;;;34403:24:0::1;;34436:4;34403:39;;;;;;;;;;;;;-1:-1:-1::0;;;;;34403:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34403:39:0;34481:8:::1;::::0;34403:39;;-1:-1:-1;34453:46:0::1;::::0;-1:-1:-1;;;;;34453:27:0;;::::1;::::0;34481:8:::1;34403:39:::0;34453:27:::1;:46::i;:::-;34510:53;34545:13;:11;:13::i;:::-;-1:-1:-1::0;;;;;34510:26:0;::::1;::::0;34561:1:::1;34510:26;:53::i;:::-;34626:21;::::0;::::1;::::0;34581:67:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;34581:67:0;::::1;::::0;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;;;;;;;;34668:22:0::1;;::::0;;;:14:::1;:22;::::0;;;;;;34661:29;;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;34661:29:0::1;::::0;;::::1;;::::0;33754:944::o;33071:318::-;23928:10;23942:9;23928:23;23920:32;;;;;;33152:15:::1;33170:19;33181:7;;33170:10;:19::i;:::-;33152:37;;33219:11;;33208:7;:22;;33200:31;;;::::0;::::1;;33244:22;:20;:22::i;:::-;-1:-1:-1::0;;;;;33244:35:0::1;;33280:7;;33289;33306:4;33244:68;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;33244:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33343:12:0::1;::::0;33325:56:::1;::::0;-1:-1:-1;;;;;;33343:12:0::1;::::0;-1:-1:-1;33357:14:0::1;:12;:14::i;:::-;33373:7;33325:17;:56::i;:::-;23997:1;33071:318:::0;;:::o;36097:229::-;17284:5;;-1:-1:-1;;;;;17284:5:0;17270:10;:19;17262:28;;;;;;-1:-1:-1;;;;;36197:22:0;::::1;;::::0;;;:14:::1;:22;::::0;;;;;;;;:38:::1;;:57:::0;;;36270:48;;;;;;;::::1;::::0;;;;;;;;::::1;36097:229:::0;;:::o;26382:148::-;26479:42;26382:148;:::o;26660:197::-;26806:42;26660:197;:::o;29822:289::-;18440:8;;-1:-1:-1;;;;;18440:8:0;18426:10;:22;18418:31;;;;;;-1:-1:-1;;;;;29945:22:0;::::1;29913:29;29945:22:::0;;;:14:::1;:22;::::0;;;;30002:21:::1;::::0;::::1;::::0;:34:::1;::::0;30028:7;30002:25:::1;:34::i;:::-;29978:21;::::0;::::1;:58:::0;30047:13:::1;:11;:13::i;:::-;:56;::::0;;-1:-1:-1;;;30047:56:0;;-1:-1:-1;;;;;30047:56:0;;::::1;;::::0;::::1;::::0;;;;;;;30094:4:::1;30047:56:::0;;;;30101:1:::1;30047:56:::0;;;;;;;;:21;::::1;::::0;::::1;::::0;:56;;;;;30101:1;;30047:56;;;;;;30101:1;30047:21;:56;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;18460:1;29822:289:::0;;:::o;29338:161::-;-1:-1:-1;;;;;29447:22:0;;;29415:4;29447:22;;;:14;:22;;;;;:29;;29439:52;;;29338:161::o;31175:482::-;-1:-1:-1;;;;;31288:22:0;;;31236:7;31288:22;;;:14;:22;;;;;;;;31354:13;;31410:31;;-1:-1:-1;;;31410:31:0;;31435:4;31410:31;;;;;;31236:7;;31288:22;;31354:13;;;;-1:-1:-1;;;31369:11:0;;;-1:-1:-1;;;;;31369:11:0;;31236:7;;31354:13;;31410:16;;:31;;;;;;;;;;;31354:13;31410:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31410:31:0;31557:21;;;;31410:31;;-1:-1:-1;31538:16:0;;31557:31;;-1:-1:-1;;;;;31557:31:0;;:25;:31::i;:::-;31538:50;;31616:8;31606:7;:18;:43;;31648:1;31606:43;;;31637:8;31627:7;:18;31606:43;31599:50;31175:482;-1:-1:-1;;;;;;;31175:482:0:o;28943:144::-;-1:-1:-1;;;;;29042:22:0;29015:7;29042:22;;;:14;:22;;;;;:37;;;;28943:144::o;31977:336::-;23928:10;23942:9;23928:23;23920:32;;;;;;-1:-1:-1;;;;;32074:22:0;::::1;32042:29;32074:22:::0;;;:14:::1;:22;::::0;;;;;32126::::1;32089:6:::0;32126:14:::1;:22::i;:::-;32107:41;;32179:6;:22;;;32167:8;:34;;32159:43;;;::::0;::::1;;32231:23;::::0;::::1;::::0;32213:92:::1;::::0;-1:-1:-1;;;;;32231:23:0::1;32264:6:::0;32273:31:::1;32264:6:::0;32295:8;32273:13:::1;:31::i;:::-;32213:17;:92::i;37093:181::-:0;17284:5;;-1:-1:-1;;;;;17284:5:0;17270:10;:19;17262:28;;;;;;37167:12:::1;:24:::0;;-1:-1:-1;;;;;;37167:24:0::1;-1:-1:-1::0;;;;;37167:24:0;::::1;;::::0;;37239:14:::1;:12;:14::i;:::-;-1:-1:-1::0;;;;;37207:59:0::1;;37256:9;37207:59;;;;-1:-1:-1::0;;;;;37207:59:0::1;;;;;;;;;;;;;;;37093:181:::0;:::o;35029:170::-;17284:5;;-1:-1:-1;;;;;17284:5:0;17270:10;:19;17262:28;;;;;;-1:-1:-1;;;;;35106:22:0;;::::1;;::::0;;;:14:::1;:22;::::0;;;;;;;;:35;;-1:-1:-1;;;;;35106:35:0;::::1;-1:-1:-1::0;;;35106:35:0;::::1;::::0;;;::::1;;::::0;;35157:34;;;;;;;35106:22;;35157:34:::1;::::0;;;;;;;;;::::1;35029:170:::0;;:::o;25520:27::-;;;-1:-1:-1;;;;;25520:27:0;;:::o;36602:187::-;17284:5;;-1:-1:-1;;;;;17284:5:0;17270:10;:19;17262:28;;;;;;36678:11:::1;:26:::0;;;36751:14:::1;:12;:14::i;:::-;-1:-1:-1::0;;;;;36720:61:0::1;;36768:12;36720:61;;;;;;;;;;;;;;;;;;36602:187:::0;:::o;17436:101::-;17284:5;;-1:-1:-1;;;;;17284:5:0;17270:10;:19;17262:28;;;;;;17512:5:::1;:17:::0;;-1:-1:-1;;;;;;17512:17:0::1;-1:-1:-1::0;;;;;17512:17:0;;;::::1;::::0;;;::::1;::::0;;17436:101::o;30469:436::-;18440:8;;-1:-1:-1;;;;;18440:8:0;18426:10;:22;18418:31;;;;;;-1:-1:-1;;;;;30594:22:0;::::1;30562:29;30594:22:::0;;;:14:::1;:22;::::0;;;;30646:21:::1;::::0;::::1;::::0;30594:22;;30697:62:::1;30609:6:::0;30719:18;;::::1;:39;;30751:7;30719:39;;;30740:8;30719:39;30697:13;:62::i;:::-;30678:81;;30805:8;30794;:19;:45;;30831:8;30820;:19;30794:45;;;30816:1;30794:45;30770:21;::::0;;::::1;:69:::0;;;;30878:8;30850:47:::1;::::0;-1:-1:-1;;;;;30850:27:0;;::::1;::::0;30878:8:::1;30888::::0;30850:27:::1;:47::i;:::-;18460:1;;;30469:436:::0;;:::o;11157:619::-;11217:4;11685:20;;11528:66;11725:23;;;;;;:42;;-1:-1:-1;11752:15:0;;;11725:42;11717:51;11157:619;-1:-1:-1;;;;11157:619:0:o;19132:177::-;19242:58;;;-1:-1:-1;;;;;19242:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19242:58:0;-1:-1:-1;;;19242:58:0;;;19215:86;;19235:5;;19215:19;:86::i;19791:622::-;20161:10;;;20160:62;;-1:-1:-1;20177:39:0;;;-1:-1:-1;;;20177:39:0;;20201:4;20177:39;;;;-1:-1:-1;;;;;20177:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20177:39:0;:44;20160:62;20152:152;;;;-1:-1:-1;;;20152:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20342:62;;;-1:-1:-1;;;;;20342:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20342:62:0;-1:-1:-1;;;20342:62:0;;;20315:90;;20335:5;;20315:19;:90::i;24364:420::-;-1:-1:-1;;;;;24505:23:0;;24497:32;;;;;;24542:47;-1:-1:-1;;;;;24542:27:0;;24570:9;24581:7;24542:27;:47::i;:::-;24606:29;24625:9;24606:18;:29::i;:::-;24602:117;;;24670:9;-1:-1:-1;;;;;24652:47:0;;24700:6;24652:55;;;;;;;;;;;;;-1:-1:-1;;;;;24652:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24602:117;24736:40;;;-1:-1:-1;;;;;24736:40:0;;;;;;;;;;;;;;;;;;;;;;;;;24364:420;;;:::o;3724:181::-;3782:7;3814:5;;;3838:6;;;;3830:46;;;;;-1:-1:-1;;;3830:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3896:1;3724:181;-1:-1:-1;;;3724:181:0:o;37615:375::-;37688:7;37708:15;37733:6;-1:-1:-1;;;;;37726:24:0;;37759:4;37726:39;;;;;;;;;;;;;-1:-1:-1;;;;;37726:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37726:39:0;;-1:-1:-1;37778:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;37778:22:0;;37801:6;37809:7;37826:4;37778:54;;;;;;;;;;;;;-1:-1:-1;;;;;37778:54:0;;;;;;;;;;;-1:-1:-1;;;;;37778:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37864:39:0;;;-1:-1:-1;;;37864:39:0;;37897:4;37864:39;;;;;;37845:16;;37906:7;;-1:-1:-1;;;;;37864:24:0;;;;;:39;;;;;37778:54;;37864:39;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37864:39:0;:49;;-1:-1:-1;37934:19:0;;;;37926:28;;;;;21437:761;21861:23;21887:69;21915:4;21887:69;;;;;;;;;;;;;;;;;21895:5;-1:-1:-1;;;;;21887:27:0;;;:69;;;;;:::i;:::-;21971:17;;21861:95;;-1:-1:-1;21971:21:0;21967:224;;22113:10;22102:30;;;;;;;;;;;;;;;-1:-1:-1;22102:30:0;22094:85;;;;-1:-1:-1;;;22094:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14272:196;14375:12;14407:53;14430:6;14438:4;14444:1;14447:12;15779;15812:18;15823:6;15812:10;:18::i;:::-;15804:60;;;;;-1:-1:-1;;;15804:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15938:12;15952:23;15979:6;-1:-1:-1;;;;;15979:11:0;15999:8;16010:4;15979:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15979:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15937:78;;;;16030:7;16026:595;;;16061:10;-1:-1:-1;16054:17:0;;-1:-1:-1;16054:17:0;16026:595;16175:17;;:21;16171:439;;16438:10;16432:17;16499:15;16486:10;16482:2;16478:19;16471:44;16386:148;16581:12;16574:20;;-1:-1:-1;;;16574:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://eadb55bd06c5027cc4342ab4da4a21f5262397023b655b1310eb39b17e6f763e
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.