More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 278 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove_liquidity | 12213782 | 1406 days ago | IN | 0 ETH | 0.00734607 | ||||
Remove_liquidity | 12118601 | 1421 days ago | IN | 0 ETH | 0.01452834 | ||||
Remove_liquidity | 11983849 | 1442 days ago | IN | 0 ETH | 0.00674974 | ||||
Remove_liquidity | 11883185 | 1457 days ago | IN | 0 ETH | 0.02858854 | ||||
Remove_liquidity | 11846632 | 1463 days ago | IN | 0 ETH | 0.00852774 | ||||
Remove_liquidity | 11805582 | 1469 days ago | IN | 0 ETH | 0.01962108 | ||||
Remove_liquidity | 11719027 | 1482 days ago | IN | 0 ETH | 0.0096649 | ||||
Remove_liquidity | 11654093 | 1492 days ago | IN | 0 ETH | 0.0175318 | ||||
Remove_liquidity | 11644570 | 1494 days ago | IN | 0 ETH | 0.00629561 | ||||
Remove_liquidity | 11642853 | 1494 days ago | IN | 0 ETH | 0.00688202 | ||||
Remove_liquidity | 11640544 | 1494 days ago | IN | 0 ETH | 0.01336607 | ||||
Remove_liquidity | 11628293 | 1496 days ago | IN | 0 ETH | 0.00448926 | ||||
Remove_liquidity | 11602870 | 1500 days ago | IN | 0 ETH | 0.01259263 | ||||
Remove_liquidity | 11574158 | 1505 days ago | IN | 0 ETH | 0.00323274 | ||||
Remove_liquidity | 11574139 | 1505 days ago | IN | 0 ETH | 0.0034187 | ||||
Remove_liquidity | 11569732 | 1505 days ago | IN | 0 ETH | 0.00780165 | ||||
Remove_liquidity | 11566133 | 1506 days ago | IN | 0 ETH | 0.00541776 | ||||
Remove_liquidity | 11559661 | 1507 days ago | IN | 0 ETH | 0.0185961 | ||||
Remove_liquidity | 11552446 | 1508 days ago | IN | 0 ETH | 0.00805475 | ||||
Remove_liquidity | 11551580 | 1508 days ago | IN | 0 ETH | 0.01054353 | ||||
Remove_liquidity | 11551208 | 1508 days ago | IN | 0 ETH | 0.00816876 | ||||
Remove_liquidity | 11550121 | 1508 days ago | IN | 0 ETH | 0.02247384 | ||||
Remove_liquidity | 11548502 | 1509 days ago | IN | 0 ETH | 0.0080713 | ||||
Remove_liquidity | 11547585 | 1509 days ago | IN | 0 ETH | 0.00751042 | ||||
Remove_liquidity | 11544644 | 1509 days ago | IN | 0 ETH | 0.01129982 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SaffronERC20StakingPool
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-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) - (3 * 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 == 3, "v1.3: must be epoch 3 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 == 3, "v1.3: bal token epoch must be 3"); 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 == 3, "v1.3: bal token epoch must be 3"); 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, "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); } }
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":[],"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
6004805460ff1916905560c0604052635f9ebf6060808190526212750060a08190526005919091556006553480156200003757600080fd5b5060405162002ed538038062002ed5833981810160405260808110156200005d57600080fd5b5080516020820151604083015160609093015160008054336001600160a01b0319918216179091556001805482166001600160a01b0380861691909117909155600280549092168187161790915560048054610100600160a81b031916610100928616929092029190911790559192909180620000de5762127500620000e2565b6104b05b62ffffff1660065580620000fb57635f9ebf6062000104565b60065460030242035b60055550505050612dba806200011b6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806380e0f15f116100f9578063cbc3db5c11610097578063ea8e496e11610071578063ea8e496e14610532578063ebd485fc1461054f578063f034c18d1461056c578063fc0e74d114610574576101c4565b8063cbc3db5c146104a1578063cfbb8871146104e2578063df4cbfd814610515576101c4565b8063a72b6c30116100d3578063a72b6c3014610425578063a8c62e761461042d578063ab1d998814610435578063c6b483ab14610499576101c4565b806380e0f15f146103dd578063837a9bc714610400578063a684b59914610408576101c4565b806348373cc61161016657806354d0c8a01161014057806354d0c8a0146103695780635aa6e675146103715780635b1caa2f146103795780637d179904146103c0576101c4565b806348373cc6146102fd5780634c1a42591461031957806351d8ef231461034c576101c4565b80631816f314116101a25780631816f314146102535780632a0ccc88146102745780632b666fcf146102a55780633916fcef146102e0576101c4565b8063070313fa146101c95780630efb8dbd146101fe5780630f78dac31461022d575b600080fd5b6101fc600480360360208110156101df57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661057c565b005b61021b6004803603602081101561021457600080fd5b5035610649565b60408051918252519081900360200190f35b6101fc6004803603604081101561024357600080fd5b508035906020013560ff16610677565b61025b610ba2565b6040805192835260208301919091528051918290030190f35b61027c610bab565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101fc600480360360408110156102bb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bc7565b61021b600480360360208110156102f657600080fd5b5035610dfa565b610305610e1b565b604080519115158252519081900360200190f35b6101fc6004803603602081101561032f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e24565b61021b6004803603602081101561036257600080fd5b5035610e27565b61027c610e37565b61027c610e53565b6101fc6004803603608081101561038f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135169060600135610e6f565b61027c600480360360208110156103d657600080fd5b5035611c21565b6101fc600480360360408110156103f357600080fd5b5080359060200135611c58565b61021b611f49565b6103056004803603602081101561041e57600080fd5b5035611fd1565b61027c611fe6565b61027c612002565b6104686004803603602081101561044b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612023565b60405180841515815260200183815260200182600181111561048657fe5b8152602001935050505060405180910390f35b61021b612049565b6101fc600480360360608110156104b757600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604001351661204f565b6101fc600480360360208110156104f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661239f565b61021b6004803603602081101561052b57600080fd5b503561246c565b61027c6004803603602081101561054857600080fd5b5035612498565b61021b6004803603602081101561056557600080fd5b50356124a8565b61025b6124b8565b6101fc6124c2565b60005473ffffffffffffffffffffffffffffffffffffffff16331461060257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60065460009061067190610668906106628560016125f6565b90612671565b600554906125f6565b92915050565b60045460ff16156106e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f706f6f6c2073687574646f776e00000000000000000000000000000000000000604482015290519081900360640190fd5b60008160028111156106f757fe5b1461076357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f455243323020706f6f6c20686173206e6f207472616e63686573000000000000604482015290519081900360640190fd5b600061076d611f49565b9050826107db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f63616e2774206164642030000000000000000000000000000000000000000000604482015290519081900360640190fd5b8060031461084a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f76312e333a206d7573742062652065706f63682033206f6e6c79000000000000604482015290519081900360640190fd5b600061085f6108588361246c565b8590612671565b60035490915061086f90856125f6565b60038190555061089f846008848154811061088657fe5b90600052602060002001546125f690919063ffffffff16565b600883815481106108ac57fe5b90600052602060002001819055506108cb816009848154811061088657fe5b600983815481106108d857fe5b6000918252602090912001556001546109099073ffffffffffffffffffffffffffffffffffffffff163330876126e4565b600b828154811061091657fe5b6000918252602082200154604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101859052905173ffffffffffffffffffffffffffffffffffffffff909216926340c10f199260448084019382900301818387803b15801561099157600080fd5b505af11580156109a5573d6000803e3d6000fd5b50505050600c82815481106109b657fe5b6000918252602082200154604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101889052905173ffffffffffffffffffffffffffffffffffffffff909216926340c10f199260448084019382900301818387803b158015610a3157600080fd5b505af1158015610a45573d6000803e3d6000fd5b505050507fc7d2d1a5a726dc6005e76316c12eb5ee642296cc38c1b996651599995a480f3c610a738361246c565b8583600b8681548110610a8257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1686886002811115610ab157fe5b33600c8a81548110610abf57fe5b6000918252602091829020015460408051998a52918901979097528781019590955273ffffffffffffffffffffffffffffffffffffffff9384166060880152608087019290925260a0860152811660c085015290911660e083015251908190036101000190a17ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2460035460088481548110610b5657fe5b906000526020600020015460098581548110610b6e57fe5b906000526020600020015460405180848152602001838152602001828152602001935050505060405180910390a150505050565b60055460065482565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c4d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b60015473ffffffffffffffffffffffffffffffffffffffff83811691161415610cd757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616e6e6f7420737765657020706f6f6c206173736574730000000000000000604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051839160009173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610d4857600080fd5b505afa158015610d5c573d6000803e3d6000fd5b505050506040513d6020811015610d7257600080fd5b50519050610d9773ffffffffffffffffffffffffffffffffffffffff8316848361277f565b6040805133815273ffffffffffffffffffffffffffffffffffffffff80861660208301528616818301526060810183905290517f2c4e64c7c0957a81c0076a0a3f3c7d9f0a5d6158292071c794436f829d12cfb79181900360800190a150505050565b600a8181548110610e0a57600080fd5b600091825260209091200154905081565b60045460ff1681565b50565b60098181548110610e0a57600080fd5b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000831180610e7e5750600081115b610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f63616e27742072656d6f76652030000000000000000000000000000000000000604482015290519081900360640190fd5b60008073ffffffffffffffffffffffffffffffffffffffff861615801590610f115750600085115b1561135c57610f1e612cf5565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600d60209081526040918290208251606081018452815460ff908116151582526001808401549483019490945260028301549194929392850192911690811115610f8057fe5b6001811115610f8b57fe5b9052508051909150610ffe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f62616c616e636520746f6b656e206c6f6f6b7570206661696c65640000000000604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518891889173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b15801561106e57600080fd5b505afa158015611082573d6000803e3d6000fd5b505050506040513d602081101561109857600080fd5b5051101561110757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e73756666696369656e7420647365632062616c616e636500000000000000604482015290519081900360640190fd5b602082015160008360400151600181111561111e57fe5b1461118a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6261642064736563206164647265737300000000000000000000000000000000604482015290519081900360640190fd5b806003146111f957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f76312e333a2062616c20746f6b656e2065706f6368206d757374206265203300604482015290519081900360640190fd5b60008181526007602052604090205460ff1661127657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e27742072656d6f76652066726f6d20776f756e642075702065706f6368604482015290519081900360640190fd5b6112aa6009828154811061128657fe5b6000918252602090912001546112a48a670de0b6b3a7640000612671565b90612811565b9350670de0b6b3a76400006112df85600a84815481106112c657fe5b906000526020600020015461267190919063ffffffff16565b816112e657fe5b04945061131385600a83815481106112fa57fe5b906000526020600020015461285390919063ffffffff16565b600a828154811061132057fe5b906000526020600020018190555061133f88600983815481106112fa57fe5b6009828154811061134c57fe5b6000918252602090912001555050505b73ffffffffffffffffffffffffffffffffffffffff8416158015906113815750600083115b156117245761138e612cf5565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600d60209081526040918290208251606081018452815460ff9081161515825260018084015494830194909452600283015491949293928501929116908111156113f057fe5b60018111156113fb57fe5b905250805190915061146e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f62616c616e636520746f6b656e20696e666f206c6f6f6b7570206661696c6564604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518691869173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156114de57600080fd5b505afa1580156114f2573d6000803e3d6000fd5b505050506040513d602081101561150857600080fd5b5051101561157757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e74207072696e636970616c2062616c616e63650000604482015290519081900360640190fd5b602082015160018360400151600181111561158e57fe5b146115fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6261642062616c616e636520746f6b656e206164647265737300000000000000604482015290519081900360640190fd5b8060031461166957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f76312e333a2062616c20746f6b656e2065706f6368206d757374206265203300604482015290519081900360640190fd5b60008181526007602052604090205460ff166116e657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e27742072656d6f76652066726f6d20776f756e642075702065706f6368604482015290519081900360640190fd5b6116f786600883815481106112fa57fe5b6008828154811061170457fe5b60009182526020909120015560035461171d9087612853565b6003555050505b73ffffffffffffffffffffffffffffffffffffffff8616158015906117495750600085115b1561194557604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518791879173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156117be57600080fd5b505afa1580156117d2573d6000803e3d6000fd5b505050506040513d60208110156117e857600080fd5b5051101561185757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e73756666696369656e7420647365632062616c616e636500000000000000604482015290519081900360640190fd5b604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101889052905173ffffffffffffffffffffffffffffffffffffffff831691639dc29fac91604480830192600092919082900301818387803b1580156118cb57600080fd5b505af11580156118df573d6000803e3d6000fd5b5050600254611908925073ffffffffffffffffffffffffffffffffffffffff169050338561277f565b604080518381526020810185905281517fb2e2b56b9ff35de42645cc5d65cfda86ee12c931be57378ea82eecaf8a33acc2929181900390910190a1505b73ffffffffffffffffffffffffffffffffffffffff84161580159061196a5750600083115b15611b5e57604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518591859173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156119df57600080fd5b505afa1580156119f3573d6000803e3d6000fd5b505050506040513d6020811015611a0957600080fd5b50511015611a7857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e74207072696e636970616c2062616c616e63650000604482015290519081900360640190fd5b604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101869052905173ffffffffffffffffffffffffffffffffffffffff831691639dc29fac91604480830192600092919082900301818387803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050600154611b29925073ffffffffffffffffffffffffffffffffffffffff169050338661277f565b6040805185815290517ffbcc912eee8a56d51e3708fe32ba15f4191e6f92b2ccae4f00bbb544dba49f029181900360200190a1505b73ffffffffffffffffffffffffffffffffffffffff861615801590611b835750600085115b80611bae575073ffffffffffffffffffffffffffffffffffffffff841615801590611bae5750600083115b611c1957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6e6f20616374696f6e20706572666f726d656400000000000000000000000000604482015290519081900360640190fd5b505050505050565b600c8181548110611c3157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600454610100900473ffffffffffffffffffffffffffffffffffffffff163314611ce357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d75737420626520737472617465677900000000000000000000000000000000604482015290519081900360640190fd5b60008281526007602052604090205460ff1615611d6157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f65706f636820616c726561647920776f756e6420646f776e0000000000000000604482015290519081900360640190fd5b6000611d6b611f49565b9050808310611ddb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f63616e6e6f742077696e6420646f776e206675747572652065706f6368000000604482015290519081900360640190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101611e0781610649565b421015611e7557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f63616e27742063616c6c206265666f72652065706f636820656e646564000000604482015290519081900360640190fd5b82600a8581548110611e8357fe5b9060005260206000200181905550600060098581548110611ea057fe5b60009182526020808320909101548783526007909152604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600a80549192507fc220302e61ba656c610229ccf230eeecf82a2f57f432ab9dc62396d90f0527b69184919088908110611f1a57fe5b600091825260209182902001546040805193845291830152818101849052519081900360600190a15050505050565b6005546000904211611fbc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6265666f72652065706f63682030000000000000000000000000000000000000604482015290519081900360640190fd5b600654600554420381611fcb57fe5b04905090565b60076020526000908152604090205460ff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600454610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020526000908152604090208054600182015460029092015460ff91821692911683565b60035481565b60085483146120bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696d70726f706572206e65772065706f63680000000000000000000000000000604482015290519081900360640190fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461214557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b60088054600180820190925560007ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3909101819055600980548084019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01819055600a80548084019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801819055600b80548084019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600c80548087019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701805491871691909216179055604080516060810182528481526020808201898152828401868152948652600d90915291909320835181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821617825591518186015591516002830180549495939491939092919091169083818111156122fa57fe5b021790555050604080516060810182526001808252602080830188815283850183815273ffffffffffffffffffffffffffffffffffffffff88166000908152600d90935294909120835181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00918216178255915181840155935160028501805494965090939092911690838181111561239357fe5b02179055505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461242557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000610671426124926106686005600101546106626001886125f690919063ffffffff16565b90612853565b600b8181548110611c3157600080fd5b60088181548110610e0a57600080fd5b6005546006549091565b600454610100900473ffffffffffffffffffffffffffffffffffffffff16331461254d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d75737420626520737472617465677900000000000000000000000000000000604482015290519081900360640190fd5b6201518061255b6001610649565b0342116125c957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f747279696e6720746f2073687574646f776e20746f6f206561726c7900000000604482015290519081900360640190fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008282018381101561266a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261268057506000610671565b8282028284828161268d57fe5b041461266a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612d3a6021913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052612779908590612895565b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261280c908490612895565b505050565b600061266a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061296d565b600061266a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a29565b60606128f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a9d9092919063ffffffff16565b80519091501561280c5780806020019051602081101561291657600080fd5b505161280c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612d5b602a913960400191505060405180910390fd5b60008183612a13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129d85781810151838201526020016129c0565b50505050905090810190601f168015612a055780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612a1f57fe5b0495945050505050565b60008184841115612a95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156129d85781810151838201526020016129c0565b505050900390565b6060612aac8484600085612ab4565b949350505050565b606082471015612b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612d146026913960400191505060405180910390fd5b612b1885612c6f565b612b8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612bed57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612bb0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612c4f576040519150601f19603f3d011682016040523d82523d6000602084013e612c54565b606091505b5091509150612c64828286612c75565b979650505050505050565b3b151590565b60608315612c8457508161266a565b825115612c945782518084602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284518593919283926044019190850190808383600083156129d85781810151838201526020016129c0565b6040805160608101825260008082526020820181905290918201529056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220b91fd1c2904dba72460c9767415dca7b2fadeac54b064aa131842bc5f64fb2a064736f6c63430007040033000000000000000000000000f4aa3b60ead8df9768816f20710a99bbf372393c000000000000000000000000c76225124f3caab07f609b1d147a31de43926cd6000000000000000000000000b753428af26e81097e7fd17f40c88aaa3e04902c0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806380e0f15f116100f9578063cbc3db5c11610097578063ea8e496e11610071578063ea8e496e14610532578063ebd485fc1461054f578063f034c18d1461056c578063fc0e74d114610574576101c4565b8063cbc3db5c146104a1578063cfbb8871146104e2578063df4cbfd814610515576101c4565b8063a72b6c30116100d3578063a72b6c3014610425578063a8c62e761461042d578063ab1d998814610435578063c6b483ab14610499576101c4565b806380e0f15f146103dd578063837a9bc714610400578063a684b59914610408576101c4565b806348373cc61161016657806354d0c8a01161014057806354d0c8a0146103695780635aa6e675146103715780635b1caa2f146103795780637d179904146103c0576101c4565b806348373cc6146102fd5780634c1a42591461031957806351d8ef231461034c576101c4565b80631816f314116101a25780631816f314146102535780632a0ccc88146102745780632b666fcf146102a55780633916fcef146102e0576101c4565b8063070313fa146101c95780630efb8dbd146101fe5780630f78dac31461022d575b600080fd5b6101fc600480360360208110156101df57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661057c565b005b61021b6004803603602081101561021457600080fd5b5035610649565b60408051918252519081900360200190f35b6101fc6004803603604081101561024357600080fd5b508035906020013560ff16610677565b61025b610ba2565b6040805192835260208301919091528051918290030190f35b61027c610bab565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101fc600480360360408110156102bb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bc7565b61021b600480360360208110156102f657600080fd5b5035610dfa565b610305610e1b565b604080519115158252519081900360200190f35b6101fc6004803603602081101561032f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e24565b61021b6004803603602081101561036257600080fd5b5035610e27565b61027c610e37565b61027c610e53565b6101fc6004803603608081101561038f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135169060600135610e6f565b61027c600480360360208110156103d657600080fd5b5035611c21565b6101fc600480360360408110156103f357600080fd5b5080359060200135611c58565b61021b611f49565b6103056004803603602081101561041e57600080fd5b5035611fd1565b61027c611fe6565b61027c612002565b6104686004803603602081101561044b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612023565b60405180841515815260200183815260200182600181111561048657fe5b8152602001935050505060405180910390f35b61021b612049565b6101fc600480360360608110156104b757600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604001351661204f565b6101fc600480360360208110156104f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661239f565b61021b6004803603602081101561052b57600080fd5b503561246c565b61027c6004803603602081101561054857600080fd5b5035612498565b61021b6004803603602081101561056557600080fd5b50356124a8565b61025b6124b8565b6101fc6124c2565b60005473ffffffffffffffffffffffffffffffffffffffff16331461060257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60065460009061067190610668906106628560016125f6565b90612671565b600554906125f6565b92915050565b60045460ff16156106e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f706f6f6c2073687574646f776e00000000000000000000000000000000000000604482015290519081900360640190fd5b60008160028111156106f757fe5b1461076357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f455243323020706f6f6c20686173206e6f207472616e63686573000000000000604482015290519081900360640190fd5b600061076d611f49565b9050826107db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f63616e2774206164642030000000000000000000000000000000000000000000604482015290519081900360640190fd5b8060031461084a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f76312e333a206d7573742062652065706f63682033206f6e6c79000000000000604482015290519081900360640190fd5b600061085f6108588361246c565b8590612671565b60035490915061086f90856125f6565b60038190555061089f846008848154811061088657fe5b90600052602060002001546125f690919063ffffffff16565b600883815481106108ac57fe5b90600052602060002001819055506108cb816009848154811061088657fe5b600983815481106108d857fe5b6000918252602090912001556001546109099073ffffffffffffffffffffffffffffffffffffffff163330876126e4565b600b828154811061091657fe5b6000918252602082200154604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101859052905173ffffffffffffffffffffffffffffffffffffffff909216926340c10f199260448084019382900301818387803b15801561099157600080fd5b505af11580156109a5573d6000803e3d6000fd5b50505050600c82815481106109b657fe5b6000918252602082200154604080517f40c10f1900000000000000000000000000000000000000000000000000000000815233600482015260248101889052905173ffffffffffffffffffffffffffffffffffffffff909216926340c10f199260448084019382900301818387803b158015610a3157600080fd5b505af1158015610a45573d6000803e3d6000fd5b505050507fc7d2d1a5a726dc6005e76316c12eb5ee642296cc38c1b996651599995a480f3c610a738361246c565b8583600b8681548110610a8257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1686886002811115610ab157fe5b33600c8a81548110610abf57fe5b6000918252602091829020015460408051998a52918901979097528781019590955273ffffffffffffffffffffffffffffffffffffffff9384166060880152608087019290925260a0860152811660c085015290911660e083015251908190036101000190a17ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2460035460088481548110610b5657fe5b906000526020600020015460098581548110610b6e57fe5b906000526020600020015460405180848152602001838152602001828152602001935050505060405180910390a150505050565b60055460065482565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c4d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b60015473ffffffffffffffffffffffffffffffffffffffff83811691161415610cd757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f63616e6e6f7420737765657020706f6f6c206173736574730000000000000000604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051839160009173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610d4857600080fd5b505afa158015610d5c573d6000803e3d6000fd5b505050506040513d6020811015610d7257600080fd5b50519050610d9773ffffffffffffffffffffffffffffffffffffffff8316848361277f565b6040805133815273ffffffffffffffffffffffffffffffffffffffff80861660208301528616818301526060810183905290517f2c4e64c7c0957a81c0076a0a3f3c7d9f0a5d6158292071c794436f829d12cfb79181900360800190a150505050565b600a8181548110610e0a57600080fd5b600091825260209091200154905081565b60045460ff1681565b50565b60098181548110610e0a57600080fd5b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000831180610e7e5750600081115b610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f63616e27742072656d6f76652030000000000000000000000000000000000000604482015290519081900360640190fd5b60008073ffffffffffffffffffffffffffffffffffffffff861615801590610f115750600085115b1561135c57610f1e612cf5565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600d60209081526040918290208251606081018452815460ff908116151582526001808401549483019490945260028301549194929392850192911690811115610f8057fe5b6001811115610f8b57fe5b9052508051909150610ffe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f62616c616e636520746f6b656e206c6f6f6b7570206661696c65640000000000604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518891889173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b15801561106e57600080fd5b505afa158015611082573d6000803e3d6000fd5b505050506040513d602081101561109857600080fd5b5051101561110757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e73756666696369656e7420647365632062616c616e636500000000000000604482015290519081900360640190fd5b602082015160008360400151600181111561111e57fe5b1461118a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6261642064736563206164647265737300000000000000000000000000000000604482015290519081900360640190fd5b806003146111f957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f76312e333a2062616c20746f6b656e2065706f6368206d757374206265203300604482015290519081900360640190fd5b60008181526007602052604090205460ff1661127657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e27742072656d6f76652066726f6d20776f756e642075702065706f6368604482015290519081900360640190fd5b6112aa6009828154811061128657fe5b6000918252602090912001546112a48a670de0b6b3a7640000612671565b90612811565b9350670de0b6b3a76400006112df85600a84815481106112c657fe5b906000526020600020015461267190919063ffffffff16565b816112e657fe5b04945061131385600a83815481106112fa57fe5b906000526020600020015461285390919063ffffffff16565b600a828154811061132057fe5b906000526020600020018190555061133f88600983815481106112fa57fe5b6009828154811061134c57fe5b6000918252602090912001555050505b73ffffffffffffffffffffffffffffffffffffffff8416158015906113815750600083115b156117245761138e612cf5565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600d60209081526040918290208251606081018452815460ff9081161515825260018084015494830194909452600283015491949293928501929116908111156113f057fe5b60018111156113fb57fe5b905250805190915061146e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f62616c616e636520746f6b656e20696e666f206c6f6f6b7570206661696c6564604482015290519081900360640190fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518691869173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156114de57600080fd5b505afa1580156114f2573d6000803e3d6000fd5b505050506040513d602081101561150857600080fd5b5051101561157757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e74207072696e636970616c2062616c616e63650000604482015290519081900360640190fd5b602082015160018360400151600181111561158e57fe5b146115fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6261642062616c616e636520746f6b656e206164647265737300000000000000604482015290519081900360640190fd5b8060031461166957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f76312e333a2062616c20746f6b656e2065706f6368206d757374206265203300604482015290519081900360640190fd5b60008181526007602052604090205460ff166116e657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e27742072656d6f76652066726f6d20776f756e642075702065706f6368604482015290519081900360640190fd5b6116f786600883815481106112fa57fe5b6008828154811061170457fe5b60009182526020909120015560035461171d9087612853565b6003555050505b73ffffffffffffffffffffffffffffffffffffffff8616158015906117495750600085115b1561194557604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518791879173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156117be57600080fd5b505afa1580156117d2573d6000803e3d6000fd5b505050506040513d60208110156117e857600080fd5b5051101561185757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e73756666696369656e7420647365632062616c616e636500000000000000604482015290519081900360640190fd5b604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101889052905173ffffffffffffffffffffffffffffffffffffffff831691639dc29fac91604480830192600092919082900301818387803b1580156118cb57600080fd5b505af11580156118df573d6000803e3d6000fd5b5050600254611908925073ffffffffffffffffffffffffffffffffffffffff169050338561277f565b604080518381526020810185905281517fb2e2b56b9ff35de42645cc5d65cfda86ee12c931be57378ea82eecaf8a33acc2929181900390910190a1505b73ffffffffffffffffffffffffffffffffffffffff84161580159061196a5750600083115b15611b5e57604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290518591859173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b1580156119df57600080fd5b505afa1580156119f3573d6000803e3d6000fd5b505050506040513d6020811015611a0957600080fd5b50511015611a7857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e74207072696e636970616c2062616c616e63650000604482015290519081900360640190fd5b604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101869052905173ffffffffffffffffffffffffffffffffffffffff831691639dc29fac91604480830192600092919082900301818387803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050600154611b29925073ffffffffffffffffffffffffffffffffffffffff169050338661277f565b6040805185815290517ffbcc912eee8a56d51e3708fe32ba15f4191e6f92b2ccae4f00bbb544dba49f029181900360200190a1505b73ffffffffffffffffffffffffffffffffffffffff861615801590611b835750600085115b80611bae575073ffffffffffffffffffffffffffffffffffffffff841615801590611bae5750600083115b611c1957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6e6f20616374696f6e20706572666f726d656400000000000000000000000000604482015290519081900360640190fd5b505050505050565b600c8181548110611c3157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600454610100900473ffffffffffffffffffffffffffffffffffffffff163314611ce357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d75737420626520737472617465677900000000000000000000000000000000604482015290519081900360640190fd5b60008281526007602052604090205460ff1615611d6157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f65706f636820616c726561647920776f756e6420646f776e0000000000000000604482015290519081900360640190fd5b6000611d6b611f49565b9050808310611ddb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f63616e6e6f742077696e6420646f776e206675747572652065706f6368000000604482015290519081900360640190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101611e0781610649565b421015611e7557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f63616e27742063616c6c206265666f72652065706f636820656e646564000000604482015290519081900360640190fd5b82600a8581548110611e8357fe5b9060005260206000200181905550600060098581548110611ea057fe5b60009182526020808320909101548783526007909152604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600a80549192507fc220302e61ba656c610229ccf230eeecf82a2f57f432ab9dc62396d90f0527b69184919088908110611f1a57fe5b600091825260209182902001546040805193845291830152818101849052519081900360600190a15050505050565b6005546000904211611fbc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6265666f72652065706f63682030000000000000000000000000000000000000604482015290519081900360640190fd5b600654600554420381611fcb57fe5b04905090565b60076020526000908152604090205460ff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600454610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020526000908152604090208054600182015460029092015460ff91821692911683565b60035481565b60085483146120bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696d70726f706572206e65772065706f63680000000000000000000000000000604482015290519081900360640190fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461214557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b60088054600180820190925560007ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3909101819055600980548084019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01819055600a80548084019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a801819055600b80548084019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600c80548087019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701805491871691909216179055604080516060810182528481526020808201898152828401868152948652600d90915291909320835181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821617825591518186015591516002830180549495939491939092919091169083818111156122fa57fe5b021790555050604080516060810182526001808252602080830188815283850183815273ffffffffffffffffffffffffffffffffffffffff88166000908152600d90935294909120835181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00918216178255915181840155935160028501805494965090939092911690838181111561239357fe5b02179055505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461242557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d75737420626520676f7665726e616e63650000000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000610671426124926106686005600101546106626001886125f690919063ffffffff16565b90612853565b600b8181548110611c3157600080fd5b60088181548110610e0a57600080fd5b6005546006549091565b600454610100900473ffffffffffffffffffffffffffffffffffffffff16331461254d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6d75737420626520737472617465677900000000000000000000000000000000604482015290519081900360640190fd5b6201518061255b6001610649565b0342116125c957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f747279696e6720746f2073687574646f776e20746f6f206561726c7900000000604482015290519081900360640190fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008282018381101561266a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261268057506000610671565b8282028284828161268d57fe5b041461266a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612d3a6021913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052612779908590612895565b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261280c908490612895565b505050565b600061266a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061296d565b600061266a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a29565b60606128f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a9d9092919063ffffffff16565b80519091501561280c5780806020019051602081101561291657600080fd5b505161280c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612d5b602a913960400191505060405180910390fd5b60008183612a13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129d85781810151838201526020016129c0565b50505050905090810190601f168015612a055780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612a1f57fe5b0495945050505050565b60008184841115612a95576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156129d85781810151838201526020016129c0565b505050900390565b6060612aac8484600085612ab4565b949350505050565b606082471015612b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612d146026913960400191505060405180910390fd5b612b1885612c6f565b612b8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612bed57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612bb0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612c4f576040519150601f19603f3d011682016040523d82523d6000602084013e612c54565b606091505b5091509150612c64828286612c75565b979650505050505050565b3b151590565b60608315612c8457508161266a565b825115612c945782518084602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284518593919283926044019190850190808383600083156129d85781810151838201526020016129c0565b6040805160608101825260008082526020820181905290918201529056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220b91fd1c2904dba72460c9767415dca7b2fadeac54b064aa131842bc5f64fb2a064736f6c63430007040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f4aa3b60ead8df9768816f20710a99bbf372393c000000000000000000000000c76225124f3caab07f609b1d147a31de43926cd6000000000000000000000000b753428af26e81097e7fd17f40c88aaa3e04902c0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _strategy (address): 0xF4aA3b60eaD8DF9768816F20710a99bBF372393c
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] : 000000000000000000000000f4aa3b60ead8df9768816f20710a99bbf372393c
Arg [1] : 000000000000000000000000c76225124f3caab07f609b1d147a31de43926cd6
Arg [2] : 000000000000000000000000b753428af26e81097e7fd17f40c88aaa3e04902c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
35076:11985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45400:144;;;;;;;;;;;;;;;;-1:-1:-1;45400:144:0;;;;:::i;:::-;;45741:154;;;;;;;;;;;;;;;;-1:-1:-1;45741:154:0;;:::i;:::-;;;;;;;;;;;;;;;;38919:1617;;;;;;;;;;;;;;;;-1:-1:-1;38919:1617:0;;;;;;;;;:::i;35731:164::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35382:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46690:368;;;;;;;;;;;;;;;;-1:-1:-1;46690:368:0;;;;;;;;;;;:::i;36227:27::-;;;;;;;;;;;;;;;;-1:-1:-1;36227:27:0;;:::i;35528:29::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;45072:76;;;;;;;;;;;;;;;;-1:-1:-1;45072:76:0;;;;:::i;36149:27::-;;;;;;;;;;;;;;;;-1:-1:-1;36149:27:0;;:::i;35288:33::-;;;:::i;35194:25::-;;;:::i;41472:3594::-;;;;;;;;;;;;;;;;-1:-1:-1;41472:3594:0;;;;;;;;;;;;;;;;;;;;;:::i;36400:42::-;;;;;;;;;;;;;;;;-1:-1:-1;36400:42:0;;:::i;40637:704::-;;;;;;;;;;;;;;;;-1:-1:-1;40637:704:0;;;;;;;:::i;45901:218::-;;;:::i;35902:46::-;;;;;;;;;;;;;;;;-1:-1:-1;35902:46:0;;:::i;46497:112::-;;;:::i;35679:23::-;;;:::i;36873:65::-;;;;;;;;;;;;;;;;-1:-1:-1;36873:65:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35435:29;;;:::i;37447:1022::-;;;;;;;;;;;;;;;;-1:-1:-1;37447:1022:0;;;;;;;;;;;;;;;;:::i;45550:149::-;;;;;;;;;;;;;;;;-1:-1:-1;45550:149:0;;;;:::i;46125:189::-;;;;;;;;;;;;;;;;-1:-1:-1;46125:189:0;;:::i;36322:37::-;;;;;;;;;;;;;;;;-1:-1:-1;36322:37:0;;:::i;36050:32::-;;;;;;;;;;;;;;;;-1:-1:-1;36050:32:0;;:::i;46341:150::-;;;:::i;45154:216::-;;;:::i;45400:144::-;45483:10;;;;45469;:24;45461:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45523:10;:15;;;;;;;;;;;;;;;45400:144::o;45741:154::-;45867:20;;45800:7;;45823:66;;45850:38;;:12;:5;45867:20;45850:9;:12::i;:::-;:16;;:38::i;:::-;45823:11;:22;;:26;:66::i;:::-;45816:73;45741:154;-1:-1:-1;;45741: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:1;39201:10;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;46690:368::-;46774:10;;;;46760;:24;46752:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46832:18;;;46822:28;;;46832:18;;46822:28;;46814:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46937:28;;;;;;46959:4;46937:28;;;;;;46908:6;;46888:10;;46937:13;;;;;;:28;;;;;;;;;;;;;;:13;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46937:28:0;;-1:-1:-1;46972:27:0;:16;;;46989:3;46937:28;46972:16;:27::i;:::-;47013:39;;;47022:10;47013:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46690:368;;;;:::o;36227:27::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36227:27:0;:::o;35528:29::-;;;;;;:::o;45072:76::-;;:::o;36149:27::-;;;;;;;;;;;;35288:33;;;;;;:::o;35194:25::-;;;;;;:::o;41472:3594::-;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:1167;;;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:1;42457:16;42449:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42526:29;;;;:16;:29;;;;;;;;42518:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42691:53;42720:10;42731:11;42720:23;;;;;;;;;;;;;;;;;;42691:24;:11;42707:7;42691:15;:24::i;:::-;:28;;:53::i;:::-;42676:68;;42809:7;42765:41;42793:12;42765:10;42776:11;42765:23;;;;;;;;;;;;;;;;:27;;:41;;;;:::i;:::-;:51;;;;;;42753:63;;42851:38;42879:9;42851:10;42862:11;42851:23;;;;;;;;;;;;;;;;:27;;:38;;;;:::i;:::-;42825:10;42836:11;42825:23;;;;;;;;;;;;;;;:64;;;;42924:40;42952:11;42924:10;42935:11;42924:23;;;;;;;:40;42898:10;42909:11;42898:23;;;;;;;;;;;;;;;;;:66;-1:-1:-1;;;41805:1167:0;43037:39;;;;;;;:63;;;43099:1;43080:16;:20;43037:63;43033:998;;;43196:36;;:::i;:::-;43235:46;;;;;;;:21;:46;;;;;;;;;43196:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43235:46;;43196:85;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43298:17:0;;43196:85;;-1:-1:-1;43290:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43452:25;;;;;;43466:10;43452:25;;;;;;43411:23;;43481:16;;43452:13;;;;;;:25;;;;;;;;;;;;;;:13;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43452:25:0;:45;;43444:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43608:16;;;;43666:21;43641:10;:21;;;:46;;;;;;;;;43633:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43734:11;43749:1;43734:16;43726:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43803:29;;;;:16;:29;;;;;;;;43795:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43911:50;43944:16;43911:15;43927:11;43911:28;;;;;;;:50;43880:15;43896:11;43880:28;;;;;;;;;;;;;;;;;:81;43987:14;;:36;;44006:16;43987:18;:36::i;:::-;43970:14;:53;-1:-1:-1;;;43033:998:0;44060:34;;;;;;;:53;;;44112:1;44098:11;:15;44060:53;44056:396;;;44210:25;;;;;;44224:10;44210:25;;;;;;44174:18;;44239:11;;44210:13;;;;;;:25;;;;;;;;;;;;;;:13;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44210:25:0;:40;;44202:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44289:33;;;;;;44298:10;44289:33;;;;;;;;;;;;:8;;;;;;:33;;;;;-1:-1:-1;;44289:33:0;;;;;;;-1:-1:-1;44289:8:0;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44338:11:0;;44331:55;;-1:-1:-1;44338:11:0;;;-1:-1:-1;44364:10:0;44376:9;44331:32;:55::i;:::-;44400:44;;;;;;;;;;;;;;;;;;;;;;;;;44056:396;;44462:39;;;;;;;:63;;;44524:1;44505:16;:20;44462:63;44458:438;;;44627:25;;;;;;44641:10;44627:25;;;;;;44586:23;;44656:16;;44627:13;;;;;;:25;;;;;;;;;;;;;;:13;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44627:25:0;:45;;44619:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44716:38;;;;;;44725:10;44716:38;;;;;;;;;;;;:8;;;;;;:38;;;;;-1:-1:-1;;44716:38:0;;;;;;;-1:-1:-1;44716:8:0;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44770:18:0;;44763:69;;-1:-1:-1;44770:18:0;;;-1:-1:-1;44803:10:0;44815:16;44763:39;:69::i;:::-;44846:42;;;;;;;;;;;;;;;;;44458:438;;44913:34;;;;;;;:53;;;44965:1;44951:11;:15;44913:53;44912:124;;;-1:-1:-1;44972:39:0;;;;;;;:63;;;45034:1;45015:16;:20;44972:63;44904:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41472:3594;;;;;;:::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;45901:218::-;45993:11;:22;45951:7;;45975:15;:40;45967:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46093:20;;:11;46067:22;46049:15;:40;46093:20;46048:65;;;;;46041:72;;45901:218;:::o;35902:46::-;;;;;;;;;;;;;;;:::o;46497:112::-;46585:18;;;;46497:112;:::o;35679:23::-;;;;;;;;;:::o;36873:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;45550:149::-;45630:10;;;;45616;:24;45608:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45670:18;:23;;;;;;;;;;;;;;;45550:149::o;46125:189::-;46198:7;46221:87;46292:15;46221:66;46248:38;46265:11;:20;;;46248:12;46258:1;46248:5;:9;;:12;;;;:::i;46221:66::-;:70;;:87::i;36322:37::-;;;;;;;;;;;;36050:32;;;;;;;;;;;;46341:150;46440:11;:22;46464:20;;46341:150;;:::o;45154:216::-;45221:8;;;;;;;45207:10;:22;45199:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45302:6;45283:16;45297:1;45283:13;:16::i;:::-;:25;45265:15;:43;45257:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45348:9;:16;;;;45360:4;45348:16;;;45154:216::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://b91fd1c2904dba72460c9767415dca7b2fadeac54b064aa131842bc5f64fb2a0
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.