More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 74 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove_liquidity | 13618348 | 1089 days ago | IN | 0 ETH | 0.01274608 | ||||
Remove_liquidity | 13070977 | 1174 days ago | IN | 0 ETH | 0.00427473 | ||||
Remove_liquidity | 12941581 | 1194 days ago | IN | 0 ETH | 0.00559799 | ||||
Remove_liquidity | 12903048 | 1200 days ago | IN | 0 ETH | 0.00368957 | ||||
Remove_liquidity | 12801075 | 1216 days ago | IN | 0 ETH | 0.00398942 | ||||
Remove_liquidity | 12771751 | 1221 days ago | IN | 0 ETH | 0.00137796 | ||||
Remove_liquidity | 12771619 | 1221 days ago | IN | 0 ETH | 0.00104959 | ||||
Remove_liquidity | 12740050 | 1226 days ago | IN | 0 ETH | 0.00164038 | ||||
Remove_liquidity | 12739641 | 1226 days ago | IN | 0 ETH | 0.00299228 | ||||
Remove_liquidity | 12738729 | 1226 days ago | IN | 0 ETH | 0.00223689 | ||||
Remove_liquidity | 12730041 | 1227 days ago | IN | 0 ETH | 0.00469188 | ||||
Remove_liquidity | 12725178 | 1228 days ago | IN | 0 ETH | 0.00332452 | ||||
Remove_liquidity | 12723849 | 1228 days ago | IN | 0 ETH | 0.00328077 | ||||
Remove_liquidity | 12722779 | 1228 days ago | IN | 0 ETH | 0.00344664 | ||||
Remove_liquidity | 12722734 | 1228 days ago | IN | 0 ETH | 0.00298276 | ||||
Remove_liquidity | 12721051 | 1228 days ago | IN | 0 ETH | 0.00216109 | ||||
Remove_liquidity | 12720911 | 1228 days ago | IN | 0 ETH | 0.00134224 | ||||
Remove_liquidity | 12718163 | 1229 days ago | IN | 0 ETH | 0.00166238 | ||||
Remove_liquidity | 12717325 | 1229 days ago | IN | 0 ETH | 0.00193879 | ||||
Remove_liquidity | 12717104 | 1229 days ago | IN | 0 ETH | 0.00193879 | ||||
Remove_liquidity | 12717097 | 1229 days ago | IN | 0 ETH | 0.00193863 | ||||
Remove_liquidity | 12716841 | 1229 days ago | IN | 0 ETH | 0.00182861 | ||||
Remove_liquidity | 12716759 | 1229 days ago | IN | 0 ETH | 0.00166238 | ||||
Remove_liquidity | 12716723 | 1229 days ago | IN | 0 ETH | 0.00149138 | ||||
Remove_liquidity | 12716705 | 1229 days ago | IN | 0 ETH | 0.00104396 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SaffronERC20StakingPool
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-13 */ // File: contracts/interfaces/ISaffronBase.sol // SPDX-License-Identifier: MIT pragma solidity ^0.7.1; interface ISaffronBase { enum Tranche {S, AA, A} enum LPTokenType {dsec, principal} // Store values (balances, dsec, vdsec) with TrancheUint256 struct TrancheUint256 { uint256 S; uint256 AA; uint256 A; } struct epoch_params { uint256 start_date; // Time when the platform launched uint256 duration; // Duration of epoch } } // File: contracts/interfaces/ISaffronPool.sol pragma solidity ^0.7.1; interface ISaffronPool is ISaffronBase { function add_liquidity(uint256 amount, Tranche tranche) external; function remove_liquidity(address v1_dsec_token_address, uint256 dsec_amount, address v1_principal_token_address, uint256 principal_amount) external; function get_base_asset_address() external view returns(address); function hourly_strategy(address adapter_address) external; function wind_down_epoch(uint256 epoch, uint256 amount_sfi) external; function set_governance(address to) external; function get_epoch_cycle_params() external view returns (uint256, uint256); function shutdown() external; } // File: contracts/lib/SafeMath.sol pragma solidity ^0.7.1; /** * @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/lib/IERC20.sol pragma solidity ^0.7.1; /** * @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: contracts/lib/Context.sol pragma solidity ^0.7.1; /* * @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: contracts/lib/Address.sol pragma solidity ^0.7.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/lib/ERC20.sol pragma solidity ^0.7.1; /** * @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 is 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: contracts/lib/SafeERC20.sol pragma solidity ^0.7.1; /** * @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/SFI.sol pragma solidity ^0.7.1; contract SFI is ERC20 { using SafeERC20 for IERC20; address public governance; address public SFI_minter; uint256 public MAX_TOKENS = 100000 ether; constructor (string memory name, string memory symbol) ERC20(name, symbol) { // Initial governance is Saffron Deployer governance = msg.sender; } function mint_SFI(address to, uint256 amount) public { require(msg.sender == SFI_minter, "must be SFI_minter"); require(this.totalSupply() + amount < MAX_TOKENS, "cannot mint more than MAX_TOKENS"); _mint(to, amount); } function set_minter(address to) external { require(msg.sender == governance, "must be governance"); SFI_minter = to; } function set_governance(address to) external { require(msg.sender == governance, "must be governance"); governance = to; } event ErcSwept(address who, address to, address token, uint256 amount); function erc_sweep(address _token, address _to) public { require(msg.sender == governance, "must be governance"); IERC20 tkn = IERC20(_token); uint256 tBal = tkn.balanceOf(address(this)); tkn.safeTransfer(_to, tBal); emit ErcSwept(msg.sender, _to, _token, tBal); } } // File: contracts/SaffronLPBalanceToken.sol pragma solidity ^0.7.1; contract SaffronLPBalanceToken is ERC20 { address public pool_address; constructor (string memory name, string memory symbol) ERC20(name, symbol) { // Set pool_address to saffron pool that created token pool_address = msg.sender; } // Allow creating new tranche tokens function mint(address to, uint256 amount) public { require(msg.sender == pool_address, "must be pool"); _mint(to, amount); } function burn(address account, uint256 amount) public { require(msg.sender == pool_address, "must be pool"); _burn(account, amount); } function set_governance(address to) external { require(msg.sender == pool_address, "must be pool"); pool_address = to; } } // File: contracts/SaffronERC20StakingPool.sol pragma solidity ^0.7.1; contract SaffronERC20StakingPool is ISaffronPool { using SafeMath for uint256; using SafeERC20 for IERC20; address public governance; // Governance (v3: add off-chain/on-chain governance) address public base_asset_address; // Base asset managed by the pool (DAI, USDT, YFI...) address public SFI_address; // SFI token uint256 public pool_principal; // Current principal balance (added minus removed) bool public _shutdown = false; // v0, v1: shutdown the pool after the final capital deploy to prevent burning funds /**** STRATEGY ****/ address public strategy; /**** EPOCHS ****/ epoch_params public epoch_cycle = epoch_params({ start_date: 1604239200, // 11/01/2020 @ 2:00pm (UTC) duration: 14 days // 1210000 seconds }); mapping(uint256=>bool) public epoch_wound_down; // True if epoch has been wound down already (governance) /**** EPOCH INDEXED STORAGE ****/ uint256[] public epoch_principal; // Total principal owned by the pool (all tranches) uint256[] public total_dsec; // Total dsec (tokens + vdsec) uint256[] public SFI_earned; // Total SFI earned (minted at wind_down_epoch) address[] public dsec_token_addresses; // Address for each dsec token address[] public principal_token_addresses; // Address for each principal token /**** SAFFRON LP TOKENS ****/ // If we just have a token address then we can look up epoch and tranche balance tokens using a mapping(address=>SaffronV1dsecInfo) // LP tokens are dsec (redeemable for interest+SFI) and principal (redeemable for base asset) tokens struct SaffronLPTokenInfo { bool exists; uint256 epoch; LPTokenType token_type; } mapping(address=>SaffronLPTokenInfo) public saffron_LP_token_info; constructor(address _strategy, address _base_asset, address _SFI_address, bool epoch_cycle_reset) { governance = msg.sender; base_asset_address = _base_asset; SFI_address = _SFI_address; strategy = _strategy; epoch_cycle.duration = (epoch_cycle_reset ? 20 minutes : 14 days); // Make testing previous epochs easier epoch_cycle.start_date = (epoch_cycle_reset ? (block.timestamp) - (4 * epoch_cycle.duration) : 1604239200); // Make testing previous epochs easier } function new_epoch(uint256 epoch, address saffron_LP_dsec_token_address, address saffron_LP_principal_token_address) public { require(epoch_principal.length == epoch, "improper new epoch"); require(msg.sender == governance, "must be governance"); epoch_principal.push(0); total_dsec.push(0); SFI_earned.push(0); dsec_token_addresses.push(saffron_LP_dsec_token_address); principal_token_addresses.push(saffron_LP_principal_token_address); // Token info for looking up epoch and tranche of dsec tokens by token contract address saffron_LP_token_info[saffron_LP_dsec_token_address] = SaffronLPTokenInfo({ exists: true, epoch: epoch, token_type: LPTokenType.dsec }); // Token info for looking up epoch and tranche of PRINCIPAL tokens by token contract address saffron_LP_token_info[saffron_LP_principal_token_address] = SaffronLPTokenInfo({ exists: true, epoch: epoch, token_type: LPTokenType.principal }); } event DsecGeneration(uint256 time_remaining, uint256 amount, uint256 dsec, address dsec_address, uint256 epoch, uint256 tranche, address user_address, address principal_token_addr); event AddLiquidity(uint256 new_pool_principal, uint256 new_epoch_principal, uint256 new_total_dsec); // LP user adds liquidity to the pool // Pre-requisite (front-end): have user approve transfer on front-end to base asset using our contract address function add_liquidity(uint256 amount, Tranche tranche) external override { require(!_shutdown, "pool shutdown"); require(tranche == Tranche.S, "ERC20 pool has no tranches"); uint256 epoch = get_current_epoch(); require(amount != 0, "can't add 0"); require(epoch == 16, "v1.16: only epoch 16 only"); // Calculate the dsec for deposited base_asset tokens uint256 dsec = amount.mul(get_seconds_until_epoch_end(epoch)); // Update pool principal eternal and epoch state pool_principal = pool_principal.add(amount); // Add base_asset token amount to pool principal total epoch_principal[epoch] = epoch_principal[epoch].add(amount); // Add base_asset token amount to principal epoch total // Update dsec and principal balance state total_dsec[epoch] = total_dsec[epoch].add(dsec); // Transfer base_asset tokens from LP to pool IERC20(base_asset_address).safeTransferFrom(msg.sender, address(this), amount); // Mint Saffron LP epoch 1 <base_asset_name> dsec tokens and transfer them to sender SaffronLPBalanceToken(dsec_token_addresses[epoch]).mint(msg.sender, dsec); // Mint Saffron LP epoch 1 <base_asset_name> principal tokens and transfer them to sender SaffronLPBalanceToken(principal_token_addresses[epoch]).mint(msg.sender, amount); emit DsecGeneration(get_seconds_until_epoch_end(epoch), amount, dsec, dsec_token_addresses[epoch], epoch, uint256(tranche), msg.sender, principal_token_addresses[epoch]); emit AddLiquidity(pool_principal, epoch_principal[epoch], total_dsec[epoch]); } event WindDownEpochState(uint256 previous_epoch, uint256 SFI_earned, uint256 epoch_dsec); function wind_down_epoch(uint256 epoch, uint256 amount_sfi) public override { require(msg.sender == address(strategy), "must be strategy"); require(!epoch_wound_down[epoch], "epoch already wound down"); uint256 current_epoch = get_current_epoch(); require(epoch < current_epoch, "cannot wind down future epoch"); uint256 previous_epoch = current_epoch - 1; require(block.timestamp >= get_epoch_end(previous_epoch), "can't call before epoch ended"); SFI_earned[epoch] = amount_sfi; // Total dsec uint256 epoch_dsec = total_dsec[epoch]; epoch_wound_down[epoch] = true; emit WindDownEpochState(previous_epoch, SFI_earned[epoch], epoch_dsec); } event RemoveLiquidityDsec(uint256 dsec_percent, uint256 SFI_owned); event RemoveLiquidityPrincipal(uint256 principal); function remove_liquidity(address dsec_token_address, uint256 dsec_amount, address principal_token_address, uint256 principal_amount) external override { require(dsec_amount > 0 || principal_amount > 0, "can't remove 0"); uint256 SFI_owned; uint256 dsec_percent; // Update state for removal via dsec token if (dsec_token_address != address(0x0) && dsec_amount > 0) { // Get info about the v1 dsec token from its address and check that it exists SaffronLPTokenInfo memory token_info = saffron_LP_token_info[dsec_token_address]; require(token_info.exists, "balance token lookup failed"); SaffronLPBalanceToken sbt = SaffronLPBalanceToken(dsec_token_address); require(sbt.balanceOf(msg.sender) >= dsec_amount, "insufficient dsec balance"); // Token epoch must be a past epoch uint256 token_epoch = token_info.epoch; require(token_info.token_type == LPTokenType.dsec, "bad dsec address"); require(token_epoch == 16, "v1.16: bal token epoch must be 16"); require(epoch_wound_down[token_epoch], "can't remove from wound up epoch"); // Dsec gives user claim over a tranche's earned SFI and interest dsec_percent = dsec_amount.mul(1 ether).div(total_dsec[token_epoch]); SFI_owned = SFI_earned[token_epoch].mul(dsec_percent) / 1 ether; SFI_earned[token_epoch] = SFI_earned[token_epoch].sub(SFI_owned); total_dsec[token_epoch] = total_dsec[token_epoch].sub(dsec_amount); } // Update state for removal via principal token if (principal_token_address != address(0x0) && principal_amount > 0) { // Get info about the v1 dsec token from its address and check that it exists SaffronLPTokenInfo memory token_info = saffron_LP_token_info[principal_token_address]; require(token_info.exists, "balance token info lookup failed"); SaffronLPBalanceToken sbt = SaffronLPBalanceToken(principal_token_address); require(sbt.balanceOf(msg.sender) >= principal_amount, "insufficient principal balance"); // Token epoch must be a past epoch uint256 token_epoch = token_info.epoch; require(token_info.token_type == LPTokenType.principal, "bad balance token address"); require(token_epoch == 16, "v1.16: bal token epoch must be 16"); require(epoch_wound_down[token_epoch], "can't remove from wound up epoch"); epoch_principal[token_epoch] = epoch_principal[token_epoch].sub(principal_amount); pool_principal = pool_principal.sub(principal_amount); } // Transfer if (dsec_token_address != address(0x0) && dsec_amount > 0) { SaffronLPBalanceToken sbt = SaffronLPBalanceToken(dsec_token_address); require(sbt.balanceOf(msg.sender) >= dsec_amount, "insufficient dsec balance"); sbt.burn(msg.sender, dsec_amount); IERC20(SFI_address).safeTransfer(msg.sender, SFI_owned); emit RemoveLiquidityDsec(dsec_percent, SFI_owned); } if (principal_token_address != address(0x0) && principal_amount > 0) { SaffronLPBalanceToken sbt = SaffronLPBalanceToken(principal_token_address); require(sbt.balanceOf(msg.sender) >= principal_amount, "insufficient principal balance"); sbt.burn(msg.sender, principal_amount); IERC20(base_asset_address).safeTransfer(msg.sender, principal_amount); emit RemoveLiquidityPrincipal(principal_amount); } require((dsec_token_address != address(0x0) && dsec_amount > 0) || (principal_token_address != address(0x0) && principal_amount > 0), "no action performed"); } function hourly_strategy(address) external pure override { return; } function shutdown() external override { require(msg.sender == strategy || msg.sender == governance, "must be strategy"); require(block.timestamp > get_epoch_end(1) - 1 days, "trying to shutdown too early"); _shutdown = true; } /*** GOVERNANCE ***/ function set_governance(address to) external override { require(msg.sender == governance, "must be governance"); governance = to; } function set_base_asset_address(address to) public { require(msg.sender == governance, "must be governance"); base_asset_address = to; } /*** TIME UTILITY FUNCTIONS ***/ function get_epoch_end(uint256 epoch) public view returns (uint256) { return epoch_cycle.start_date.add(epoch.add(1).mul(epoch_cycle.duration)); } function get_current_epoch() public view returns (uint256) { require(block.timestamp > epoch_cycle.start_date, "before epoch 0"); return (block.timestamp - epoch_cycle.start_date) / epoch_cycle.duration; } function get_seconds_until_epoch_end(uint256 epoch) public view returns (uint256) { return epoch_cycle.start_date.add(epoch.add(1).mul(epoch_cycle.duration)).sub(block.timestamp); } /*** GETTERS ***/ function get_epoch_cycle_params() external view override returns (uint256, uint256) { return (epoch_cycle.start_date, epoch_cycle.duration); } function get_base_asset_address() external view override returns(address) { return base_asset_address; } event ErcSwept(address who, address to, address token, uint256 amount); function erc_sweep(address _token, address _to) public { require(msg.sender == governance, "must be governance"); require(_token != base_asset_address, "cannot sweep pool assets"); IERC20 tkn = IERC20(_token); uint256 tBal = tkn.balanceOf(address(this)); tkn.safeTransfer(_to, tBal); emit ErcSwept(msg.sender, _to, _token, tBal); } function set_strategy(address to) external { require(msg.sender == governance, "must be governance"); strategy = to; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"address","name":"_base_asset","type":"address"},{"internalType":"address","name":"_SFI_address","type":"address"},{"internalType":"bool","name":"epoch_cycle_reset","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"new_pool_principal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"new_epoch_principal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"new_total_dsec","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"time_remaining","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dsec","type":"uint256"},{"indexed":false,"internalType":"address","name":"dsec_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tranche","type":"uint256"},{"indexed":false,"internalType":"address","name":"user_address","type":"address"},{"indexed":false,"internalType":"address","name":"principal_token_addr","type":"address"}],"name":"DsecGeneration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ErcSwept","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dsec_percent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SFI_owned","type":"uint256"}],"name":"RemoveLiquidityDsec","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"principal","type":"uint256"}],"name":"RemoveLiquidityPrincipal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous_epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SFI_earned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epoch_dsec","type":"uint256"}],"name":"WindDownEpochState","type":"event"},{"inputs":[],"name":"SFI_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"SFI_earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_shutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum ISaffronBase.Tranche","name":"tranche","type":"uint8"}],"name":"add_liquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"base_asset_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dsec_token_addresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch_cycle","outputs":[{"internalType":"uint256","name":"start_date","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epoch_principal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epoch_wound_down","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"erc_sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"get_base_asset_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_current_epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_epoch_cycle_params","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"get_epoch_end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"get_seconds_until_epoch_end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hourly_strategy","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"address","name":"saffron_LP_dsec_token_address","type":"address"},{"internalType":"address","name":"saffron_LP_principal_token_address","type":"address"}],"name":"new_epoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pool_principal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"principal_token_addresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dsec_token_address","type":"address"},{"internalType":"uint256","name":"dsec_amount","type":"uint256"},{"internalType":"address","name":"principal_token_address","type":"address"},{"internalType":"uint256","name":"principal_amount","type":"uint256"}],"name":"remove_liquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"saffron_LP_token_info","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"enum ISaffronBase.LPTokenType","name":"token_type","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"set_base_asset_address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"set_governance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"set_strategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"total_dsec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"amount_sfi","type":"uint256"}],"name":"wind_down_epoch","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6004805460ff1916905560c0604052635f9ebf6060808190526212750060a08190526005919091556006553480156200003757600080fd5b5060405162002ffc38038062002ffc833981810160405260808110156200005d57600080fd5b5080516020820151604083015160609093015160008054336001600160a01b0319918216179091556001805482166001600160a01b0380861691909117909155600280549092168187161790915560048054610100600160a81b031916610100928616929092029190911790559192909180620000de5762127500620000e2565b6104b05b62ffffff1660065580620000fb57635f9ebf6062000104565b60065460040242035b60055550505050612ee1806200011b6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806380e0f15f11610104578063c6b483ab116100a2578063ea8e496e11610071578063ea8e496e14610570578063ebd485fc1461058d578063f034c18d146105aa578063fc0e74d1146105b2576101cf565b8063c6b483ab146104d7578063cbc3db5c146104df578063cfbb887114610520578063df4cbfd814610553576101cf565b8063a72b6c30116100de578063a72b6c3014610430578063a8c62e7614610438578063ab1d998814610440578063ae3cbf6c146104a4576101cf565b806380e0f15f146103e8578063837a9bc71461040b578063a684b59914610413576101cf565b806348373cc61161017157806354d0c8a01161014b57806354d0c8a0146103745780635aa6e6751461037c5780635b1caa2f146103845780637d179904146103cb576101cf565b806348373cc6146103085780634c1a42591461032457806351d8ef2314610357576101cf565b80631816f314116101ad5780631816f3141461025e5780632a0ccc881461027f5780632b666fcf146102b05780633916fcef146102eb576101cf565b8063070313fa146101d45780630efb8dbd146102095780630f78dac314610238575b600080fd5b610207600480360360208110156101ea57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166105ba565b005b6102266004803603602081101561021f57600080fd5b5035610687565b60408051918252519081900360200190f35b6102076004803603604081101561024e57600080fd5b508035906020013560ff166106b5565b610266610be0565b6040805192835260208301919091528051918290030190f35b610287610be9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610207600480360360408110156102c657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610c05565b6102266004803603602081101561030157600080fd5b5035610e38565b610310610e59565b604080519115158252519081900360200190f35b6102076004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e62565b6102266004803603602081101561036d57600080fd5b5035610e65565b610287610e75565b610287610e91565b6102076004803603608081101561039a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135169060600135610ead565b610287600480360360208110156103e157600080fd5b5035611c33565b610207600480360360408110156103fe57600080fd5b5080359060200135611c6a565b610226611f5b565b6103106004803603602081101561042957600080fd5b5035611fe3565b610287611ff8565b610287612014565b6104736004803603602081101561045657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612035565b60405180841515815260200183815260200182600181111561049157fe5b8152602001935050505060405180910390f35b610207600480360360208110156104ba57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661205b565b61022661212d565b610207600480360360608110156104f557600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040013516612133565b6102076004803603602081101561053657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612483565b6102266004803603602081101561056957600080fd5b5035612550565b6102876004803603602081101561058657600080fd5b503561257c565b610226600480360360208110156105a357600080fd5b503561258c565b61026661259c565b6102076125a6565b60005473ffffffffffffffffffffffffffffffffffffffff16331461064057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6006546000906106af906106a6906106a08560016126fc565b90612777565b600554906126fc565b92915050565b60045460ff161561072757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f706f6f6c2073687574646f776e00000000000000000000000000000000000000604482015290519081900360640190fd5b600081600281111561073557fe5b146107a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f455243323020706f6f6c20686173206e6f207472616e63686573000000000000604482015290519081900360640190fd5b60006107ab611f5b565b90508261081957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f63616e2774206164642030000000000000000000000000000000000000000000604482015290519081900360640190fd5b8060101461088857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f76312e31363a206f6e6c792065706f6368203136206f6e6c7900000000000000604482015290519081900360640190fd5b600061089d61089683612550565b8590612777565b6003549091506108ad90856126fc565b6003819055506108dd84600884815481106108c457fe5b90600052602060002001546126fc90919063ffffffff16565b600883815481106108ea57fe5b906000526020600020018190555061090981600984815481106108c457fe5b6009838154811061091657fe5b6000918252602090912001556001546109479073ffffffffffffffffffffffffffffffffffffffff163330876127ea565b600b828154811061095457fe5b6000918252602082200154604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101859052905173ffffffffffffffffffffffffffffffffffffffff909216926340c10f199260448084019382900301818387803b1580156109cf57600080fd5b505af11580156109e3573d6000803e3d6000fd5b50505050600c82815481106109f457fe5b6000918252602082200154604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101889052905173ffffffffffffffffffffffffffffffffffffffff909216926340c10f199260448084019382900301818387803b158015610a6f57600080fd5b505af1158015610a83573d6000803e3d6000fd5b505050507fc7d2d1a5a726dc6005e76316c12eb5ee642296cc38c1b996651599995a480f3c610ab183612550565b8583600b8681548110610ac057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1686886002811115610aef57fe5b33600c8a81548110610afd57fe5b6000918252602091829020015460408051998a52918901979097528781019590955273ffffffffffffffffffffffffffffffffffffffff9384166060880152608087019290925260a0860152811660c085015290911660e083015251908190036101000190a17ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2460035460088481548110610b9457fe5b906000526020600020015460098581548110610bac57fe5b906000526020600020015460405180848152602001838152602001828152602001935050505060405180910390a150505050565b60055460065482565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b60015473ffffffffffffffffffffffffffffffffffffffff83811691161415610d1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616e6e6f7420737765657020706f6f6c206173736574730000000000000000604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051839160009173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610d8657600080fd5b505afa158015610d9a573d6000803e3d6000fd5b505050506040513d6020811015610db057600080fd5b50519050610dd573ffffffffffffffffffffffffffffffffffffffff83168483612885565b6040805133815273ffffffffffffffffffffffffffffffffffffffff80861660208301528616818301526060810183905290517f2c4e64c7c0957a81c0076a0a3f3c7d9f0a5d6158292071c794436f829d12cfb79181900360800190a150505050565b600a8181548110610e4857600080fd5b600091825260209091200154905081565b60045460ff1681565b50565b60098181548110610e4857600080fd5b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000831180610ebc5750600081115b610f2757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f63616e27742072656d6f76652030000000000000000000000000000000000000604482015290519081900360640190fd5b60008073ffffffffffffffffffffffffffffffffffffffff861615801590610f4f5750600085115b1561138457610f5c612dfb565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600d60209081526040918290208251606081018452815460ff908116151582526001808401549483019490945260028301549194929392850192911690811115610fbe57fe5b6001811115610fc957fe5b905250805190915061103c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f62616c616e636520746f6b656e206c6f6f6b7570206661696c65640000000000604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518891889173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156110ac57600080fd5b505afa1580156110c0573d6000803e3d6000fd5b505050506040513d60208110156110d657600080fd5b5051101561114557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e73756666696369656e7420647365632062616c616e636500000000000000604482015290519081900360640190fd5b602082015160008360400151600181111561115c57fe5b146111c857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6261642064736563206164647265737300000000000000000000000000000000604482015290519081900360640190fd5b80601014611221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e1a6021913960400191505060405180910390fd5b60008181526007602052604090205460ff1661129e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e27742072656d6f76652066726f6d20776f756e642075702065706f6368604482015290519081900360640190fd5b6112d2600982815481106112ae57fe5b6000918252602090912001546112cc8a670de0b6b3a7640000612777565b90612917565b9350670de0b6b3a764000061130785600a84815481106112ee57fe5b906000526020600020015461277790919063ffffffff16565b8161130e57fe5b04945061133b85600a838154811061132257fe5b906000526020600020015461295990919063ffffffff16565b600a828154811061134857fe5b9060005260206000200181905550611367886009838154811061132257fe5b6009828154811061137457fe5b6000918252602090912001555050505b73ffffffffffffffffffffffffffffffffffffffff8416158015906113a95750600083115b15611736576113b6612dfb565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600d60209081526040918290208251606081018452815460ff90811615158252600180840154948301949094526002830154919492939285019291169081111561141857fe5b600181111561142357fe5b905250805190915061149657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f62616c616e636520746f6b656e20696e666f206c6f6f6b7570206661696c6564604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518691869173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d602081101561153057600080fd5b5051101561159f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e74207072696e636970616c2062616c616e63650000604482015290519081900360640190fd5b60208201516001836040015160018111156115b657fe5b1461162257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6261642062616c616e636520746f6b656e206164647265737300000000000000604482015290519081900360640190fd5b8060101461167b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e1a6021913960400191505060405180910390fd5b60008181526007602052604090205460ff166116f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e27742072656d6f76652066726f6d20776f756e642075702065706f6368604482015290519081900360640190fd5b611709866008838154811061132257fe5b6008828154811061171657fe5b60009182526020909120015560035461172f9087612959565b6003555050505b73ffffffffffffffffffffffffffffffffffffffff86161580159061175b5750600085115b1561195757604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518791879173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156117d057600080fd5b505afa1580156117e4573d6000803e3d6000fd5b505050506040513d60208110156117fa57600080fd5b5051101561186957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e73756666696369656e7420647365632062616c616e636500000000000000604482015290519081900360640190fd5b604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101889052905173ffffffffffffffffffffffffffffffffffffffff831691639dc29fac91604480830192600092919082900301818387803b1580156118dd57600080fd5b505af11580156118f1573d6000803e3d6000fd5b505060025461191a925073ffffffffffffffffffffffffffffffffffffffff1690503385612885565b604080518381526020810185905281517fb2e2b56b9ff35de42645cc5d65cfda86ee12c931be57378ea82eecaf8a33acc2929181900390910190a1505b73ffffffffffffffffffffffffffffffffffffffff84161580159061197c5750600083115b15611b7057604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518591859173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156119f157600080fd5b505afa158015611a05573d6000803e3d6000fd5b505050506040513d6020811015611a1b57600080fd5b50511015611a8a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e74207072696e636970616c2062616c616e63650000604482015290519081900360640190fd5b604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101869052905173ffffffffffffffffffffffffffffffffffffffff831691639dc29fac91604480830192600092919082900301818387803b158015611afe57600080fd5b505af1158015611b12573d6000803e3d6000fd5b5050600154611b3b925073ffffffffffffffffffffffffffffffffffffffff1690503386612885565b6040805185815290517ffbcc912eee8a56d51e3708fe32ba15f4191e6f92b2ccae4f00bbb544dba49f029181900360200190a1505b73ffffffffffffffffffffffffffffffffffffffff861615801590611b955750600085115b80611bc0575073ffffffffffffffffffffffffffffffffffffffff841615801590611bc05750600083115b611c2b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6e6f20616374696f6e20706572666f726d656400000000000000000000000000604482015290519081900360640190fd5b505050505050565b600c8181548110611c4357600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600454610100900473ffffffffffffffffffffffffffffffffffffffff163314611cf557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d75737420626520737472617465677900000000000000000000000000000000604482015290519081900360640190fd5b60008281526007602052604090205460ff1615611d7357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f65706f636820616c726561647920776f756e6420646f776e0000000000000000604482015290519081900360640190fd5b6000611d7d611f5b565b9050808310611ded57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f63616e6e6f742077696e6420646f776e206675747572652065706f6368000000604482015290519081900360640190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101611e1981610687565b421015611e8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f63616e27742063616c6c206265666f72652065706f636820656e646564000000604482015290519081900360640190fd5b82600a8581548110611e9557fe5b9060005260206000200181905550600060098581548110611eb257fe5b60009182526020808320909101548783526007909152604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600a80549192507fc220302e61ba656c610229ccf230eeecf82a2f57f432ab9dc62396d90f0527b69184919088908110611f2c57fe5b600091825260209182902001546040805193845291830152818101849052519081900360600190a15050505050565b6005546000904211611fce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6265666f72652065706f63682030000000000000000000000000000000000000604482015290519081900360640190fd5b600654600554420381611fdd57fe5b04905090565b60076020526000908152604090205460ff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600454610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020526000908152604090208054600182015460029092015460ff91821692911683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b6004805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b60035481565b60085483146121a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696d70726f706572206e65772065706f63680000000000000000000000000000604482015290519081900360640190fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461222957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b60088054600180820190925560007ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3909101819055600980548084019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01819055600a80548084019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801819055600b80548084019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600c80548087019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701805491871691909216179055604080516060810182528481526020808201898152828401868152948652600d90915291909320835181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821617825591518186015591516002830180549495939491939092919091169083818111156123de57fe5b021790555050604080516060810182526001808252602080830188815283850183815273ffffffffffffffffffffffffffffffffffffffff88166000908152600d90935294909120835181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00918216178255915181840155935160028501805494965090939092911690838181111561247757fe5b02179055505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461250957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006106af426125766106a66005600101546106a06001886126fc90919063ffffffff16565b90612959565b600b8181548110611c4357600080fd5b60088181548110610e4857600080fd5b6005546006549091565b600454610100900473ffffffffffffffffffffffffffffffffffffffff163314806125e8575060005473ffffffffffffffffffffffffffffffffffffffff1633145b61265357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d75737420626520737472617465677900000000000000000000000000000000604482015290519081900360640190fd5b620151806126616001610687565b0342116126cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f747279696e6720746f2073687574646f776e20746f6f206561726c7900000000604482015290519081900360640190fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008282018381101561277057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082612786575060006106af565b8282028284828161279357fe5b0414612770576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e616021913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261287f90859061299b565b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261291290849061299b565b505050565b600061277083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a73565b600061277083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b2f565b60606129fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ba39092919063ffffffff16565b80519091501561291257808060200190516020811015612a1c57600080fd5b5051612912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612e82602a913960400191505060405180910390fd5b60008183612b19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ade578181015183820152602001612ac6565b50505050905090810190601f168015612b0b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612b2557fe5b0495945050505050565b60008184841115612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612ade578181015183820152602001612ac6565b505050900390565b6060612bb28484600085612bba565b949350505050565b606082471015612c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612e3b6026913960400191505060405180910390fd5b612c1e85612d75565b612c8957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612cf357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612cb6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612d55576040519150601f19603f3d011682016040523d82523d6000602084013e612d5a565b606091505b5091509150612d6a828286612d7b565b979650505050505050565b3b151590565b60608315612d8a575081612770565b825115612d9a5782518084602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152845160248401528451859391928392604401919085019080838360008315612ade578181015183820152602001612ac6565b6040805160608101825260008082526020820181905290918201529056fe76312e31363a2062616c20746f6b656e2065706f6368206d757374206265203136416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ad6c0f349174c52afe054e86d767d07943b8c271daedf57b8474de043e4e72ee64736f6c6343000704003300000000000000000000000080687587483bca19927f7ccefb408c53c32dd162000000000000000000000000c76225124f3caab07f609b1d147a31de43926cd6000000000000000000000000b753428af26e81097e7fd17f40c88aaa3e04902c0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806380e0f15f11610104578063c6b483ab116100a2578063ea8e496e11610071578063ea8e496e14610570578063ebd485fc1461058d578063f034c18d146105aa578063fc0e74d1146105b2576101cf565b8063c6b483ab146104d7578063cbc3db5c146104df578063cfbb887114610520578063df4cbfd814610553576101cf565b8063a72b6c30116100de578063a72b6c3014610430578063a8c62e7614610438578063ab1d998814610440578063ae3cbf6c146104a4576101cf565b806380e0f15f146103e8578063837a9bc71461040b578063a684b59914610413576101cf565b806348373cc61161017157806354d0c8a01161014b57806354d0c8a0146103745780635aa6e6751461037c5780635b1caa2f146103845780637d179904146103cb576101cf565b806348373cc6146103085780634c1a42591461032457806351d8ef2314610357576101cf565b80631816f314116101ad5780631816f3141461025e5780632a0ccc881461027f5780632b666fcf146102b05780633916fcef146102eb576101cf565b8063070313fa146101d45780630efb8dbd146102095780630f78dac314610238575b600080fd5b610207600480360360208110156101ea57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166105ba565b005b6102266004803603602081101561021f57600080fd5b5035610687565b60408051918252519081900360200190f35b6102076004803603604081101561024e57600080fd5b508035906020013560ff166106b5565b610266610be0565b6040805192835260208301919091528051918290030190f35b610287610be9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610207600480360360408110156102c657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610c05565b6102266004803603602081101561030157600080fd5b5035610e38565b610310610e59565b604080519115158252519081900360200190f35b6102076004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e62565b6102266004803603602081101561036d57600080fd5b5035610e65565b610287610e75565b610287610e91565b6102076004803603608081101561039a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135169060600135610ead565b610287600480360360208110156103e157600080fd5b5035611c33565b610207600480360360408110156103fe57600080fd5b5080359060200135611c6a565b610226611f5b565b6103106004803603602081101561042957600080fd5b5035611fe3565b610287611ff8565b610287612014565b6104736004803603602081101561045657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612035565b60405180841515815260200183815260200182600181111561049157fe5b8152602001935050505060405180910390f35b610207600480360360208110156104ba57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661205b565b61022661212d565b610207600480360360608110156104f557600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040013516612133565b6102076004803603602081101561053657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612483565b6102266004803603602081101561056957600080fd5b5035612550565b6102876004803603602081101561058657600080fd5b503561257c565b610226600480360360208110156105a357600080fd5b503561258c565b61026661259c565b6102076125a6565b60005473ffffffffffffffffffffffffffffffffffffffff16331461064057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6006546000906106af906106a6906106a08560016126fc565b90612777565b600554906126fc565b92915050565b60045460ff161561072757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f706f6f6c2073687574646f776e00000000000000000000000000000000000000604482015290519081900360640190fd5b600081600281111561073557fe5b146107a157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f455243323020706f6f6c20686173206e6f207472616e63686573000000000000604482015290519081900360640190fd5b60006107ab611f5b565b90508261081957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f63616e2774206164642030000000000000000000000000000000000000000000604482015290519081900360640190fd5b8060101461088857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f76312e31363a206f6e6c792065706f6368203136206f6e6c7900000000000000604482015290519081900360640190fd5b600061089d61089683612550565b8590612777565b6003549091506108ad90856126fc565b6003819055506108dd84600884815481106108c457fe5b90600052602060002001546126fc90919063ffffffff16565b600883815481106108ea57fe5b906000526020600020018190555061090981600984815481106108c457fe5b6009838154811061091657fe5b6000918252602090912001556001546109479073ffffffffffffffffffffffffffffffffffffffff163330876127ea565b600b828154811061095457fe5b6000918252602082200154604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101859052905173ffffffffffffffffffffffffffffffffffffffff909216926340c10f199260448084019382900301818387803b1580156109cf57600080fd5b505af11580156109e3573d6000803e3d6000fd5b50505050600c82815481106109f457fe5b6000918252602082200154604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101889052905173ffffffffffffffffffffffffffffffffffffffff909216926340c10f199260448084019382900301818387803b158015610a6f57600080fd5b505af1158015610a83573d6000803e3d6000fd5b505050507fc7d2d1a5a726dc6005e76316c12eb5ee642296cc38c1b996651599995a480f3c610ab183612550565b8583600b8681548110610ac057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1686886002811115610aef57fe5b33600c8a81548110610afd57fe5b6000918252602091829020015460408051998a52918901979097528781019590955273ffffffffffffffffffffffffffffffffffffffff9384166060880152608087019290925260a0860152811660c085015290911660e083015251908190036101000190a17ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2460035460088481548110610b9457fe5b906000526020600020015460098581548110610bac57fe5b906000526020600020015460405180848152602001838152602001828152602001935050505060405180910390a150505050565b60055460065482565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b60015473ffffffffffffffffffffffffffffffffffffffff83811691161415610d1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616e6e6f7420737765657020706f6f6c206173736574730000000000000000604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051839160009173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610d8657600080fd5b505afa158015610d9a573d6000803e3d6000fd5b505050506040513d6020811015610db057600080fd5b50519050610dd573ffffffffffffffffffffffffffffffffffffffff83168483612885565b6040805133815273ffffffffffffffffffffffffffffffffffffffff80861660208301528616818301526060810183905290517f2c4e64c7c0957a81c0076a0a3f3c7d9f0a5d6158292071c794436f829d12cfb79181900360800190a150505050565b600a8181548110610e4857600080fd5b600091825260209091200154905081565b60045460ff1681565b50565b60098181548110610e4857600080fd5b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000831180610ebc5750600081115b610f2757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f63616e27742072656d6f76652030000000000000000000000000000000000000604482015290519081900360640190fd5b60008073ffffffffffffffffffffffffffffffffffffffff861615801590610f4f5750600085115b1561138457610f5c612dfb565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600d60209081526040918290208251606081018452815460ff908116151582526001808401549483019490945260028301549194929392850192911690811115610fbe57fe5b6001811115610fc957fe5b905250805190915061103c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f62616c616e636520746f6b656e206c6f6f6b7570206661696c65640000000000604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518891889173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156110ac57600080fd5b505afa1580156110c0573d6000803e3d6000fd5b505050506040513d60208110156110d657600080fd5b5051101561114557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e73756666696369656e7420647365632062616c616e636500000000000000604482015290519081900360640190fd5b602082015160008360400151600181111561115c57fe5b146111c857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6261642064736563206164647265737300000000000000000000000000000000604482015290519081900360640190fd5b80601014611221576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e1a6021913960400191505060405180910390fd5b60008181526007602052604090205460ff1661129e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e27742072656d6f76652066726f6d20776f756e642075702065706f6368604482015290519081900360640190fd5b6112d2600982815481106112ae57fe5b6000918252602090912001546112cc8a670de0b6b3a7640000612777565b90612917565b9350670de0b6b3a764000061130785600a84815481106112ee57fe5b906000526020600020015461277790919063ffffffff16565b8161130e57fe5b04945061133b85600a838154811061132257fe5b906000526020600020015461295990919063ffffffff16565b600a828154811061134857fe5b9060005260206000200181905550611367886009838154811061132257fe5b6009828154811061137457fe5b6000918252602090912001555050505b73ffffffffffffffffffffffffffffffffffffffff8416158015906113a95750600083115b15611736576113b6612dfb565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600d60209081526040918290208251606081018452815460ff90811615158252600180840154948301949094526002830154919492939285019291169081111561141857fe5b600181111561142357fe5b905250805190915061149657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f62616c616e636520746f6b656e20696e666f206c6f6f6b7570206661696c6564604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518691869173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d602081101561153057600080fd5b5051101561159f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e74207072696e636970616c2062616c616e63650000604482015290519081900360640190fd5b60208201516001836040015160018111156115b657fe5b1461162257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6261642062616c616e636520746f6b656e206164647265737300000000000000604482015290519081900360640190fd5b8060101461167b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e1a6021913960400191505060405180910390fd5b60008181526007602052604090205460ff166116f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e27742072656d6f76652066726f6d20776f756e642075702065706f6368604482015290519081900360640190fd5b611709866008838154811061132257fe5b6008828154811061171657fe5b60009182526020909120015560035461172f9087612959565b6003555050505b73ffffffffffffffffffffffffffffffffffffffff86161580159061175b5750600085115b1561195757604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518791879173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156117d057600080fd5b505afa1580156117e4573d6000803e3d6000fd5b505050506040513d60208110156117fa57600080fd5b5051101561186957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e73756666696369656e7420647365632062616c616e636500000000000000604482015290519081900360640190fd5b604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101889052905173ffffffffffffffffffffffffffffffffffffffff831691639dc29fac91604480830192600092919082900301818387803b1580156118dd57600080fd5b505af11580156118f1573d6000803e3d6000fd5b505060025461191a925073ffffffffffffffffffffffffffffffffffffffff1690503385612885565b604080518381526020810185905281517fb2e2b56b9ff35de42645cc5d65cfda86ee12c931be57378ea82eecaf8a33acc2929181900390910190a1505b73ffffffffffffffffffffffffffffffffffffffff84161580159061197c5750600083115b15611b7057604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518591859173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156119f157600080fd5b505afa158015611a05573d6000803e3d6000fd5b505050506040513d6020811015611a1b57600080fd5b50511015611a8a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e74207072696e636970616c2062616c616e63650000604482015290519081900360640190fd5b604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101869052905173ffffffffffffffffffffffffffffffffffffffff831691639dc29fac91604480830192600092919082900301818387803b158015611afe57600080fd5b505af1158015611b12573d6000803e3d6000fd5b5050600154611b3b925073ffffffffffffffffffffffffffffffffffffffff1690503386612885565b6040805185815290517ffbcc912eee8a56d51e3708fe32ba15f4191e6f92b2ccae4f00bbb544dba49f029181900360200190a1505b73ffffffffffffffffffffffffffffffffffffffff861615801590611b955750600085115b80611bc0575073ffffffffffffffffffffffffffffffffffffffff841615801590611bc05750600083115b611c2b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6e6f20616374696f6e20706572666f726d656400000000000000000000000000604482015290519081900360640190fd5b505050505050565b600c8181548110611c4357600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600454610100900473ffffffffffffffffffffffffffffffffffffffff163314611cf557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d75737420626520737472617465677900000000000000000000000000000000604482015290519081900360640190fd5b60008281526007602052604090205460ff1615611d7357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f65706f636820616c726561647920776f756e6420646f776e0000000000000000604482015290519081900360640190fd5b6000611d7d611f5b565b9050808310611ded57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f63616e6e6f742077696e6420646f776e206675747572652065706f6368000000604482015290519081900360640190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101611e1981610687565b421015611e8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f63616e27742063616c6c206265666f72652065706f636820656e646564000000604482015290519081900360640190fd5b82600a8581548110611e9557fe5b9060005260206000200181905550600060098581548110611eb257fe5b60009182526020808320909101548783526007909152604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600a80549192507fc220302e61ba656c610229ccf230eeecf82a2f57f432ab9dc62396d90f0527b69184919088908110611f2c57fe5b600091825260209182902001546040805193845291830152818101849052519081900360600190a15050505050565b6005546000904211611fce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6265666f72652065706f63682030000000000000000000000000000000000000604482015290519081900360640190fd5b600654600554420381611fdd57fe5b04905090565b60076020526000908152604090205460ff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600454610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020526000908152604090208054600182015460029092015460ff91821692911683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b6004805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b60035481565b60085483146121a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696d70726f706572206e65772065706f63680000000000000000000000000000604482015290519081900360640190fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461222957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b60088054600180820190925560007ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3909101819055600980548084019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01819055600a80548084019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801819055600b80548084019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600c80548087019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701805491871691909216179055604080516060810182528481526020808201898152828401868152948652600d90915291909320835181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821617825591518186015591516002830180549495939491939092919091169083818111156123de57fe5b021790555050604080516060810182526001808252602080830188815283850183815273ffffffffffffffffffffffffffffffffffffffff88166000908152600d90935294909120835181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00918216178255915181840155935160028501805494965090939092911690838181111561247757fe5b02179055505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461250957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006106af426125766106a66005600101546106a06001886126fc90919063ffffffff16565b90612959565b600b8181548110611c4357600080fd5b60088181548110610e4857600080fd5b6005546006549091565b600454610100900473ffffffffffffffffffffffffffffffffffffffff163314806125e8575060005473ffffffffffffffffffffffffffffffffffffffff1633145b61265357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d75737420626520737472617465677900000000000000000000000000000000604482015290519081900360640190fd5b620151806126616001610687565b0342116126cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f747279696e6720746f2073687574646f776e20746f6f206561726c7900000000604482015290519081900360640190fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008282018381101561277057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082612786575060006106af565b8282028284828161279357fe5b0414612770576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e616021913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261287f90859061299b565b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261291290849061299b565b505050565b600061277083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a73565b600061277083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b2f565b60606129fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ba39092919063ffffffff16565b80519091501561291257808060200190516020811015612a1c57600080fd5b5051612912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612e82602a913960400191505060405180910390fd5b60008183612b19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ade578181015183820152602001612ac6565b50505050905090810190601f168015612b0b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612b2557fe5b0495945050505050565b60008184841115612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612ade578181015183820152602001612ac6565b505050900390565b6060612bb28484600085612bba565b949350505050565b606082471015612c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612e3b6026913960400191505060405180910390fd5b612c1e85612d75565b612c8957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612cf357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612cb6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612d55576040519150601f19603f3d011682016040523d82523d6000602084013e612d5a565b606091505b5091509150612d6a828286612d7b565b979650505050505050565b3b151590565b60608315612d8a575081612770565b825115612d9a5782518084602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152845160248401528451859391928392604401919085019080838360008315612ade578181015183820152602001612ac6565b6040805160608101825260008082526020820181905290918201529056fe76312e31363a2062616c20746f6b656e2065706f6368206d757374206265203136416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ad6c0f349174c52afe054e86d767d07943b8c271daedf57b8474de043e4e72ee64736f6c63430007040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000080687587483bca19927f7ccefb408c53c32dd162000000000000000000000000c76225124f3caab07f609b1d147a31de43926cd6000000000000000000000000b753428af26e81097e7fd17f40c88aaa3e04902c0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _strategy (address): 0x80687587483BcA19927f7CCefb408c53c32dd162
Arg [1] : _base_asset (address): 0xC76225124F3CaAb07f609b1D147a31de43926cd6
Arg [2] : _SFI_address (address): 0xb753428af26E81097e7fD17f40c88aaA3E04902c
Arg [3] : epoch_cycle_reset (bool): False
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000080687587483bca19927f7ccefb408c53c32dd162
Arg [1] : 000000000000000000000000c76225124f3caab07f609b1d147a31de43926cd6
Arg [2] : 000000000000000000000000b753428af26e81097e7fd17f40c88aaa3e04902c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
35076:12156:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45434:144;;;;;;;;;;;;;;;;-1:-1:-1;45434:144:0;;;;:::i;:::-;;45775:154;;;;;;;;;;;;;;;;-1:-1:-1;45775:154:0;;:::i;:::-;;;;;;;;;;;;;;;;38919:1617;;;;;;;;;;;;;;;;-1:-1:-1;38919:1617:0;;;;;;;;;:::i;35731:164::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35382:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46724:368;;;;;;;;;;;;;;;;-1:-1:-1;46724:368:0;;;;;;;;;;;:::i;36227:27::-;;;;;;;;;;;;;;;;-1:-1:-1;36227:27:0;;:::i;35528:29::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;45078:76;;;;;;;;;;;;;;;;-1:-1:-1;45078:76:0;;;;:::i;36149:27::-;;;;;;;;;;;;;;;;-1:-1:-1;36149:27:0;;:::i;35288:33::-;;;:::i;35194:25::-;;;:::i;41472:3600::-;;;;;;;;;;;;;;;;-1:-1:-1;41472:3600:0;;;;;;;;;;;;;;;;;;;;;:::i;36400:42::-;;;;;;;;;;;;;;;;-1:-1:-1;36400:42:0;;:::i;40637:704::-;;;;;;;;;;;;;;;;-1:-1:-1;40637:704:0;;;;;;;:::i;45935:218::-;;;:::i;35902:46::-;;;;;;;;;;;;;;;;-1:-1:-1;35902:46:0;;:::i;46531:112::-;;;:::i;35679:23::-;;;:::i;36873:65::-;;;;;;;;;;;;;;;;-1:-1:-1;36873:65:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47098:131;;;;;;;;;;;;;;;;-1:-1:-1;47098:131:0;;;;:::i;35435:29::-;;;:::i;37447:1022::-;;;;;;;;;;;;;;;;-1:-1:-1;37447:1022:0;;;;;;;;;;;;;;;;:::i;45584:149::-;;;;;;;;;;;;;;;;-1:-1:-1;45584:149:0;;;;:::i;46159:189::-;;;;;;;;;;;;;;;;-1:-1:-1;46159:189:0;;:::i;36322:37::-;;;;;;;;;;;;;;;;-1:-1:-1;36322:37:0;;:::i;36050:32::-;;;;;;;;;;;;;;;;-1:-1:-1;36050:32:0;;:::i;46375:150::-;;;:::i;45160:244::-;;;:::i;45434:144::-;45517:10;;;;45503;:24;45495:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45557:10;:15;;;;;;;;;;;;;;;45434:144::o;45775:154::-;45901:20;;45834:7;;45857:66;;45884:38;;:12;:5;45901:20;45884:9;:12::i;:::-;:16;;:38::i;:::-;45857:11;:22;;:26;:66::i;:::-;45850:73;45775:154;-1:-1:-1;;45775:154:0:o;38919:1617::-;39009:9;;;;39008:10;39000:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39062:9;39051:7;:20;;;;;;;;;39043:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39109:13;39125:19;:17;:19::i;:::-;39109:35;-1:-1:-1;39159:11:0;39151:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39201:5;39210:2;39201:11;39193:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39310:12;39325:46;39336:34;39364:5;39336:27;:34::i;:::-;39325:6;;:10;:46::i;:::-;39451:14;;39310:61;;-1:-1:-1;39451:26:0;;39470:6;39451:18;:26::i;:::-;39434:14;:43;;;;39581:34;39608:6;39581:15;39597:5;39581:22;;;;;;;;;;;;;;;;:26;;:34;;;;:::i;:::-;39556:15;39572:5;39556:22;;;;;;;;;;;;;;;:59;;;;39748:27;39770:4;39748:10;39759:5;39748:17;;;;;;;:27;39728:10;39739:5;39728:17;;;;;;;;;;;;;;;;;:47;39842:18;;39835:78;;39842:18;;39879:10;39899:4;39906:6;39835:43;:78::i;:::-;40034:20;40055:5;40034:27;;;;;;;;;;;;;;;;;40012:73;;;;;;40068:10;40012:73;;;;;;;;;;;;40034:27;;;;;40012:55;;:73;;;;;;;;;;40034:27;;40012:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40211:25;40237:5;40211:32;;;;;;;;;;;;;;;;;40189:80;;;;;;40250:10;40189:80;;;;;;;;;;;;40211:32;;;;;40189:60;;:80;;;;;;;;;;40211:32;;40189:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40283:164;40298:34;40326:5;40298:27;:34::i;:::-;40334:6;40342:4;40348:20;40369:5;40348:27;;;;;;;;;;;;;;;;;;;;40377:5;40392:7;40384:16;;;;;;;;40402:10;40414:25;40440:5;40414:32;;;;;;;;;;;;;;;;;;;40283:164;;;;;;;;;;;;;;;;;;;;40414:32;40283:164;;;;;;;;;;;;;;;;;;;;;;;;40414:32;;;40283:164;;;;;;;;;40414:32;40283:164;;;40459:71;40472:14;;40488:15;40504:5;40488:22;;;;;;;;;;;;;;;;40512:10;40523:5;40512:17;;;;;;;;;;;;;;;;40459:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38919:1617;;;;:::o;35731:164::-;;;;;;:::o;35382:26::-;;;;;;:::o;46724:368::-;46808:10;;;;46794;:24;46786:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46866:18;;;46856:28;;;46866:18;;46856:28;;46848:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46971:28;;;;;;46993:4;46971:28;;;;;;46942:6;;46922:10;;46971:13;;;;;;:28;;;;;;;;;;;;;;:13;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46971:28:0;;-1:-1:-1;47006:27:0;:16;;;47023:3;46971:28;47006:16;:27::i;:::-;47047:39;;;47056:10;47047:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46724:368;;;;:::o;36227:27::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36227:27:0;:::o;35528:29::-;;;;;;:::o;45078:76::-;;:::o;36149:27::-;;;;;;;;;;;;35288:33;;;;;;:::o;35194:25::-;;;;;;:::o;41472:3600::-;41653:1;41639:11;:15;:39;;;;41677:1;41658:16;:20;41639:39;41631:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41704:17;;41809:34;;;;;;;:53;;;41861:1;41847:11;:15;41809:53;41805:1170;;;41958:36;;:::i;:::-;41997:41;;;;;;;:21;:41;;;;;;;;;41958:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41997:41;;41958:80;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42055:17:0;;41958:80;;-1:-1:-1;42047:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42199:25;;;;;;42213:10;42199:25;;;;;;42163:18;;42228:11;;42199:13;;;;;;:25;;;;;;;;;;;;;;:13;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42199:25:0;:40;;42191:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42345:16;;;;42323:19;42378:10;:21;;;:41;;;;;;;;;42370:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42457:11;42472:2;42457:17;42449:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42529:29;;;;:16;:29;;;;;;;;42521:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42694:53;42723:10;42734:11;42723:23;;;;;;;;;;;;;;;;;;42694:24;:11;42710:7;42694:15;:24::i;:::-;:28;;:53::i;:::-;42679:68;;42812:7;42768:41;42796:12;42768:10;42779:11;42768:23;;;;;;;;;;;;;;;;:27;;:41;;;;:::i;:::-;:51;;;;;;42756:63;;42854:38;42882:9;42854:10;42865:11;42854:23;;;;;;;;;;;;;;;;:27;;:38;;;;:::i;:::-;42828:10;42839:11;42828:23;;;;;;;;;;;;;;;:64;;;;42927:40;42955:11;42927:10;42938:11;42927:23;;;;;;;:40;42901:10;42912:11;42901:23;;;;;;;;;;;;;;;;;:66;-1:-1:-1;;;41805:1170:0;43040:39;;;;;;;:63;;;43102:1;43083:16;:20;43040:63;43036:1001;;;43199:36;;:::i;:::-;43238:46;;;;;;;:21;:46;;;;;;;;;43199:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43238:46;;43199:85;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43301:17:0;;43199:85;;-1:-1:-1;43293:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43455:25;;;;;;43469:10;43455:25;;;;;;43414:23;;43484:16;;43455:13;;;;;;:25;;;;;;;;;;;;;;:13;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43455:25:0;:45;;43447:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43611:16;;;;43669:21;43644:10;:21;;;:46;;;;;;;;;43636:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43737:11;43752:2;43737:17;43729:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43809:29;;;;:16;:29;;;;;;;;43801:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43917:50;43950:16;43917:15;43933:11;43917:28;;;;;;;:50;43886:15;43902:11;43886:28;;;;;;;;;;;;;;;;;:81;43993:14;;:36;;44012:16;43993:18;:36::i;:::-;43976:14;:53;-1:-1:-1;;;43036:1001:0;44066:34;;;;;;;:53;;;44118:1;44104:11;:15;44066:53;44062:396;;;44216:25;;;;;;44230:10;44216:25;;;;;;44180:18;;44245:11;;44216:13;;;;;;:25;;;;;;;;;;;;;;:13;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44216:25:0;:40;;44208:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44295:33;;;;;;44304:10;44295:33;;;;;;;;;;;;:8;;;;;;:33;;;;;-1:-1:-1;;44295:33:0;;;;;;;-1:-1:-1;44295:8:0;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44344:11:0;;44337:55;;-1:-1:-1;44344:11:0;;;-1:-1:-1;44370:10:0;44382:9;44337:32;:55::i;:::-;44406:44;;;;;;;;;;;;;;;;;;;;;;;;;44062:396;;44468:39;;;;;;;:63;;;44530:1;44511:16;:20;44468:63;44464:438;;;44633:25;;;;;;44647:10;44633:25;;;;;;44592:23;;44662:16;;44633:13;;;;;;:25;;;;;;;;;;;;;;:13;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44633:25:0;:45;;44625:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44722:38;;;;;;44731:10;44722:38;;;;;;;;;;;;:8;;;;;;:38;;;;;-1:-1:-1;;44722:38:0;;;;;;;-1:-1:-1;44722:8:0;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44776:18:0;;44769:69;;-1:-1:-1;44776:18:0;;;-1:-1:-1;44809:10:0;44821:16;44769:39;:69::i;:::-;44852:42;;;;;;;;;;;;;;;;;44464:438;;44919:34;;;;;;;:53;;;44971:1;44957:11;:15;44919:53;44918:124;;;-1:-1:-1;44978:39:0;;;;;;;:63;;;45040:1;45021:16;:20;44978:63;44910:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41472:3600;;;;;;:::o;36400:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36400:42:0;:::o;40637:704::-;40750:8;;;;;;;40728:10;:31;40720:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40796:23;;;;:16;:23;;;;;;;;40795:24;40787:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40855:21;40879:19;:17;:19::i;:::-;40855:43;;40921:13;40913:5;:21;40905:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41002:17;;;41053:29;41002:17;41053:13;:29::i;:::-;41034:15;:48;;41026:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41145:10;41125;41136:5;41125:17;;;;;;;;;;;;;;;:30;;;;41183:18;41204:10;41215:5;41204:17;;;;;;;;;;;;;;;;;;;;41228:23;;;:16;:23;;;;;;;:30;;;;41254:4;41228:30;;;41305:10;:17;;41204;;-1:-1:-1;41270:65:0;;41289:14;;41305:10;41245:5;;41305:17;;;;;;;;;;;;;;;;;41270:65;;;;;;;;;;;;;;;;;;;;;;;;;40637:704;;;;;:::o;45935:218::-;46027:11;:22;45985:7;;46009:15;:40;46001:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46127:20;;:11;46101:22;46083:15;:40;46127:20;46082:65;;;;;46075:72;;45935:218;:::o;35902:46::-;;;;;;;;;;;;;;;:::o;46531:112::-;46619:18;;;;46531:112;:::o;35679:23::-;;;;;;;;;:::o;36873:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47098:131::-;47170:10;;;;47156;:24;47148:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47210:8;:13;;;;;;;;;;;;;;;;;;47098:131::o;35435:29::-;;;;:::o;37447:1022::-;37586:15;:22;:31;;37578:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37669:10;;;;37655;:24;37647:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37711:15;:23;;;;;;;;;-1:-1:-1;37711:23:0;;;;;;;37741:10;:18;;;;;;;;;;;;;37766:10;:18;;;;;;;;;;;;;37793:20;:56;;;;;;;;;;;;;;;;;;;;;;;;;37856:25;:66;;;;;;;;;;;;;;;;;;;;;;38079:106;;;;;;;;;;;37711:23;38079:106;;;;;;;;;;;;38024:52;;;:21;:52;;;;;;;:161;;;;;;;;;;;;;;;;;;;;;;;;;;;38079:106;;38024:52;;:161;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38352:111:0;;;;;;;;38388:4;38352:111;;;;;;;;;;;;;;;;38292:57;;;-1:-1:-1;38292:57:0;;;:21;:57;;;;;;;:171;;;;;;;;;;;;;;;;;;;;;;;;;;;38352:111;;-1:-1:-1;38292:171:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37447:1022:0:o;45584:149::-;45664:10;;;;45650;:24;45642:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45704:18;:23;;;;;;;;;;;;;;;45584:149::o;46159:189::-;46232:7;46255:87;46326:15;46255:66;46282:38;46299:11;:20;;;46282:12;46292:1;46282:5;:9;;:12;;;;:::i;46255:66::-;:70;;:87::i;36322:37::-;;;;;;;;;;;;36050:32;;;;;;;;;;;;46375:150;46474:11;:22;46498:20;;46375:150;;:::o;45160:244::-;45227:8;;;;;;;45213:10;:22;;:50;;-1:-1:-1;45253:10:0;;;;45239;:24;45213:50;45205:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45336:6;45317:16;45331:1;45317:13;:16::i;:::-;:25;45299:15;:43;45291:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45382:9;:16;;;;45394:4;45382:16;;;45160:244::o;2126:181::-;2184:7;2216:5;;;2240:6;;;;2232:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2298:1;2126:181;-1:-1:-1;;;2126:181:0:o;3480:471::-;3538:7;3783:6;3779:47;;-1:-1:-1;3813:1:0;3806:8;;3779:47;3850:5;;;3854:1;3850;:5;:1;3874:5;;;;;:10;3866:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30123:199;30247:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30270:27;30247:68;;;30220:96;;30240:5;;30220:19;:96::i;:::-;30123:199;;;;:::o;29946:171::-;30052:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30075:23;30052:58;;;30025:86;;30045:5;;30025:19;:86::i;:::-;29946:171;;;:::o;4427:132::-;4485:7;4512:39;4516:1;4519;4512:39;;;;;;;;;;;;;;;;;:3;:39::i;2590:136::-;2648:7;2675:43;2679:1;2682;2675:43;;;;;;;;;;;;;;;;;:3;:43::i;32147:723::-;32555:23;32581:69;32609:4;32581:69;;;;;;;;;;;;;;;;;32589:5;32581:27;;;;:69;;;;;:::i;:::-;32661:17;;32555:95;;-1:-1:-1;32661:21:0;32657:208;;32791:10;32780:30;;;;;;;;;;;;;;;-1:-1:-1;32780:30:0;32772:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5055:278;5141:7;5176:12;5169:5;5161:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5200:9;5216:1;5212;:5;;;;;;;5055:278;-1:-1:-1;;;;;5055:278:0:o;3029:192::-;3115:7;3151:12;3143:6;;;;3135:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3187:5:0;;;3029:192::o;13997:195::-;14100:12;14132:52;14154:6;14162:4;14168:1;14171:12;14132:21;:52::i;:::-;14125:59;13997:195;-1:-1:-1;;;;13997:195:0:o;15049:530::-;15176:12;15234:5;15209:21;:30;;15201:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15301:18;15312:6;15301:10;:18::i;:::-;15293:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15427:12;15441:23;15468:6;:11;;15488:5;15496:4;15468:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15426:75;;;;15519:52;15537:7;15546:10;15558:12;15519:17;:52::i;:::-;15512:59;15049:530;-1:-1:-1;;;;;;;15049:530:0:o;11077:422::-;11444:20;11483:8;;;11077:422::o;17589:742::-;17704:12;17733:7;17729:595;;;-1:-1:-1;17764:10:0;17757:17;;17729:595;17878:17;;:21;17874:439;;18141:10;18135:17;18202:15;18189:10;18185:2;18181:19;18174:44;18089:148;18277:20;;;;;;;;;;;;;;;;;;;;18284:12;;18277:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://ad6c0f349174c52afe054e86d767d07943b8c271daedf57b8474de043e4e72ee
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1,144.24 | 0.0019223 | $2.2 |
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.