More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,210 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Borrow | 16387821 | 826 days ago | IN | 0 ETH | 0.00080852 | ||||
Deposit Eth | 16387815 | 826 days ago | IN | 1 ETH | 0.00160469 | ||||
Borrow | 16387799 | 826 days ago | IN | 0 ETH | 0.00084176 | ||||
Deposit Eth | 16387795 | 826 days ago | IN | 0.1 ETH | 0.00173098 | ||||
Borrow | 16387167 | 827 days ago | IN | 0 ETH | 0.00165506 | ||||
Deposit Eth | 16387161 | 827 days ago | IN | 0.1 ETH | 0.00341828 | ||||
Deposit Erc20 | 13432264 | 1279 days ago | IN | 0 ETH | 0.00916895 | ||||
Deposit Erc20 | 13432246 | 1279 days ago | IN | 0 ETH | 0.01809513 | ||||
Borrow | 12830064 | 1372 days ago | IN | 0 ETH | 0.00055669 | ||||
Withdraw | 12830064 | 1372 days ago | IN | 0 ETH | 0.00055616 | ||||
Withdraw | 12830064 | 1372 days ago | IN | 0 ETH | 0.00049698 | ||||
Borrow | 12623723 | 1404 days ago | IN | 0 ETH | 0.00028255 | ||||
Withdraw | 11874838 | 1520 days ago | IN | 0 ETH | 0.00320166 | ||||
Borrow | 11874837 | 1520 days ago | IN | 0 ETH | 0.0060865 | ||||
Deposit Eth | 11874811 | 1520 days ago | IN | 0.8 ETH | 0.01968421 | ||||
Withdraw | 11854401 | 1523 days ago | IN | 0 ETH | 0.00357484 | ||||
Withdraw | 11851937 | 1523 days ago | IN | 0 ETH | 0.00339782 | ||||
Borrow | 11851929 | 1523 days ago | IN | 0 ETH | 0.00723254 | ||||
Deposit Eth | 11851920 | 1523 days ago | IN | 1 ETH | 0.02026745 | ||||
Borrow | 11850482 | 1524 days ago | IN | 0 ETH | 0.01064158 | ||||
Deposit Erc20 | 11850461 | 1524 days ago | IN | 0 ETH | 0.03055025 | ||||
Borrow | 11850274 | 1524 days ago | IN | 0 ETH | 0.00364243 | ||||
Borrow | 11850234 | 1524 days ago | IN | 0 ETH | 0.01518291 | ||||
Deposit Erc20 | 11850234 | 1524 days ago | IN | 0 ETH | 0.00968496 | ||||
Deposit Erc20 | 11850177 | 1524 days ago | IN | 0 ETH | 0.04096835 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 16387821 | 826 days ago | 0.99 ETH | ||||
Transfer | 16387815 | 826 days ago | 0.005 ETH | ||||
Transfer | 16387799 | 826 days ago | 0.09999 ETH | ||||
Transfer | 16387795 | 826 days ago | 0.0005 ETH | ||||
Transfer | 16387167 | 827 days ago | 0.099 ETH | ||||
Transfer | 16387161 | 827 days ago | 0.0005 ETH | ||||
- | 12830064 | 1372 days ago | 0.1194 ETH | ||||
- | 12623723 | 1404 days ago | 0.0597 ETH | ||||
- | 11874837 | 1520 days ago | 0.796 ETH | ||||
- | 11874811 | 1520 days ago | 0.004 ETH | ||||
- | 11851929 | 1523 days ago | 0.995 ETH | ||||
- | 11851920 | 1523 days ago | 0.005 ETH | ||||
- | 11568042 | 1567 days ago | 0.14038918 ETH | ||||
- | 11534618 | 1572 days ago | 0.199 ETH | ||||
- | 11534432 | 1572 days ago | 0.001 ETH | ||||
- | 11530992 | 1573 days ago | 0.995 ETH | ||||
- | 11499684 | 1578 days ago | 1.2935 ETH | ||||
- | 11493746 | 1579 days ago | 0.995 ETH | ||||
- | 11486988 | 1580 days ago | 0.32835 ETH | ||||
- | 11484826 | 1580 days ago | 0.00165 ETH | ||||
- | 11484554 | 1580 days ago | 0.32835 ETH | ||||
- | 11484533 | 1580 days ago | 0.00165 ETH | ||||
- | 11484527 | 1580 days ago | 0.3383 ETH | ||||
- | 11484523 | 1580 days ago | 0.0017 ETH | ||||
- | 11484493 | 1580 days ago | 0.34825 ETH |
Loading...
Loading
Contract Name:
Lending
Compiler Version
v0.7.1+commit.f4a555be
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-07 */ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.7.1; // File: contracts/lending/LendingInterface.sol interface LendingInterface { function depositEth() external payable; function depositErc20(address tokenAddress, uint256 amount) external; function borrow(address tokenAddress, uint256 amount) external; function withdraw(address tokenAddress, uint256 amount) external; function repayEth() external payable; function repayErc20(address tokenAddress, uint256 amount) external; function forceLiquidate(address token, address account) external; function getStakingAddress() external view returns (address); function getTaxTokenAddress() external view returns (address); function getInterest() external view returns (uint256); function getTvl(address tokenAddress) external view returns (uint256); function getTotalLending(address tokenAddress) external view returns (uint256); function getTotalBorrowing(address tokenAddress) external view returns (uint256); function getTokenInfo(address tokenAddress) external view returns (uint256 totalLendAmount, uint256 totalBorrowAmount); function getLenderAccount(address tokenAddress, address userAddress) external view returns (uint256); function getBorrowerAccount(address tokenAddress, address userAddress) external view returns (uint256); function getRemainingCredit(address tokenAddress, address userAddress) external view returns (uint256); function getAccountInfo(address tokenAddress, address userAddress) external view returns ( uint256 lendAccount, uint256 borrowAccount, uint256 remainingCredit ); } // File: @openzeppelin/contracts/GSN/Context.sol /* * @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; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @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 /** * @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: @openzeppelin/contracts/utils/Address.sol /** * @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: @openzeppelin/contracts/token/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.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"); } } } // File: contracts/token/TaxTokenInterface.sol interface TaxTokenInterface is IERC20 { function mintToken( address, uint256, address ) external; function registerWhitelist(address, address) external; function unregisterWhitelist(address) external; function updateLendingAddress(address) external; function updateIncentiveAddresses(address[] memory, uint256[] memory) external; function updateGovernanceAddress(address) external; function mintDeveloperFund() external; function mintIncentiveFund() external; function getGovernanceAddress() external view returns (address); function getDeveloperAddress() external view returns (address); function getLendingAddress() external view returns (address); function getFunds() external view returns (uint256 developerFund, uint256 incentiveFund); function getConfigs() external view returns ( uint256 maxTotalSupply, uint256 halvingStartLendValue, uint256 halvingDecayRateE8, uint256 developerFundRateE8, uint256 incentiveFundRateE8 ); function getIncentiveFundAddresses() external view returns ( address[] memory incentiveFundAddresses, uint256[] memory incentiveFundAllocationE8 ); function getMintUnit() external view returns (uint256); function getOracleAddress(address) external view returns (address); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } // File: contracts/util/TransferETH.sol contract TransferETH { receive() external payable {} /** * @notice transfer `amount` ETH to the `recipient` account with emitting log */ function _transferETH( address payable recipient, uint256 amount, string memory errorMessage ) internal { (bool success, ) = recipient.call{value: amount}(""); require(success, errorMessage); } function _transferETH(address payable recipient, uint256 amount) internal { _transferETH(recipient, amount, "Transfer amount exceeds balance"); } } // File: contracts/lending/Lending.sol contract Lending is LendingInterface, TransferETH { using SafeMath for uint256; using SafeERC20 for ERC20; /* ========== CONSTANT VARIABLES ========== */ address internal constant ETH_ADDRESS = address(0); uint256 internal constant COLLATERAL_RATIO = 100; // minimum collateral ratio is 100%. TaxTokenInterface internal immutable _taxTokenContract; address internal immutable _stakingAddress; uint256 internal immutable _interestE3; // 0.0% - 100.0% /* ========== STATE VARIABLES ========== */ mapping(bytes32 => uint256) internal _lenderAccount; // keccak(tokenAddress, userAddress) => amount mapping(bytes32 => uint256) internal _borrowerAccount; // keccak(tokenAddress, userAddress) => amount mapping(bytes32 => uint256) internal _remainingCredit; // keccak(tokenAddress, userAddress) => amount mapping(address => uint256) internal _totalLending; // tokenAddress => amount mapping(address => uint256) internal _totalBorrowing; // tokenAddress => amount /* ========== CONSTRUCTOR ========== */ constructor( address taxTokenAddress, address stakingAddress, uint256 interestE3 ) { _taxTokenContract = TaxTokenInterface(taxTokenAddress); _stakingAddress = stakingAddress; _interestE3 = interestE3; } /* ========== MUTATIVE FUNCTIONS ========== */ /** * @notice Deposit(lend) collateral in ETH. * As users can potentially be borrowers as well, the function charges the upfront interest fee. * Users can rececive the upfront interest fee in tax token. */ function depositEth() external payable override { uint256 feeRate = _deposit(msg.sender, ETH_ADDRESS, msg.value); _transferETH(payable(_stakingAddress), feeRate); } /** * @notice Deposit(lend) collateral in any erc20 token. * As users can potentially be borrowers as well, the function charges the upfront interest fee. * Iff the erc20 token is whitelisted in the tax token, users can rececive the upfront interest fee in tax token. */ function depositErc20(address tokenAddress, uint256 amount) external override { ERC20(tokenAddress).safeTransferFrom(msg.sender, address(this), amount); uint256 feeRate = _deposit(msg.sender, tokenAddress, amount); ERC20(tokenAddress).safeTransfer(_stakingAddress, feeRate); } /** * @notice Borrow up to the amount of remaining credit. */ function borrow(address tokenAddress, uint256 amount) external override { _borrow(msg.sender, tokenAddress, amount); if (tokenAddress == ETH_ADDRESS) { _transferETH(msg.sender, amount); } else { ERC20(tokenAddress).safeTransfer(msg.sender, amount); } } /** * @notice Withdraw the deposited (lended) collateral up to the amount of remaining credit. */ function withdraw(address tokenAddress, uint256 amount) external override { _withdraw(msg.sender, tokenAddress, amount); if (tokenAddress == ETH_ADDRESS) { _transferETH(msg.sender, amount); } else { ERC20(tokenAddress).safeTransfer(msg.sender, amount); } } function repayEth() external payable override { _repay(msg.sender, ETH_ADDRESS, msg.value); } /** * @notice Repay the borrowing erc20 token up to the amount of borrowing. */ function repayErc20(address tokenAddress, uint256 amount) external override { ERC20(tokenAddress).safeTransferFrom(msg.sender, address(this), amount); _repay(msg.sender, tokenAddress, amount); } /** * @notice Force liquidate if the user doesn't have enough collateral. */ function forceLiquidate(address token, address userAddress) external override { bytes32 account = keccak256(abi.encode(token, userAddress)); require( _borrowerAccount[account] > _lenderAccount[account].mul(COLLATERAL_RATIO.div(100)), "enough collateral" ); _totalLending[token] -= _lenderAccount[account]; _totalBorrowing[token] -= _borrowerAccount[account]; _borrowerAccount[account] = 0; _lenderAccount[account] = 0; _remainingCredit[account] = 0; } /* ========== INTERNAL FUNCTIONS ========== */ function _deposit( address lender, address tokenAddress, uint256 amount ) internal returns (uint256 feeRate) { require(amount != 0, "cannot deposit zero amount"); feeRate = amount.mul(_interestE3).div(1000); _totalLending[tokenAddress] = _totalLending[tokenAddress].add(amount).sub(feeRate); bytes32 account = keccak256(abi.encode(tokenAddress, lender)); _lenderAccount[account] = _lenderAccount[account].add(amount).sub(feeRate); _remainingCredit[account] = _remainingCredit[account].add(amount).sub(feeRate); _taxTokenContract.mintToken(tokenAddress, amount, lender); } function _borrow( address lender, address tokenAddress, uint256 amount ) internal { bytes32 account = keccak256(abi.encode(tokenAddress, lender)); require(amount != 0, "should borrow positive amount"); require(amount <= _remainingCredit[account], "too much borrow"); _totalBorrowing[tokenAddress] = _totalBorrowing[tokenAddress].add(amount); _remainingCredit[account] = _remainingCredit[account].sub(amount); _borrowerAccount[account] = _borrowerAccount[account].add(amount); } function _withdraw( address lender, address tokenAddress, uint256 amount ) internal { bytes32 account = keccak256(abi.encode(tokenAddress, lender)); require(amount != 0, "should withdraw positive amount"); require(amount <= _remainingCredit[account], "too much withdraw"); _totalLending[tokenAddress] = _totalLending[tokenAddress].sub(amount); _remainingCredit[account] = _remainingCredit[account].sub(amount); _lenderAccount[account] = _lenderAccount[account].sub(amount); } function _repay( address lender, address tokenAddress, uint256 amount ) internal { bytes32 account = keccak256(abi.encode(tokenAddress, lender)); require(amount != 0, "should repay positive amount"); require(amount <= _borrowerAccount[account], "too much repay"); _totalBorrowing[tokenAddress] = _totalBorrowing[tokenAddress].sub(amount); _remainingCredit[account] = _remainingCredit[account].add(amount); _borrowerAccount[account] = _borrowerAccount[account].sub(amount); } /* ========== CALL FUNCTIONS ========== */ /** * @return staking contract address */ function getStakingAddress() external view override returns (address) { return _stakingAddress; } /** * @return tax token address */ function getTaxTokenAddress() external view override returns (address) { return address(_taxTokenContract); } /** * @return interest fee charged when deposit */ function getInterest() external view override returns (uint256) { return _interestE3; } /** * @return total value locked of the token */ function getTvl(address tokenAddress) external view override returns (uint256) { return _totalLending[tokenAddress]; } /** * @return total lending amount of the token */ function getTotalLending(address tokenAddress) external view override returns (uint256) { return _totalLending[tokenAddress]; } /** * @return total borrowing amount of the token */ function getTotalBorrowing(address tokenAddress) external view override returns (uint256) { return _totalBorrowing[tokenAddress]; } /** * @notice Get token info */ function getTokenInfo(address tokenAddress) external view override returns (uint256 totalLendAmount, uint256 totalBorrowAmount) { totalLendAmount = _totalLending[tokenAddress]; totalBorrowAmount = _totalBorrowing[tokenAddress]; } /** * @return total lending amount of the token belonging to the user */ function getLenderAccount(address tokenAddress, address userAddress) external view override returns (uint256) { bytes32 account = keccak256(abi.encode(tokenAddress, userAddress)); return _lenderAccount[account]; } /** * @return total borrowing amount of the token belonging to the user */ function getBorrowerAccount(address tokenAddress, address userAddress) external view override returns (uint256) { bytes32 account = keccak256(abi.encode(tokenAddress, userAddress)); return _borrowerAccount[account]; } /** * @return remaining credit amount of the token belonging to the user */ function getRemainingCredit(address tokenAddress, address userAddress) external view override returns (uint256) { bytes32 account = keccak256(abi.encode(tokenAddress, userAddress)); return _remainingCredit[account]; } /** * @notice Get account info of the token belonging to the user */ function getAccountInfo(address tokenAddress, address userAddress) external view override returns ( uint256 lendAccount, uint256 borrowAccount, uint256 remainingCredit ) { bytes32 account = keccak256(abi.encode(tokenAddress, userAddress)); lendAccount = _lenderAccount[account]; borrowAccount = _borrowerAccount[account]; remainingCredit = _remainingCredit[account]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"taxTokenAddress","type":"address"},{"internalType":"address","name":"stakingAddress","type":"address"},{"internalType":"uint256","name":"interestE3","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"forceLiquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"uint256","name":"lendAccount","type":"uint256"},{"internalType":"uint256","name":"borrowAccount","type":"uint256"},{"internalType":"uint256","name":"remainingCredit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"getBorrowerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"getLenderAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"getRemainingCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTokenInfo","outputs":[{"internalType":"uint256","name":"totalLendAmount","type":"uint256"},{"internalType":"uint256","name":"totalBorrowAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTotalBorrowing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTotalLending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getTvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"repayEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e060405234801561001057600080fd5b50604051611ae7380380611ae78339818101604052606081101561003357600080fd5b50805160208201516040909201516001600160601b0319606092831b81166080529290911b90911660a05260c05260805160601c60a05160601c60c051611a406100a7600039806109ed5280610ab852508061053e52806105aa5280610817525080610a1c5280610c245250611a406000f3fe60806040526004361061012d5760003560e01c80635f56fe12116100a5578063aa317dc011610074578063e5a4bed311610059578063e5a4bed3146104cc578063f3fef3a3146104e1578063f734d4a01461052757610134565b8063aa317dc01461043c578063b800f4641461048457610134565b80635f56fe121461034a5780636332fef6146103905780636548b40d146103f6578063798678bb146102bc57610134565b8063480544ea116100fc57806349ea8867116100e157806349ea8867146102bc5780634a282670146102fc5780634b8a35291461030457610134565b8063480544ea1461022c578063480df6d41461027457610134565b80630e9ed68b146101395780631f69565f14610177578063439370b1146101d057806346b9ae9d146101da57610134565b3661013457005b600080fd5b34801561014557600080fd5b5061014e61053c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561018357600080fd5b506101b76004803603602081101561019a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610560565b6040805192835260208301919091528051918290030190f35b6101d8610595565b005b3480156101e657600080fd5b5061021a600480360360208110156101fd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166105d2565b60408051918252519081900360200190f35b34801561023857600080fd5b5061021a6004803603604081101561024f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166105fa565b34801561028057600080fd5b5061021a6004803603604081101561029757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610652565b3480156102c857600080fd5b5061021a600480360360208110156102df57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106a6565b6101d86106ce565b34801561031057600080fd5b506101d86004803603604081101561032757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356106dc565b34801561035657600080fd5b506101d86004803603604081101561036d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610736565b34801561039c57600080fd5b506103d8600480360360408110156103b357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610763565b60408051938452602084019290925282820152519081900360600190f35b34801561040257600080fd5b506101d86004803603604081101561041957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356107ca565b34801561044857600080fd5b506101d86004803603604081101561045f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610841565b34801561049057600080fd5b5061021a600480360360408110156104a757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610996565b3480156104d857600080fd5b5061021a6109eb565b3480156104ed57600080fd5b506101d86004803603604081101561050457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a0f565b34801561053357600080fd5b5061014e610a1a565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff166000908152600360209081526040808320546004909252909120549091565b60006105a333600034610a3e565b90506105cf7f000000000000000000000000000000000000000000000000000000000000000082610c8b565b50565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b6040805173ffffffffffffffffffffffffffffffffffffffff80851660208084019190915290841682840152825180830384018152606090920183528151918101919091206000908152600190915220545b92915050565b6040805173ffffffffffffffffffffffffffffffffffffffff938416602080830191909152929093168382015280518084038201815260609093018152825192820192909220600090815290819052205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6106da33600034610ccb565b565b6106e7338383610e9f565b73ffffffffffffffffffffffffffffffffffffffff82166107115761070c3382610c8b565b610732565b61073273ffffffffffffffffffffffffffffffffffffffff8316338361105e565b5050565b61075873ffffffffffffffffffffffffffffffffffffffff83163330846110eb565b610732338383610ccb565b6040805173ffffffffffffffffffffffffffffffffffffffff93841660208083019190915293909216828201528051808303820181526060909201815281519183019190912060009081528083528181205460018452828220546002909452919020549092565b6107ec73ffffffffffffffffffffffffffffffffffffffff83163330846110eb565b60006107f9338484610a3e565b905061083c73ffffffffffffffffffffffffffffffffffffffff84167f00000000000000000000000000000000000000000000000000000000000000008361105e565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80851660208084019190915290841682840152825180830384018152606090920190925280519101206108a6610891606480611186565b600083815260208190526040902054906111cf565b6000828152600160205260409020541161092157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f656e6f75676820636f6c6c61746572616c000000000000000000000000000000604482015290519081900360640190fd5b600081815260208181526040808320805473ffffffffffffffffffffffffffffffffffffffff9097168085526003845282852080549890980390975584845260018352818420805497855260048452828520805498909803909755938352948290559181905560029091529182209190915550565b6040805173ffffffffffffffffffffffffffffffffffffffff93841660208083019190915292909316838201528051808403820181526060909301815282519282019290922060009081526002909152205490565b7f000000000000000000000000000000000000000000000000000000000000000090565b6106e7338383611242565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081610aac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f63616e6e6f74206465706f736974207a65726f20616d6f756e74000000000000604482015290519081900360640190fd5b610ae26103e8610adc847f00000000000000000000000000000000000000000000000000000000000000006111cf565b90611186565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054909150610b21908290610b1b9085611415565b90611489565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600360209081526040808320959095558451808201939093529288168285015283518083038501815260609092018452815191830191909120808252918190529190912054610b93908390610b1b9086611415565b60008281526020818152604080832093909355600290522054610bbc908390610b1b9086611415565b6000828152600260205260408082209290925581517f6dfada8600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201879052888116604483015292517f000000000000000000000000000000000000000000000000000000000000000090931692636dfada869260648084019391929182900301818387803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b50505050509392505050565b61073282826040518060400160405280601f81526020017f5472616e7366657220616d6f756e7420657863656564732062616c616e6365008152506114cb565b6040805173ffffffffffffffffffffffffffffffffffffffff808516602080840191909152908616828401528251808303840181526060909201909252805191012081610d7957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f73686f756c6420726570617920706f73697469766520616d6f756e7400000000604482015290519081900360640190fd5b600081815260016020526040902054821115610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f746f6f206d756368207265706179000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902054610e269083611489565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832093909355838252600290522054610e659083611415565b600082815260026020908152604080832093909355600190522054610e8a9083611489565b60009182526001602052604090912055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff808516602080840191909152908616828401528251808303840181526060909201909252805191012081610f4d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f73686f756c6420626f72726f7720706f73697469766520616d6f756e74000000604482015290519081900360640190fd5b600081815260026020526040902054821115610fca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f746f6f206d75636820626f72726f770000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902054610ffa9083611415565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320939093558382526002905220546110399083611489565b600082815260026020908152604080832093909355600190522054610e8a9083611415565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261083c9084906115d8565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526111809085906115d8565b50505050565b60006111c883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506116b0565b9392505050565b6000826111de5750600061064c565b828202828482816111eb57fe5b04146111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806119c06021913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8085166020808401919091529086168284015282518083038401815260609092019092528051910120816112f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f73686f756c6420776974686472617720706f73697469766520616d6f756e7400604482015290519081900360640190fd5b60008181526002602052604090205482111561136d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f6f206d756368207769746864726177000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205461139d9083611489565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360209081526040808320939093558382526002905220546113dc9083611489565b60008281526002602090815260408083209390935581905220546114009083611489565b60009182526020829052604090912055505050565b6000828201838110156111c857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006111c883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061172f565b60405160009073ffffffffffffffffffffffffffffffffffffffff85169084908381818185875af1925050503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b505090508082906115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561159657818101518382015260200161157e565b50505050905090810190601f1680156115c35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050565b606061163a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166117a39092919063ffffffff16565b80519091501561083c5780806020019051602081101561165957600080fd5b505161083c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806119e1602a913960400191505060405180910390fd5b60008183611719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561159657818101518382015260200161157e565b50600083858161172557fe5b0495945050505050565b6000818484111561179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561159657818101518382015260200161157e565b505050900390565b60606117b284846000856117ba565b949350505050565b60606117c585611986565b61183057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061189a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161185d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146118fc576040519150601f19603f3d011682016040523d82523d6000602084013e611901565b606091505b509150915081156119155791506117b29050565b8051156119255780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865187939192839260440191908501908083836000831561159657818101518382015260200161157e565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906117b257505015159291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212200918b6a5d0d4c42da0ffd67f1988b04dbb80d6e8e6565436d0b817eb249bf2ee64736f6c63430007010033000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a95000000000000000000000000a383c8390adbcd387db93babdf3f30308391bd570000000000000000000000000000000000000000000000000000000000000005
Deployed Bytecode
0x60806040526004361061012d5760003560e01c80635f56fe12116100a5578063aa317dc011610074578063e5a4bed311610059578063e5a4bed3146104cc578063f3fef3a3146104e1578063f734d4a01461052757610134565b8063aa317dc01461043c578063b800f4641461048457610134565b80635f56fe121461034a5780636332fef6146103905780636548b40d146103f6578063798678bb146102bc57610134565b8063480544ea116100fc57806349ea8867116100e157806349ea8867146102bc5780634a282670146102fc5780634b8a35291461030457610134565b8063480544ea1461022c578063480df6d41461027457610134565b80630e9ed68b146101395780631f69565f14610177578063439370b1146101d057806346b9ae9d146101da57610134565b3661013457005b600080fd5b34801561014557600080fd5b5061014e61053c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561018357600080fd5b506101b76004803603602081101561019a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610560565b6040805192835260208301919091528051918290030190f35b6101d8610595565b005b3480156101e657600080fd5b5061021a600480360360208110156101fd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166105d2565b60408051918252519081900360200190f35b34801561023857600080fd5b5061021a6004803603604081101561024f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166105fa565b34801561028057600080fd5b5061021a6004803603604081101561029757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610652565b3480156102c857600080fd5b5061021a600480360360208110156102df57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106a6565b6101d86106ce565b34801561031057600080fd5b506101d86004803603604081101561032757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356106dc565b34801561035657600080fd5b506101d86004803603604081101561036d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610736565b34801561039c57600080fd5b506103d8600480360360408110156103b357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610763565b60408051938452602084019290925282820152519081900360600190f35b34801561040257600080fd5b506101d86004803603604081101561041957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356107ca565b34801561044857600080fd5b506101d86004803603604081101561045f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610841565b34801561049057600080fd5b5061021a600480360360408110156104a757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610996565b3480156104d857600080fd5b5061021a6109eb565b3480156104ed57600080fd5b506101d86004803603604081101561050457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a0f565b34801561053357600080fd5b5061014e610a1a565b7f000000000000000000000000a383c8390adbcd387db93babdf3f30308391bd5790565b73ffffffffffffffffffffffffffffffffffffffff166000908152600360209081526040808320546004909252909120549091565b60006105a333600034610a3e565b90506105cf7f000000000000000000000000a383c8390adbcd387db93babdf3f30308391bd5782610c8b565b50565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b6040805173ffffffffffffffffffffffffffffffffffffffff80851660208084019190915290841682840152825180830384018152606090920183528151918101919091206000908152600190915220545b92915050565b6040805173ffffffffffffffffffffffffffffffffffffffff938416602080830191909152929093168382015280518084038201815260609093018152825192820192909220600090815290819052205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6106da33600034610ccb565b565b6106e7338383610e9f565b73ffffffffffffffffffffffffffffffffffffffff82166107115761070c3382610c8b565b610732565b61073273ffffffffffffffffffffffffffffffffffffffff8316338361105e565b5050565b61075873ffffffffffffffffffffffffffffffffffffffff83163330846110eb565b610732338383610ccb565b6040805173ffffffffffffffffffffffffffffffffffffffff93841660208083019190915293909216828201528051808303820181526060909201815281519183019190912060009081528083528181205460018452828220546002909452919020549092565b6107ec73ffffffffffffffffffffffffffffffffffffffff83163330846110eb565b60006107f9338484610a3e565b905061083c73ffffffffffffffffffffffffffffffffffffffff84167f000000000000000000000000a383c8390adbcd387db93babdf3f30308391bd578361105e565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80851660208084019190915290841682840152825180830384018152606090920190925280519101206108a6610891606480611186565b600083815260208190526040902054906111cf565b6000828152600160205260409020541161092157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f656e6f75676820636f6c6c61746572616c000000000000000000000000000000604482015290519081900360640190fd5b600081815260208181526040808320805473ffffffffffffffffffffffffffffffffffffffff9097168085526003845282852080549890980390975584845260018352818420805497855260048452828520805498909803909755938352948290559181905560029091529182209190915550565b6040805173ffffffffffffffffffffffffffffffffffffffff93841660208083019190915292909316838201528051808403820181526060909301815282519282019290922060009081526002909152205490565b7f000000000000000000000000000000000000000000000000000000000000000590565b6106e7338383611242565b7f000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a9590565b600081610aac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f63616e6e6f74206465706f736974207a65726f20616d6f756e74000000000000604482015290519081900360640190fd5b610ae26103e8610adc847f00000000000000000000000000000000000000000000000000000000000000056111cf565b90611186565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054909150610b21908290610b1b9085611415565b90611489565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600360209081526040808320959095558451808201939093529288168285015283518083038501815260609092018452815191830191909120808252918190529190912054610b93908390610b1b9086611415565b60008281526020818152604080832093909355600290522054610bbc908390610b1b9086611415565b6000828152600260205260408082209290925581517f6dfada8600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201879052888116604483015292517f000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a9590931692636dfada869260648084019391929182900301818387803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b50505050509392505050565b61073282826040518060400160405280601f81526020017f5472616e7366657220616d6f756e7420657863656564732062616c616e6365008152506114cb565b6040805173ffffffffffffffffffffffffffffffffffffffff808516602080840191909152908616828401528251808303840181526060909201909252805191012081610d7957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f73686f756c6420726570617920706f73697469766520616d6f756e7400000000604482015290519081900360640190fd5b600081815260016020526040902054821115610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f746f6f206d756368207265706179000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902054610e269083611489565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832093909355838252600290522054610e659083611415565b600082815260026020908152604080832093909355600190522054610e8a9083611489565b60009182526001602052604090912055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff808516602080840191909152908616828401528251808303840181526060909201909252805191012081610f4d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f73686f756c6420626f72726f7720706f73697469766520616d6f756e74000000604482015290519081900360640190fd5b600081815260026020526040902054821115610fca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f746f6f206d75636820626f72726f770000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902054610ffa9083611415565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460209081526040808320939093558382526002905220546110399083611489565b600082815260026020908152604080832093909355600190522054610e8a9083611415565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261083c9084906115d8565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526111809085906115d8565b50505050565b60006111c883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506116b0565b9392505050565b6000826111de5750600061064c565b828202828482816111eb57fe5b04146111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806119c06021913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8085166020808401919091529086168284015282518083038401815260609092019092528051910120816112f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f73686f756c6420776974686472617720706f73697469766520616d6f756e7400604482015290519081900360640190fd5b60008181526002602052604090205482111561136d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f6f206d756368207769746864726177000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205461139d9083611489565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600360209081526040808320939093558382526002905220546113dc9083611489565b60008281526002602090815260408083209390935581905220546114009083611489565b60009182526020829052604090912055505050565b6000828201838110156111c857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006111c883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061172f565b60405160009073ffffffffffffffffffffffffffffffffffffffff85169084908381818185875af1925050503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b505090508082906115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561159657818101518382015260200161157e565b50505050905090810190601f1680156115c35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050565b606061163a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166117a39092919063ffffffff16565b80519091501561083c5780806020019051602081101561165957600080fd5b505161083c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806119e1602a913960400191505060405180910390fd5b60008183611719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561159657818101518382015260200161157e565b50600083858161172557fe5b0495945050505050565b6000818484111561179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561159657818101518382015260200161157e565b505050900390565b60606117b284846000856117ba565b949350505050565b60606117c585611986565b61183057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061189a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161185d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146118fc576040519150601f19603f3d011682016040523d82523d6000602084013e611901565b606091505b509150915081156119155791506117b29050565b8051156119255780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865187939192839260440191908501908083836000831561159657818101518382015260200161157e565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906117b257505015159291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212200918b6a5d0d4c42da0ffd67f1988b04dbb80d6e8e6565436d0b817eb249bf2ee64736f6c63430007010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a95000000000000000000000000a383c8390adbcd387db93babdf3f30308391bd570000000000000000000000000000000000000000000000000000000000000005
-----Decoded View---------------
Arg [0] : taxTokenAddress (address): 0xB6A439237b6705DF8f6cD8e285A41c1e9a8a6A95
Arg [1] : stakingAddress (address): 0xA383C8390aDbCd387DB93BabdF3F30308391Bd57
Arg [2] : interestE3 (uint256): 5
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a95
Arg [1] : 000000000000000000000000a383c8390adbcd387db93babdf3f30308391bd57
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000005
Deployed Bytecode Sourcemap
34270:10172:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41242:111;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42416:293;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42416:293:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35921:187;;;:::i;:::-;;42214:145;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42214:145:0;;;;:::i;:::-;;;;;;;;;;;;;;;;43184:281;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43184:281:0;;;;;;;;;;;:::i;42807:277::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42807:277:0;;;;;;;;;;;:::i;41787:132::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41787:132:0;;;;:::i;37584:107::-;;;:::i;36811:319::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36811:319:0;;;;;;;;;:::i;37796:217::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37796:217:0;;;;;;;;;:::i;43941:498::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43941:498:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;36416:308;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36416:308:0;;;;;;;;;:::i;38115:554::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38115:554:0;;;;;;;;;;;:::i;43566:281::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43566:281:0;;;;;;;;;;;:::i;41612:101::-;;;;;;;;;;;;;:::i;37253:323::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37253:323:0;;;;;;;;;:::i;41413:123::-;;;;;;;;;;;;;:::i;41242:111::-;41330:15;41242:111;:::o;42416:293::-;42614:27;;42528:23;42614:27;;;:13;:27;;;;;;;;;42672:15;:29;;;;;;;42614:27;;42416:293::o;35921:187::-;35980:15;35998:44;36007:10;34496:1;36032:9;35998:8;:44::i;:::-;35980:62;;36053:47;36074:15;36092:7;36053:12;:47::i;:::-;35921:187;:::o;42214:145::-;42322:29;;42295:7;42322:29;;;:15;:29;;;;;;;42214:145::o;43184:281::-;43376:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43366:48;;;;;;;;;43323:7;43432:25;;;:16;:25;;;;;43184:281;;;;;:::o;42807:277::-;42997:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42987:48;;;;;;;;;-1:-1:-1;43053:23:0;;;;;;;;;;42807:277::o;41787:132::-;41884:27;;41857:7;41884:27;;;:13;:27;;;;;;;41787:132::o;37584:107::-;37641:42;37648:10;34496:1;37673:9;37641:6;:42::i;:::-;37584:107::o;36811:319::-;36894:41;36902:10;36914:12;36928:6;36894:7;:41::i;:::-;36950:27;;;36946:177;;36994:32;37007:10;37019:6;36994:12;:32::i;:::-;36946:177;;;37059:52;:32;;;37092:10;37104:6;37059:32;:52::i;:::-;36811:319;;:::o;37796:217::-;37883:71;:36;;;37920:10;37940:4;37947:6;37883:36;:71::i;:::-;37965:40;37972:10;37984:12;37998:6;37965;:40::i;43941:498::-;44239:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44229:48;;;;;;;;;44090:19;44302:23;;;;;;;;;;44352:16;:25;;;;;;44406:16;:25;;;;;;;44302:23;;43941:498::o;36416:308::-;36505:71;:36;;;36542:10;36562:4;36569:6;36505:36;:71::i;:::-;36587:15;36605:42;36614:10;36626:12;36640:6;36605:8;:42::i;:::-;36587:60;-1:-1:-1;36658:58:0;:32;;;36691:15;36587:60;36658:32;:58::i;:::-;36416:308;;;:::o;38115:554::-;38232:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38222:41;;;;;38324:54;38352:25;38373:3;;38352:20;:25::i;:::-;38324:14;:23;;;;;;;;;;;;:27;:54::i;:::-;38296:25;;;;:16;:25;;;;;;:82;38274:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38458:14;:23;;;;;;;;;;;;;38434:20;;;;;;;:13;:20;;;;;:47;;;;;;;;;38518:25;;;-1:-1:-1;38518:25:0;;;;;;;38492:22;;;:15;:22;;;;;:51;;;;;;;;;38554:25;;;:29;;;;38594:27;;;;38632:16;:25;;;;;;:29;;;;-1:-1:-1;38115:554:0:o;43566:281::-;43758:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43748:48;;;;;;;;;-1:-1:-1;43814:25:0;;;:16;:25;;;;;;43566:281::o;41612:101::-;41694:11;41612:101;:::o;37253:323::-;37338:43;37348:10;37360:12;37374:6;37338:9;:43::i;41413:123::-;41510:17;41413:123;:::o;38731:671::-;38855:15;38891:11;38883:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38954:33;38982:4;38954:23;:6;38965:11;38954:10;:23::i;:::-;:27;;:33::i;:::-;39028:27;;;;;;;:13;:27;;;;;;38944:43;;-1:-1:-1;39028:52:0;;38944:43;;39028:39;;39060:6;39028:31;:39::i;:::-;:43;;:52::i;:::-;38998:27;;;;;;;;:13;:27;;;;;;;;:82;;;;39119:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39109:43;;;;;;;;;39189:23;;;;;;;;;;;;:48;;39229:7;;39189:35;;39217:6;39189:27;:35::i;:48::-;39163:14;:23;;;;;;;;;;;:74;;;;39276:16;:25;;;;:50;;39318:7;;39276:37;;39306:6;39276:29;:37::i;:50::-;39248:25;;;;:16;:25;;;;;;:78;;;;39337:57;;;;;:27;:57;;;;;;;;;;;;;;;;;;;;;;:17;:27;;;;;;:57;;;;;39248:25;;39337:57;;;;;;39248:25;39337:27;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38731:671;;;;;;:::o;34050:159::-;34135:66;34148:9;34159:6;34135:66;;;;;;;;;;;;;;;;;:12;:66::i;40560:565::-;40712:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40702:43;;;;;40764:11;40756:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40837:25;;;;:16;:25;;;;;;40827:35;;;40819:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40924:29;;;;;;;:15;:29;;;;;;:41;;40958:6;40924:33;:41::i;:::-;40892:29;;;;;;;:15;:29;;;;;;;;:73;;;;41004:25;;;:16;:25;;;;:37;;41034:6;41004:29;:37::i;:::-;40976:25;;;;:16;:25;;;;;;;;:65;;;;41080:16;:25;;;;:37;;41110:6;41080:29;:37::i;:::-;41052:25;;;;:16;:25;;;;;;:65;-1:-1:-1;;;40560:565:0:o;39410:568::-;39563:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39553:43;;;;;39615:11;39607:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39689:25;;;;:16;:25;;;;;;39679:35;;;39671:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39777:29;;;;;;;:15;:29;;;;;;:41;;39811:6;39777:33;:41::i;:::-;39745:29;;;;;;;:15;:29;;;;;;;;:73;;;;39857:25;;;:16;:25;;;;:37;;39887:6;39857:29;:37::i;:::-;39829:25;;;;:16;:25;;;;;;;;:65;;;;39933:16;:25;;;;:37;;39963:6;39933:29;:37::i;28763:177::-;28873:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28896:23;28873:58;;;28846:86;;28866:5;;28846:19;:86::i;28948:205::-;29076:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29099:27;29076:68;;;29049:96;;29069:5;;29049:19;:96::i;:::-;28948:205;;;;:::o;8793:132::-;8851:7;8878:39;8882:1;8885;8878:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8871:46;8793:132;-1:-1:-1;;;8793:132:0:o;7846:471::-;7904:7;8149:6;8145:47;;-1:-1:-1;8179:1:0;8172:8;;8145:47;8216:5;;;8220:1;8216;:5;:1;8240:5;;;;;:10;8232:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39986:566;40141:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40131:43;;;;;40193:11;40185:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40269:25;;;;:16;:25;;;;;;40259:35;;;40251:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40357:27;;;;;;;:13;:27;;;;;;:39;;40389:6;40357:31;:39::i;:::-;40327:27;;;;;;;:13;:27;;;;;;;;:69;;;;40435:25;;;:16;:25;;;;:37;;40465:6;40435:29;:37::i;:::-;40407:25;;;;:16;:25;;;;;;;;:65;;;;40509:23;;;;;:35;;40537:6;40509:27;:35::i;:::-;40483:14;:23;;;;;;;;;;;:61;-1:-1:-1;;;39986:566:0:o;6492:181::-;6550:7;6582:5;;;6606:6;;;;6598:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6956:136;7014:7;7041:43;7045:1;7048;7041:43;;;;;;;;;;;;;;;;;:3;:43::i;33794:248::-;33960:33;;33942:12;;33960:14;;;;33982:6;;33942:12;33960:33;33942:12;33960:33;33982:6;33960:14;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33941:52;;;34012:7;34021:12;34004:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33794:248;;;;:::o;31068:761::-;31492:23;31518:69;31546:4;31518:69;;;;;;;;;;;;;;;;;31526:5;31518:27;;;;:69;;;;;:::i;:::-;31602:17;;31492:95;;-1:-1:-1;31602:21:0;31598:224;;31744:10;31733:30;;;;;;;;;;;;;;;-1:-1:-1;31733:30:0;31725:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9421:278;9507:7;9542:12;9535:5;9527:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9566:9;9582:1;9578;:5;;;;;;;9421:278;-1:-1:-1;;;;;9421:278:0:o;7395:192::-;7481:7;7517:12;7509:6;;;;7501:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7553:5:0;;;7395:192::o;14802:196::-;14905:12;14937:53;14960:6;14968:4;14974:1;14977:12;14937:22;:53::i;:::-;14930:60;14802:196;-1:-1:-1;;;;14802:196:0:o;16179:979::-;16309:12;16342:18;16353:6;16342:10;:18::i;:::-;16334:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16468:12;16482:23;16509:6;:11;;16529:8;16540:4;16509:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16467:78;;;;16560:7;16556:595;;;16591:10;-1:-1:-1;16584:17:0;;-1:-1:-1;16584:17:0;16556:595;16705:17;;:21;16701:439;;16968:10;16962:17;17029:15;17016:10;17012:2;17008:19;17001:44;16916:148;17104:20;;;;;;;;;;;;;;;;;;;;17111:12;;17104:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11687:619;11747:4;12215:20;;12058:66;12255:23;;;;;;:42;;-1:-1:-1;;12282:15:0;;;12247:51;-1:-1:-1;;11687:619:0:o
Swarm Source
ipfs://0918b6a5d0d4c42da0ffd67f1988b04dbb80d6e8e6565436d0b817eb249bf2ee
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.