Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 547 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Renounce Ownersh... | 12655064 | 1133 days ago | IN | 0 ETH | 0.00039446 | ||||
Zap In | 12519934 | 1154 days ago | IN | 0 ETH | 0.0006257 | ||||
Toggle Contract ... | 12501159 | 1157 days ago | IN | 0 ETH | 0.00108932 | ||||
Zap In | 12501127 | 1157 days ago | IN | 0 ETH | 0.0213982 | ||||
Zap In | 12500331 | 1157 days ago | IN | 0 ETH | 0.01683923 | ||||
Zap In | 12499914 | 1157 days ago | IN | 0 ETH | 0.01198133 | ||||
Zap In | 12499501 | 1157 days ago | IN | 47 ETH | 0.0129298 | ||||
Zap In | 12498928 | 1157 days ago | IN | 0 ETH | 0.02552114 | ||||
Zap In | 12498744 | 1157 days ago | IN | 0 ETH | 0.01459814 | ||||
Zap In | 12498184 | 1157 days ago | IN | 10.05 ETH | 0.01703251 | ||||
Zap In | 12497894 | 1157 days ago | IN | 0 ETH | 0.03022175 | ||||
Zap In | 12497522 | 1158 days ago | IN | 0 ETH | 0.05942506 | ||||
Zap In | 12496279 | 1158 days ago | IN | 52 ETH | 0.01137677 | ||||
Zap In | 12496116 | 1158 days ago | IN | 0 ETH | 0.02149695 | ||||
Zap In | 12495993 | 1158 days ago | IN | 0 ETH | 0.03210318 | ||||
Zap In | 12495563 | 1158 days ago | IN | 0 ETH | 0.02583948 | ||||
Zap In | 12494840 | 1158 days ago | IN | 0 ETH | 0.01888365 | ||||
Zap In | 12494813 | 1158 days ago | IN | 0 ETH | 0.01645187 | ||||
Zap In | 12494398 | 1158 days ago | IN | 0 ETH | 0.01973577 | ||||
Zap In | 12494161 | 1158 days ago | IN | 9 ETH | 0.00790062 | ||||
Zap In | 12493895 | 1158 days ago | IN | 0 ETH | 0.03440331 | ||||
Zap In | 12493504 | 1158 days ago | IN | 0 ETH | 0.02073586 | ||||
Zap In | 12493344 | 1158 days ago | IN | 0 ETH | 0.05984345 | ||||
Zap In | 12491307 | 1159 days ago | IN | 0 ETH | 0.11683175 | ||||
Zap In | 12490190 | 1159 days ago | IN | 0 ETH | 0.02891097 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12501159 | 1157 days ago | 10 ETH | ||||
12500824 | 1157 days ago | 6.3384 ETH | ||||
12500824 | 1157 days ago | 6.3384 ETH | ||||
12500816 | 1157 days ago | 24 ETH | ||||
12500816 | 1157 days ago | 24 ETH | ||||
12500536 | 1157 days ago | 8.86930411 ETH | ||||
12500536 | 1157 days ago | 8.86930411 ETH | ||||
12500055 | 1157 days ago | 0.76 ETH | ||||
12500055 | 1157 days ago | 0.76 ETH | ||||
12499524 | 1157 days ago | 50 ETH | ||||
12499524 | 1157 days ago | 50 ETH | ||||
12499501 | 1157 days ago | 47 ETH | ||||
12499000 | 1157 days ago | 5 ETH | ||||
12499000 | 1157 days ago | 5 ETH | ||||
12498991 | 1157 days ago | 65 ETH | ||||
12498991 | 1157 days ago | 65 ETH | ||||
12498931 | 1157 days ago | 6 ETH | ||||
12498931 | 1157 days ago | 6 ETH | ||||
12498251 | 1157 days ago | 0.9 ETH | ||||
12498251 | 1157 days ago | 0.9 ETH | ||||
12498238 | 1157 days ago | 5 ETH | ||||
12498238 | 1157 days ago | 5 ETH | ||||
12498184 | 1157 days ago | 10.05 ETH | ||||
12497924 | 1157 days ago | 13.62 ETH | ||||
12497924 | 1157 days ago | 13.62 ETH |
Loading...
Loading
Contract Name:
Curve_ZapIn_General_V3_1_1
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-21 */ // ███████╗░█████╗░██████╗░██████╗░███████╗██████╗░░░░███████╗██╗ // ╚════██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗░░░██╔════╝██║ // ░░███╔═╝███████║██████╔╝██████╔╝█████╗░░██████╔╝░░░█████╗░░██║ // ██╔══╝░░██╔══██║██╔═══╝░██╔═══╝░██╔══╝░░██╔══██╗░░░██╔══╝░░██║ // ███████╗██║░░██║██║░░░░░██║░░░░░███████╗██║░░██║██╗██║░░░░░██║ // ╚══════╝╚═╝░░╚═╝╚═╝░░░░░╚═╝░░░░░╚══════╝╚═╝░░╚═╝╚═╝╚═╝░░░░░╚═╝ // Copyright (C) 2020 zapper // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // ///@author Zapper ///@notice This contract adds liquidity to Curve pools in one transaction with ETH or ERC tokens. // File: contracts/oz/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: contracts/oz/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/oz/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { function decimals() external view returns (uint8); /** * @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/oz/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/oz/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require( success, "Address: unable to send value, recipient may have reverted" ); } } // File: contracts/oz/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` 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) ); } 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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/_base/ZapBaseV1.sol pragma solidity ^0.5.7; contract ZapBaseV1 is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; bool public stopped = false; // if true, goodwill is not deducted mapping(address => bool) public feeWhitelist; uint256 public goodwill; // % share of goodwill (0-100 %) uint256 affiliateSplit; // restrict affiliates mapping(address => bool) public affiliates; // affiliate => token => amount mapping(address => mapping(address => uint256)) public affiliateBalance; // token => amount mapping(address => uint256) public totalAffiliateBalance; address internal constant ETHAddress = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; constructor(uint256 _goodwill, uint256 _affiliateSplit) public { goodwill = _goodwill; affiliateSplit = _affiliateSplit; } // circuit breaker modifiers modifier stopInEmergency { if (stopped) { revert("Temporarily Paused"); } else { _; } } function _getBalance(address token) internal view returns (uint256 balance) { if (token == address(0)) { balance = address(this).balance; } else { balance = IERC20(token).balanceOf(address(this)); } } function _approveToken(address token, address spender) internal { IERC20 _token = IERC20(token); if (_token.allowance(address(this), spender) > 0) return; else { _token.safeApprove(spender, uint256(-1)); } } // - to Pause the contract function toggleContractActive() public onlyOwner { stopped = !stopped; } function set_feeWhitelist(address zapAddress, bool status) external onlyOwner { feeWhitelist[zapAddress] = status; } function set_new_goodwill(uint256 _new_goodwill) public onlyOwner { require( _new_goodwill >= 0 && _new_goodwill <= 100, "GoodWill Value not allowed" ); goodwill = _new_goodwill; } function set_new_affiliateSplit(uint256 _new_affiliateSplit) external onlyOwner { require( _new_affiliateSplit <= 100, "Affiliate Split Value not allowed" ); affiliateSplit = _new_affiliateSplit; } function set_affiliate(address _affiliate, bool _status) external onlyOwner { affiliates[_affiliate] = _status; } ///@notice Withdraw goodwill share, retaining affilliate share function withdrawTokens(address[] calldata tokens) external onlyOwner { for (uint256 i = 0; i < tokens.length; i++) { uint256 qty; if (tokens[i] == ETHAddress) { qty = address(this).balance.sub( totalAffiliateBalance[tokens[i]] ); Address.sendValue(Address.toPayable(owner()), qty); } else { qty = IERC20(tokens[i]).balanceOf(address(this)).sub( totalAffiliateBalance[tokens[i]] ); IERC20(tokens[i]).safeTransfer(owner(), qty); } } } ///@notice Withdraw affilliate share, retaining goodwill share function affilliateWithdraw(address[] calldata tokens) external { uint256 tokenBal; for (uint256 i = 0; i < tokens.length; i++) { tokenBal = affiliateBalance[msg.sender][tokens[i]]; affiliateBalance[msg.sender][tokens[i]] = 0; totalAffiliateBalance[tokens[i]] = totalAffiliateBalance[tokens[i]] .sub(tokenBal); if (tokens[i] == ETHAddress) { Address.sendValue(msg.sender, tokenBal); } else { IERC20(tokens[i]).safeTransfer(msg.sender, tokenBal); } } } function() external payable { require(msg.sender != tx.origin, "Do not send ETH directly"); } } // File: contracts/_base/ZapInBaseV1.sol pragma solidity ^0.5.7; contract ZapInBaseV1 is ZapBaseV1 { function _pullTokens( address token, uint256 amount, address affiliate, bool enableGoodwill ) internal returns (uint256 value) { uint256 totalGoodwillPortion; if (token == address(0)) { require(msg.value > 0, "No eth sent"); // subtract goodwill totalGoodwillPortion = _subtractGoodwill( ETHAddress, msg.value, affiliate, enableGoodwill ); return msg.value.sub(totalGoodwillPortion); } require(amount > 0, "Invalid token amount"); require(msg.value == 0, "Eth sent with token"); //transfer token IERC20(token).safeTransferFrom(msg.sender, address(this), amount); // subtract goodwill totalGoodwillPortion = _subtractGoodwill( token, amount, affiliate, enableGoodwill ); return amount.sub(totalGoodwillPortion); } function _subtractGoodwill( address token, uint256 amount, address affiliate, bool enableGoodwill ) internal returns (uint256 totalGoodwillPortion) { bool whitelisted = feeWhitelist[msg.sender]; if (enableGoodwill && !whitelisted && goodwill > 0) { totalGoodwillPortion = SafeMath.div( SafeMath.mul(amount, goodwill), 10000 ); if (affiliates[affiliate]) { if (token == address(0)) { token = ETHAddress; } uint256 affiliatePortion = totalGoodwillPortion .mul(affiliateSplit) .div(100); affiliateBalance[affiliate][token] = affiliateBalance[affiliate][token] .add(affiliatePortion); totalAffiliateBalance[token] = totalAffiliateBalance[token].add( affiliatePortion ); } } } } // File: contracts/Curve/Curve_ZapIn_General_V3.sol pragma solidity ^0.5.7; interface ICurveSwap { function coins(int128 arg0) external view returns (address); function underlying_coins(int128 arg0) external view returns (address); function add_liquidity(uint256[4] calldata amounts, uint256 min_mint_amount) external; function add_liquidity( uint256[4] calldata amounts, uint256 min_mint_amount, bool addUnderlying ) external; function add_liquidity(uint256[3] calldata amounts, uint256 min_mint_amount) external; function add_liquidity( uint256[3] calldata amounts, uint256 min_mint_amount, bool addUnderlying ) external; function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external; function add_liquidity( uint256[2] calldata amounts, uint256 min_mint_amount, bool addUnderlying ) external; } interface ICurveEthSwap { function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external payable returns (uint256); } interface ICurveRegistry { function getSwapAddress(address tokenAddress) external view returns (address swapAddress); function getTokenAddress(address swapAddress) external view returns (address tokenAddress); function getDepositAddress(address swapAddress) external view returns (address depositAddress); function getPoolTokens(address swapAddress) external view returns (address[4] memory poolTokens); function shouldAddUnderlying(address swapAddress) external view returns (bool); function getNumTokens(address swapAddress) external view returns (uint8 numTokens); function isBtcPool(address swapAddress) external view returns (bool); function isEthPool(address swapAddress) external view returns (bool); function isUnderlyingToken( address swapAddress, address tokenContractAddress ) external view returns (bool, uint8); } contract Curve_ZapIn_General_V3_1_1 is ZapInBaseV1 { ICurveRegistry public curveReg; constructor( ICurveRegistry _curveRegistry, uint16 _goodwill, uint16 _affiliateSplit ) public ZapBaseV1(_goodwill, _affiliateSplit) { curveReg = _curveRegistry; goodwill = _goodwill; affiliateSplit = _affiliateSplit; } event zapIn(address sender, address pool, uint256 tokensRec); /** @notice This function adds liquidity to a Curve pool with ETH or ERC20 tokens @param _fromTokenAddress The token used for entry (address(0) if ether) @param _toTokenAddress The intermediate ERC20 token to swap to @param _swapAddress Curve swap address for the pool @param _incomingTokenQty The amount of fromToken to invest @param _minPoolTokens The minimum acceptable quantity of Curve LP to receive. Reverts otherwise @param _swapTarget Excecution target for the first swap @param _swapCallData DEX quote data @param affiliate Affiliate address @return crvTokensBought- Quantity of Curve LP tokens received */ function ZapIn( address _fromTokenAddress, address _toTokenAddress, address _swapAddress, uint256 _incomingTokenQty, uint256 _minPoolTokens, address _swapTarget, bytes calldata _swapCallData, address affiliate ) external payable stopInEmergency returns (uint256 crvTokensBought) { uint256 toInvest = _pullTokens( _fromTokenAddress, _incomingTokenQty, affiliate ); if (_fromTokenAddress == address(0)) { _fromTokenAddress = ETHAddress; } // perform zapIn crvTokensBought = _performZapIn( _fromTokenAddress, _toTokenAddress, _swapAddress, toInvest, _swapTarget, _swapCallData ); require( crvTokensBought > _minPoolTokens, "Received less than minPoolTokens" ); address poolTokenAddress = curveReg.getTokenAddress(_swapAddress); emit zapIn(msg.sender, poolTokenAddress, crvTokensBought); IERC20(poolTokenAddress).transfer(msg.sender, crvTokensBought); } function _performZapIn( address _fromTokenAddress, address _toTokenAddress, address _swapAddress, uint256 toInvest, address _swapTarget, bytes memory _swapCallData ) internal returns (uint256 crvTokensBought) { (bool isUnderlying, uint8 underlyingIndex) = curveReg.isUnderlyingToken( _swapAddress, _fromTokenAddress ); if (isUnderlying) { crvTokensBought = _enterCurve( _swapAddress, toInvest, underlyingIndex ); } else { //swap tokens using 0x swap uint256 tokensBought = _fillQuote( _fromTokenAddress, _toTokenAddress, toInvest, _swapTarget, _swapCallData ); if (_toTokenAddress == address(0)) _toTokenAddress = ETHAddress; //get underlying token index (isUnderlying, underlyingIndex) = curveReg.isUnderlyingToken( _swapAddress, _toTokenAddress ); if (isUnderlying) { crvTokensBought = _enterCurve( _swapAddress, tokensBought, underlyingIndex ); } else { (uint256 tokens, uint8 metaIndex) = _enterMetaPool( _swapAddress, _toTokenAddress, tokensBought ); crvTokensBought = _enterCurve(_swapAddress, tokens, metaIndex); } } } function _pullTokens( address token, uint256 amount, address affiliate ) internal returns (uint256) { uint256 totalGoodwillPortion; if (token == address(0)) { require(msg.value > 0, "No eth sent"); // subtract goodwill totalGoodwillPortion = _subtractGoodwill( ETHAddress, msg.value, affiliate ); return msg.value.sub(totalGoodwillPortion); } require(amount > 0, "Invalid token amount"); require(msg.value == 0, "Eth sent with token"); //transfer token IERC20(token).safeTransferFrom(msg.sender, address(this), amount); // subtract goodwill totalGoodwillPortion = _subtractGoodwill(token, amount, affiliate); return amount.sub(totalGoodwillPortion); } function _subtractGoodwill( address token, uint256 amount, address affiliate ) internal returns (uint256 totalGoodwillPortion) { bool whitelisted = feeWhitelist[msg.sender]; if (!whitelisted && goodwill > 0) { totalGoodwillPortion = SafeMath.div( SafeMath.mul(amount, goodwill), 10000 ); if (affiliates[affiliate]) { uint256 affiliatePortion = totalGoodwillPortion .mul(affiliateSplit) .div(100); affiliateBalance[affiliate][token] = affiliateBalance[affiliate][token] .add(affiliatePortion); totalAffiliateBalance[token] = totalAffiliateBalance[token].add( affiliatePortion ); } } } /** @notice This function gets adds the liquidity for meta pools and returns the token index and swap tokens @param _swapAddress Curve swap address for the pool @param _toTokenAddress The ERC20 token to which from token to be convert @param swapTokens amount of toTokens to invest @return tokensBought- quantity of curve LP acquired @return index- index of LP token in _swapAddress whose pool tokens were acquired */ function _enterMetaPool( address _swapAddress, address _toTokenAddress, uint256 swapTokens ) internal returns (uint256 tokensBought, uint8 index) { address[4] memory poolTokens = curveReg.getPoolTokens(_swapAddress); for (uint8 i = 0; i < 4; i++) { address intermediateSwapAddress = curveReg.getSwapAddress( poolTokens[i] ); if (intermediateSwapAddress != address(0)) { (, index) = curveReg.isUnderlyingToken( intermediateSwapAddress, _toTokenAddress ); tokensBought = _enterCurve( intermediateSwapAddress, swapTokens, index ); return (tokensBought, i); } } } function _fillQuote( address _fromTokenAddress, address _toTokenAddress, uint256 _amount, address _swapTarget, bytes memory _swapCallData ) internal returns (uint256 amountBought) { uint256 valueToSend; if (_fromTokenAddress == _toTokenAddress) { return _amount; } if (_fromTokenAddress == ETHAddress) { valueToSend = _amount; } else { IERC20 fromToken = IERC20(_fromTokenAddress); require( fromToken.balanceOf(address(this)) >= _amount, "Insufficient Balance" ); _approveToken(address(fromToken), _swapTarget); } uint256 initialBalance = _toTokenAddress == address(0) ? address(this).balance : IERC20(_toTokenAddress).balanceOf(address(this)); (bool success, ) = _swapTarget.call.value(valueToSend)(_swapCallData); require(success, "Error Swapping Tokens"); amountBought = _toTokenAddress == address(0) ? (address(this).balance).sub(initialBalance) : IERC20(_toTokenAddress).balanceOf(address(this)).sub( initialBalance ); require(amountBought > 0, "Swapped To Invalid Intermediate"); } /** @notice This function adds liquidity to a curve pool @param _swapAddress Curve swap address for the pool @param amount The quantity of tokens being added as liquidity @param index The token index for the add_liquidity call @return crvTokensBought- the quantity of curve LP tokens received */ function _enterCurve( address _swapAddress, uint256 amount, uint8 index ) internal returns (uint256 crvTokensBought) { address tokenAddress = curveReg.getTokenAddress(_swapAddress); address depositAddress = curveReg.getDepositAddress(_swapAddress); uint256 initialBalance = IERC20(tokenAddress).balanceOf(address(this)); address entryToken = curveReg.getPoolTokens(_swapAddress)[index]; if (entryToken != ETHAddress) { IERC20(entryToken).safeIncreaseAllowance( address(depositAddress), amount ); } uint256 numTokens = curveReg.getNumTokens(_swapAddress); bool addUnderlying = curveReg.shouldAddUnderlying(_swapAddress); if (numTokens == 4) { uint256[4] memory amounts; amounts[index] = amount; if (addUnderlying) { ICurveSwap(depositAddress).add_liquidity(amounts, 0, true); } else { ICurveSwap(depositAddress).add_liquidity(amounts, 0); } } else if (numTokens == 3) { uint256[3] memory amounts; amounts[index] = amount; if (addUnderlying) { ICurveSwap(depositAddress).add_liquidity(amounts, 0, true); } else { ICurveSwap(depositAddress).add_liquidity(amounts, 0); } } else { uint256[2] memory amounts; amounts[index] = amount; if (curveReg.isEthPool(depositAddress)) { ICurveEthSwap(depositAddress).add_liquidity.value(amount)( amounts, 0 ); } else if (addUnderlying) { ICurveSwap(depositAddress).add_liquidity(amounts, 0, true); } else { ICurveSwap(depositAddress).add_liquidity(amounts, 0); } } crvTokensBought = (IERC20(tokenAddress).balanceOf(address(this))).sub( initialBalance ); } function updateCurveRegistry(ICurveRegistry newCurveRegistry) external onlyOwner { require(newCurveRegistry != curveReg, "Already using this Registry"); curveReg = newCurveRegistry; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ICurveRegistry","name":"_curveRegistry","type":"address"},{"internalType":"uint16","name":"_goodwill","type":"uint16"},{"internalType":"uint16","name":"_affiliateSplit","type":"uint16"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensRec","type":"uint256"}],"name":"zapIn","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"address","name":"_fromTokenAddress","type":"address"},{"internalType":"address","name":"_toTokenAddress","type":"address"},{"internalType":"address","name":"_swapAddress","type":"address"},{"internalType":"uint256","name":"_incomingTokenQty","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"},{"internalType":"address","name":"_swapTarget","type":"address"},{"internalType":"bytes","name":"_swapCallData","type":"bytes"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"ZapIn","outputs":[{"internalType":"uint256","name":"crvTokensBought","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"affiliateBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliates","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"affilliateWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"curveReg","outputs":[{"internalType":"contract ICurveRegistry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_affiliate","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"set_affiliate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"zapAddress","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"set_feeWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_new_affiliateSplit","type":"uint256"}],"name":"set_new_affiliateSplit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_new_goodwill","type":"uint256"}],"name":"set_new_goodwill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"toggleContractActive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalAffiliateBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ICurveRegistry","name":"newCurveRegistry","type":"address"}],"name":"updateCurveRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000805460ff60a01b191690553480156200001e57600080fd5b5060405162002ec338038062002ec3833981810160405260608110156200004457600080fd5b508051602082015160409092015190919061ffff8083169082166000620000736001600160e01b03620000f316565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050600780546001600160a01b0319166001600160a01b03959095169490941790935561ffff9182166002551660035550620000f7565b3390565b612dbc80620001076000396000f3fe60806040526004361061011f5760003560e01c80635ecb16cd116100a05780638f32d59b116100645780638f32d59b1461050f578063d408f65714610524578063e595338214610557578063f2fde38b1461058a578063fbec27bf146105bd5761011f565b80635ecb16cd146103a457806364c98c6c14610421578063715018a6146104d057806375f12b21146104e55780638da5cb5b146104fa5761011f565b8063374b09f8116100e7578063374b09f8146102b25780633ff428c7146102e35780634f51e2941461031e578063550bfa56146103655780635de0398e1461038f5761011f565b806301e980d4146101765780630dc9de85146101a05780631385d24c1461021d5780631781261f1461023257806318b135e31461027f575b33321415610174576040805162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c790000000000000000604482015290519081900360640190fd5b005b34801561018257600080fd5b506101746004803603602081101561019957600080fd5b50356105f8565b3480156101ac57600080fd5b50610174600480360360208110156101c357600080fd5b8101906020810181356401000000008111156101de57600080fd5b8201836020820111156101f057600080fd5b8035906020019184602083028401116401000000008311171561021257600080fd5b509092509050610684565b34801561022957600080fd5b50610174610864565b34801561023e57600080fd5b5061026d6004803603604081101561025557600080fd5b506001600160a01b03813581169160200135166108cc565b60408051918252519081900360200190f35b34801561028b57600080fd5b5061026d600480360360208110156102a257600080fd5b50356001600160a01b03166108e9565b3480156102be57600080fd5b506102c76108fb565b604080516001600160a01b039092168252519081900360200190f35b3480156102ef57600080fd5b506101746004803603604081101561030657600080fd5b506001600160a01b038135169060200135151561090a565b34801561032a57600080fd5b506103516004803603602081101561034157600080fd5b50356001600160a01b031661097c565b604080519115158252519081900360200190f35b34801561037157600080fd5b506101746004803603602081101561038857600080fd5b5035610991565b34801561039b57600080fd5b5061026d610a33565b3480156103b057600080fd5b50610174600480360360208110156103c757600080fd5b8101906020810181356401000000008111156103e257600080fd5b8201836020820111156103f457600080fd5b8035906020019184602083028401116401000000008311171561041657600080fd5b509092509050610a39565b61026d600480360361010081101561043857600080fd5b6001600160a01b0382358116926020810135821692604082013583169260608301359260808101359260a08201359092169181019060e0810160c082013564010000000081111561048857600080fd5b82018360208201111561049a57600080fd5b803590602001918460018302840111640100000000831117156104bc57600080fd5b9193509150356001600160a01b0316610c3c565b3480156104dc57600080fd5b50610174610eb3565b3480156104f157600080fd5b50610351610f44565b34801561050657600080fd5b506102c7610f54565b34801561051b57600080fd5b50610351610f63565b34801561053057600080fd5b506103516004803603602081101561054757600080fd5b50356001600160a01b0316610f87565b34801561056357600080fd5b506101746004803603602081101561057a57600080fd5b50356001600160a01b0316610f9c565b34801561059657600080fd5b50610174600480360360208110156105ad57600080fd5b50356001600160a01b0316611068565b3480156105c957600080fd5b50610174600480360360408110156105e057600080fd5b506001600160a01b03813516906020013515156110bb565b610600610f63565b61063f576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b606481111561067f5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ce76021913960400191505060405180910390fd5b600355565b6000805b8281101561085e57336000908152600560205260408120908585848181106106ac57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020549150600060056000336001600160a01b03166001600160a01b03168152602001908152602001600020600086868581811061071457fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000208190555061079b826006600087878681811061075c57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205461112d90919063ffffffff16565b600660008686858181106107ab57fe5b602090810292909201356001600160a01b03168352508101919091526040016000205573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8484838181106107ef57fe5b905060200201356001600160a01b03166001600160a01b0316141561081d576108183383611178565b610856565b610856338386868581811061082e57fe5b905060200201356001600160a01b03166001600160a01b031661125d9092919063ffffffff16565b600101610688565b50505050565b61086c610f63565b6108ab576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6000805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600560209081526000928352604080842090915290825290205481565b60066020526000908152604090205481565b6007546001600160a01b031681565b610912610f63565b610951576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b60046020526000908152604090205460ff1681565b610999610f63565b6109d8576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6064811115610a2e576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b600255565b60025481565b610a41610f63565b610a80576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b60005b81811015610c3757600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee848484818110610aae57fe5b905060200201356001600160a01b03166001600160a01b03161415610b4057610b2060066000868686818110610ae057fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020544761112d90919063ffffffff16565b9050610b3b610b35610b30610f54565b6112af565b82611178565b610c2e565b610c1460066000868686818110610b5357fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054858585818110610b9057fe5b604080516370a0823160e01b81523060048201529051602092830294909401356001600160a01b0316936370a08231935060248083019392829003018186803b158015610bdc57600080fd5b505afa158015610bf0573d6000803e3d6000fd5b505050506040513d6020811015610c0657600080fd5b50519063ffffffff61112d16565b9050610c2e610c21610f54565b8286868681811061082e57fe5b50600101610a83565b505050565b60008054600160a01b900460ff1615610c91576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6000610c9e8b89856112b2565b90506001600160a01b038b16610cc65773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9a505b610d0a8b8b8b848a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061141792505050565b9150868211610d60576040805162461bcd60e51b815260206004820181905260248201527f5265636569766564206c657373207468616e206d696e506f6f6c546f6b656e73604482015290519081900360640190fd5b6007546040805163b8d7b66960e01b81526001600160a01b038c811660048301529151600093929092169163b8d7b66991602480820192602092909190829003018186803b158015610db157600080fd5b505afa158015610dc5573d6000803e3d6000fd5b505050506040513d6020811015610ddb57600080fd5b5051604080513381526001600160a01b038316602082015280820186905290519192507f7f31d76771556dce5ab39ba5b60664743da2629a75c474e9445734b7ad34087d919081900360600190a16040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b0383169163a9059cbb9160448083019260209291908290030181600087803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505050506040513d6020811015610ea257600080fd5b505050509998505050505050505050565b610ebb610f63565b610efa576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600054600160a01b900460ff1681565b6000546001600160a01b031690565b600080546001600160a01b0316610f786115c7565b6001600160a01b031614905090565b60016020526000908152604090205460ff1681565b610fa4610f63565b610fe3576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6007546001600160a01b0382811691161415611046576040805162461bcd60e51b815260206004820152601b60248201527f416c7265616479207573696e6720746869732052656769737472790000000000604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611070610f63565b6110af576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6110b8816115cb565b50565b6110c3610f63565b611102576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600061116f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061166b565b90505b92915050565b804710156111cd576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114611218576040519150601f19603f3d011682016040523d82523d6000602084013e61121d565b606091505b5050905080610c375760405162461bcd60e51b815260040180806020018281038252603a815260200180612c8c603a913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c37908490611702565b90565b6000806001600160a01b03851661133f5760003411611306576040805162461bcd60e51b815260206004820152600b60248201526a139bc8195d1a081cd95b9d60aa1b604482015290519081900360640190fd5b61132573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee34856118ba565b9050611337348263ffffffff61112d16565b915050611410565b6000841161138b576040805162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081d1bdad95b88185b5bdd5b9d60621b604482015290519081900360640190fd5b34156113d4576040805162461bcd60e51b815260206004820152601360248201527222ba341039b2b73a103bb4ba34103a37b5b2b760691b604482015290519081900360640190fd5b6113ef6001600160a01b03861633308763ffffffff6119e416565b6113fa8585856118ba565b905061140c848263ffffffff61112d16565b9150505b9392505050565b600754604080516301e09fa360e41b81526001600160a01b03878116600483015289811660248301528251600094859485949390911692631e09fa309260448083019392829003018186803b15801561146f57600080fd5b505afa158015611483573d6000803e3d6000fd5b505050506040513d604081101561149957600080fd5b508051602090910151909250905081156114bf576114b8878783611a3e565b92506115bb565b60006114ce8a8a898989612263565b90506001600160a01b0389166114f65773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee98505b600754604080516301e09fa360e41b81526001600160a01b038b811660048301528c811660248301528251931692631e09fa3092604480840193919291829003018186803b15801561154757600080fd5b505afa15801561155b573d6000803e3d6000fd5b505050506040513d604081101561157157600080fd5b5080516020909101519093509150821561159757611590888284611a3e565b93506115b9565b6000806115a58a8c856125d3565b915091506115b48a8383611a3e565b955050505b505b50509695505050505050565b3390565b6001600160a01b0381166116105760405162461bcd60e51b8152600401808060200182810382526026815260200180612c666026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081848411156116fa5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156116bf5781810151838201526020016116a7565b50505050905090810190601f1680156116ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b611714826001600160a01b03166127cf565b611765576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106117a35780518252601f199092019160209182019101611784565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611805576040519150601f19603f3d011682016040523d82523d6000602084013e61180a565b606091505b509150915081611861576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561085e5780806020019051602081101561187d57600080fd5b505161085e5760405162461bcd60e51b815260040180806020018281038252602a815260200180612d28602a913960400191505060405180910390fd5b3360009081526001602052604081205460ff16801580156118dd57506000600254115b156119dc576118f96118f18560025461280b565b612710612864565b6001600160a01b03841660009081526004602052604090205490925060ff16156119dc57600061194560646119396003548661280b90919063ffffffff16565b9063ffffffff61286416565b6001600160a01b038086166000908152600560209081526040808320938b168352929052205490915061197e908263ffffffff6128a616565b6001600160a01b038086166000908152600560209081526040808320938b1683529281528282209390935560069092529020546119c1908263ffffffff6128a616565b6001600160a01b038716600090815260066020526040902055505b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261085e908590611702565b6007546040805163b8d7b66960e01b81526001600160a01b03868116600483015291516000938493169163b8d7b669916024808301926020929190829003018186803b158015611a8d57600080fd5b505afa158015611aa1573d6000803e3d6000fd5b505050506040513d6020811015611ab757600080fd5b50516007546040805163d83a7f6760e01b81526001600160a01b0389811660048301529151939450600093919092169163d83a7f67916024808301926020929190829003018186803b158015611b0c57600080fd5b505afa158015611b20573d6000803e3d6000fd5b505050506040513d6020811015611b3657600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015611b8457600080fd5b505afa158015611b98573d6000803e3d6000fd5b505050506040513d6020811015611bae57600080fd5b50516007546040805163ca4f280360e01b81526001600160a01b038b811660048301529151939450600093919092169163ca4f2803916024808301926080929190829003018186803b158015611c0357600080fd5b505afa158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506080811015611c3c57600080fd5b5060ff871660048110611c4b57fe5b602002015190506001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c9057611c906001600160a01b038216848963ffffffff61290016565b60075460408051633aa3eb0160e01b81526001600160a01b038b8116600483015291516000939290921691633aa3eb0191602480820192602092909190829003018186803b158015611ce157600080fd5b505afa158015611cf5573d6000803e3d6000fd5b505050506040513d6020811015611d0b57600080fd5b505160075460408051630a6954a960e21b81526001600160a01b038d81166004830152915160ff909416945060009391909216916329a552a4916024808301926020929190829003018186803b158015611d6457600080fd5b505afa158015611d78573d6000803e3d6000fd5b505050506040513d6020811015611d8e57600080fd5b505190506004821415611eeb57611da3612c0b565b89818a60ff1660048110611db357fe5b60200201528115611e5b5760405163dc3a2d8160e01b81526001600160a01b0387169063dc3a2d8190839060009060019060040180846080808383885b83811015611e08578181015183820152602001611df0565b50505050905001838152602001821515151581526020019350505050600060405180830381600087803b158015611e3e57600080fd5b505af1158015611e52573d6000803e3d6000fd5b50505050611ee5565b60405162a6cbcd60e21b81526001600160a01b0387169063029b2f3490839060009060040180836080808383875b83811015611ea1578181015183820152602001611e89565b5050505090500182815260200192505050600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050505b50612209565b8160031415611f9057611efc612c29565b89818a60ff1660038110611f0c57fe5b60200201528115611f55576040516315b74c9d60e11b8152815160049091019081526001600160a01b03871690632b6e993a908390600090600190808460608083836020611df0565b604051634515cef360e01b8152815160049091019081526001600160a01b03871690634515cef3908390600090808360608083836020611e89565b611f98612c47565b89818a60ff1660028110611fa857fe5b6020908102919091019190915260075460408051636002a82360e11b81526001600160a01b038a811660048301529151919092169263c00550469260248082019391829003018186803b158015611ffe57600080fd5b505afa158015612012573d6000803e3d6000fd5b505050506040513d602081101561202857600080fd5b5051156120d657856001600160a01b0316630b4c7e4d8b8360006040518463ffffffff1660e01b81526004018083600260200280838360005b83811015612079578181015183820152602001612061565b50505050905001828152602001925050506020604051808303818588803b1580156120a357600080fd5b505af11580156120b7573d6000803e3d6000fd5b50505050506040513d60208110156120ce57600080fd5b506122079050565b811561217a57856001600160a01b031663ee22be2382600060016040518463ffffffff1660e01b81526004018084600260200280838360005b8381101561212757818101518382015260200161210f565b50505050905001838152602001821515151581526020019350505050600060405180830381600087803b15801561215d57600080fd5b505af1158015612171573d6000803e3d6000fd5b50505050612207565b856001600160a01b0316630b4c7e4d8260006040518363ffffffff1660e01b81526004018083600260200280838360005b838110156121c35781810151838201526020016121ab565b5050505090500182815260200192505050600060405180830381600087803b1580156121ee57600080fd5b505af1158015612202573d6000803e3d6000fd5b505050505b505b604080516370a0823160e01b815230600482015290516122559186916001600160a01b038a16916370a08231916024808301926020929190829003018186803b158015610bdc57600080fd5b9a9950505050505050505050565b600080856001600160a01b0316876001600160a01b0316141561228957849150506125ca565b6001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156122b5575083612381565b604080516370a0823160e01b81523060048201529051889187916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156122ff57600080fd5b505afa158015612313573d6000803e3d6000fd5b505050506040513d602081101561232957600080fd5b50511015612375576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b61237f81866129e6565b505b60006001600160a01b0387161561240957604080516370a0823160e01b815230600482015290516001600160a01b038916916370a08231916024808301926020929190829003018186803b1580156123d857600080fd5b505afa1580156123ec573d6000803e3d6000fd5b505050506040513d602081101561240257600080fd5b505161240b565b475b90506000856001600160a01b031683866040518082805190602001908083835b6020831061244a5780518252601f19909201916020918201910161242b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146124ac576040519150601f19603f3d011682016040523d82523d6000602084013e6124b1565b606091505b50509050806124ff576040805162461bcd60e51b81526020600482015260156024820152744572726f72205377617070696e6720546f6b656e7360581b604482015290519081900360640190fd5b6001600160a01b0388161561255f57604080516370a0823160e01b8152306004820152905161255a9184916001600160a01b038c16916370a08231916024808301926020929190829003018186803b158015610bdc57600080fd5b61256f565b61256f478363ffffffff61112d16565b9350600084116125c6576040805162461bcd60e51b815260206004820152601f60248201527f5377617070656420546f20496e76616c696420496e7465726d65646961746500604482015290519081900360640190fd5b5050505b95945050505050565b6000806125de612c0b565b6007546040805163ca4f280360e01b81526001600160a01b0389811660048301529151919092169163ca4f2803916024808301926080929190829003018186803b15801561262b57600080fd5b505afa15801561263f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250608081101561266457600080fd5b50905060005b60048160ff1610156127c4576007546000906001600160a01b031663bbff1a668460ff85166004811061269957fe5b60200201516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156126e457600080fd5b505afa1580156126f8573d6000803e3d6000fd5b505050506040513d602081101561270e57600080fd5b505190506001600160a01b038116156127bb57600754604080516301e09fa360e41b81526001600160a01b0384811660048301528a811660248301528251931692631e09fa3092604480840193919291829003018186803b15801561277257600080fd5b505afa158015612786573d6000803e3d6000fd5b505050506040513d604081101561279c57600080fd5b506020015193506127ae818786611a3e565b94509092506127c7915050565b5060010161266a565b50505b935093915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061280357508115155b949350505050565b60008261281a57506000611172565b8282028284828161282757fe5b041461116f5760405162461bcd60e51b8152600401808060200182810382526021815260200180612cc66021913960400191505060405180910390fd5b600061116f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a93565b60008282018381101561116f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291516000926129919285929188169163dd62ed3e91604480820192602092909190829003018186803b15801561295957600080fd5b505afa15801561296d573d6000803e3d6000fd5b505050506040513d602081101561298357600080fd5b50519063ffffffff6128a616565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905290915061085e908590611702565b60408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915184926000929084169163dd62ed3e91604480820192602092909190829003018186803b158015612a3b57600080fd5b505afa158015612a4f573d6000803e3d6000fd5b505050506040513d6020811015612a6557600080fd5b50511115612a735750612a8f565b610c376001600160a01b0382168360001963ffffffff612af816565b5050565b60008183612ae25760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156116bf5781810151838201526020016116a7565b506000838581612aee57fe5b0495945050505050565b801580612b7e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b5051155b612bb95760405162461bcd60e51b8152600401808060200182810382526036815260200180612d526036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610c37908490611702565b60405180608001604052806004906020820280388339509192915050565b60405180606001604052806003906020820280388339509192915050565b6040518060400160405280600290602082028038833950919291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77416666696c696174652053706c69742056616c7565206e6f7420616c6c6f7765644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582058c94f492b1cfc709f909e32cd991aeac0b771483986ced46af98a7cb52f8da664736f6c634300051100320000000000000000000000008aee0a8a05a319bfca41ff2e95c48f3f8638321100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061011f5760003560e01c80635ecb16cd116100a05780638f32d59b116100645780638f32d59b1461050f578063d408f65714610524578063e595338214610557578063f2fde38b1461058a578063fbec27bf146105bd5761011f565b80635ecb16cd146103a457806364c98c6c14610421578063715018a6146104d057806375f12b21146104e55780638da5cb5b146104fa5761011f565b8063374b09f8116100e7578063374b09f8146102b25780633ff428c7146102e35780634f51e2941461031e578063550bfa56146103655780635de0398e1461038f5761011f565b806301e980d4146101765780630dc9de85146101a05780631385d24c1461021d5780631781261f1461023257806318b135e31461027f575b33321415610174576040805162461bcd60e51b815260206004820152601860248201527f446f206e6f742073656e6420455448206469726563746c790000000000000000604482015290519081900360640190fd5b005b34801561018257600080fd5b506101746004803603602081101561019957600080fd5b50356105f8565b3480156101ac57600080fd5b50610174600480360360208110156101c357600080fd5b8101906020810181356401000000008111156101de57600080fd5b8201836020820111156101f057600080fd5b8035906020019184602083028401116401000000008311171561021257600080fd5b509092509050610684565b34801561022957600080fd5b50610174610864565b34801561023e57600080fd5b5061026d6004803603604081101561025557600080fd5b506001600160a01b03813581169160200135166108cc565b60408051918252519081900360200190f35b34801561028b57600080fd5b5061026d600480360360208110156102a257600080fd5b50356001600160a01b03166108e9565b3480156102be57600080fd5b506102c76108fb565b604080516001600160a01b039092168252519081900360200190f35b3480156102ef57600080fd5b506101746004803603604081101561030657600080fd5b506001600160a01b038135169060200135151561090a565b34801561032a57600080fd5b506103516004803603602081101561034157600080fd5b50356001600160a01b031661097c565b604080519115158252519081900360200190f35b34801561037157600080fd5b506101746004803603602081101561038857600080fd5b5035610991565b34801561039b57600080fd5b5061026d610a33565b3480156103b057600080fd5b50610174600480360360208110156103c757600080fd5b8101906020810181356401000000008111156103e257600080fd5b8201836020820111156103f457600080fd5b8035906020019184602083028401116401000000008311171561041657600080fd5b509092509050610a39565b61026d600480360361010081101561043857600080fd5b6001600160a01b0382358116926020810135821692604082013583169260608301359260808101359260a08201359092169181019060e0810160c082013564010000000081111561048857600080fd5b82018360208201111561049a57600080fd5b803590602001918460018302840111640100000000831117156104bc57600080fd5b9193509150356001600160a01b0316610c3c565b3480156104dc57600080fd5b50610174610eb3565b3480156104f157600080fd5b50610351610f44565b34801561050657600080fd5b506102c7610f54565b34801561051b57600080fd5b50610351610f63565b34801561053057600080fd5b506103516004803603602081101561054757600080fd5b50356001600160a01b0316610f87565b34801561056357600080fd5b506101746004803603602081101561057a57600080fd5b50356001600160a01b0316610f9c565b34801561059657600080fd5b50610174600480360360208110156105ad57600080fd5b50356001600160a01b0316611068565b3480156105c957600080fd5b50610174600480360360408110156105e057600080fd5b506001600160a01b03813516906020013515156110bb565b610600610f63565b61063f576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b606481111561067f5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ce76021913960400191505060405180910390fd5b600355565b6000805b8281101561085e57336000908152600560205260408120908585848181106106ac57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020549150600060056000336001600160a01b03166001600160a01b03168152602001908152602001600020600086868581811061071457fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000208190555061079b826006600087878681811061075c57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205461112d90919063ffffffff16565b600660008686858181106107ab57fe5b602090810292909201356001600160a01b03168352508101919091526040016000205573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8484838181106107ef57fe5b905060200201356001600160a01b03166001600160a01b0316141561081d576108183383611178565b610856565b610856338386868581811061082e57fe5b905060200201356001600160a01b03166001600160a01b031661125d9092919063ffffffff16565b600101610688565b50505050565b61086c610f63565b6108ab576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6000805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600560209081526000928352604080842090915290825290205481565b60066020526000908152604090205481565b6007546001600160a01b031681565b610912610f63565b610951576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b60046020526000908152604090205460ff1681565b610999610f63565b6109d8576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6064811115610a2e576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b600255565b60025481565b610a41610f63565b610a80576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b60005b81811015610c3757600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee848484818110610aae57fe5b905060200201356001600160a01b03166001600160a01b03161415610b4057610b2060066000868686818110610ae057fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020544761112d90919063ffffffff16565b9050610b3b610b35610b30610f54565b6112af565b82611178565b610c2e565b610c1460066000868686818110610b5357fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002054858585818110610b9057fe5b604080516370a0823160e01b81523060048201529051602092830294909401356001600160a01b0316936370a08231935060248083019392829003018186803b158015610bdc57600080fd5b505afa158015610bf0573d6000803e3d6000fd5b505050506040513d6020811015610c0657600080fd5b50519063ffffffff61112d16565b9050610c2e610c21610f54565b8286868681811061082e57fe5b50600101610a83565b505050565b60008054600160a01b900460ff1615610c91576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b6000610c9e8b89856112b2565b90506001600160a01b038b16610cc65773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9a505b610d0a8b8b8b848a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061141792505050565b9150868211610d60576040805162461bcd60e51b815260206004820181905260248201527f5265636569766564206c657373207468616e206d696e506f6f6c546f6b656e73604482015290519081900360640190fd5b6007546040805163b8d7b66960e01b81526001600160a01b038c811660048301529151600093929092169163b8d7b66991602480820192602092909190829003018186803b158015610db157600080fd5b505afa158015610dc5573d6000803e3d6000fd5b505050506040513d6020811015610ddb57600080fd5b5051604080513381526001600160a01b038316602082015280820186905290519192507f7f31d76771556dce5ab39ba5b60664743da2629a75c474e9445734b7ad34087d919081900360600190a16040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b0383169163a9059cbb9160448083019260209291908290030181600087803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505050506040513d6020811015610ea257600080fd5b505050509998505050505050505050565b610ebb610f63565b610efa576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600054600160a01b900460ff1681565b6000546001600160a01b031690565b600080546001600160a01b0316610f786115c7565b6001600160a01b031614905090565b60016020526000908152604090205460ff1681565b610fa4610f63565b610fe3576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6007546001600160a01b0382811691161415611046576040805162461bcd60e51b815260206004820152601b60248201527f416c7265616479207573696e6720746869732052656769737472790000000000604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611070610f63565b6110af576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6110b8816115cb565b50565b6110c3610f63565b611102576040805162461bcd60e51b81526020600482018190526024820152600080516020612d08833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600061116f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061166b565b90505b92915050565b804710156111cd576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114611218576040519150601f19603f3d011682016040523d82523d6000602084013e61121d565b606091505b5050905080610c375760405162461bcd60e51b815260040180806020018281038252603a815260200180612c8c603a913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c37908490611702565b90565b6000806001600160a01b03851661133f5760003411611306576040805162461bcd60e51b815260206004820152600b60248201526a139bc8195d1a081cd95b9d60aa1b604482015290519081900360640190fd5b61132573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee34856118ba565b9050611337348263ffffffff61112d16565b915050611410565b6000841161138b576040805162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081d1bdad95b88185b5bdd5b9d60621b604482015290519081900360640190fd5b34156113d4576040805162461bcd60e51b815260206004820152601360248201527222ba341039b2b73a103bb4ba34103a37b5b2b760691b604482015290519081900360640190fd5b6113ef6001600160a01b03861633308763ffffffff6119e416565b6113fa8585856118ba565b905061140c848263ffffffff61112d16565b9150505b9392505050565b600754604080516301e09fa360e41b81526001600160a01b03878116600483015289811660248301528251600094859485949390911692631e09fa309260448083019392829003018186803b15801561146f57600080fd5b505afa158015611483573d6000803e3d6000fd5b505050506040513d604081101561149957600080fd5b508051602090910151909250905081156114bf576114b8878783611a3e565b92506115bb565b60006114ce8a8a898989612263565b90506001600160a01b0389166114f65773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee98505b600754604080516301e09fa360e41b81526001600160a01b038b811660048301528c811660248301528251931692631e09fa3092604480840193919291829003018186803b15801561154757600080fd5b505afa15801561155b573d6000803e3d6000fd5b505050506040513d604081101561157157600080fd5b5080516020909101519093509150821561159757611590888284611a3e565b93506115b9565b6000806115a58a8c856125d3565b915091506115b48a8383611a3e565b955050505b505b50509695505050505050565b3390565b6001600160a01b0381166116105760405162461bcd60e51b8152600401808060200182810382526026815260200180612c666026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081848411156116fa5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156116bf5781810151838201526020016116a7565b50505050905090810190601f1680156116ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b611714826001600160a01b03166127cf565b611765576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106117a35780518252601f199092019160209182019101611784565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611805576040519150601f19603f3d011682016040523d82523d6000602084013e61180a565b606091505b509150915081611861576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561085e5780806020019051602081101561187d57600080fd5b505161085e5760405162461bcd60e51b815260040180806020018281038252602a815260200180612d28602a913960400191505060405180910390fd5b3360009081526001602052604081205460ff16801580156118dd57506000600254115b156119dc576118f96118f18560025461280b565b612710612864565b6001600160a01b03841660009081526004602052604090205490925060ff16156119dc57600061194560646119396003548661280b90919063ffffffff16565b9063ffffffff61286416565b6001600160a01b038086166000908152600560209081526040808320938b168352929052205490915061197e908263ffffffff6128a616565b6001600160a01b038086166000908152600560209081526040808320938b1683529281528282209390935560069092529020546119c1908263ffffffff6128a616565b6001600160a01b038716600090815260066020526040902055505b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261085e908590611702565b6007546040805163b8d7b66960e01b81526001600160a01b03868116600483015291516000938493169163b8d7b669916024808301926020929190829003018186803b158015611a8d57600080fd5b505afa158015611aa1573d6000803e3d6000fd5b505050506040513d6020811015611ab757600080fd5b50516007546040805163d83a7f6760e01b81526001600160a01b0389811660048301529151939450600093919092169163d83a7f67916024808301926020929190829003018186803b158015611b0c57600080fd5b505afa158015611b20573d6000803e3d6000fd5b505050506040513d6020811015611b3657600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015611b8457600080fd5b505afa158015611b98573d6000803e3d6000fd5b505050506040513d6020811015611bae57600080fd5b50516007546040805163ca4f280360e01b81526001600160a01b038b811660048301529151939450600093919092169163ca4f2803916024808301926080929190829003018186803b158015611c0357600080fd5b505afa158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506080811015611c3c57600080fd5b5060ff871660048110611c4b57fe5b602002015190506001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c9057611c906001600160a01b038216848963ffffffff61290016565b60075460408051633aa3eb0160e01b81526001600160a01b038b8116600483015291516000939290921691633aa3eb0191602480820192602092909190829003018186803b158015611ce157600080fd5b505afa158015611cf5573d6000803e3d6000fd5b505050506040513d6020811015611d0b57600080fd5b505160075460408051630a6954a960e21b81526001600160a01b038d81166004830152915160ff909416945060009391909216916329a552a4916024808301926020929190829003018186803b158015611d6457600080fd5b505afa158015611d78573d6000803e3d6000fd5b505050506040513d6020811015611d8e57600080fd5b505190506004821415611eeb57611da3612c0b565b89818a60ff1660048110611db357fe5b60200201528115611e5b5760405163dc3a2d8160e01b81526001600160a01b0387169063dc3a2d8190839060009060019060040180846080808383885b83811015611e08578181015183820152602001611df0565b50505050905001838152602001821515151581526020019350505050600060405180830381600087803b158015611e3e57600080fd5b505af1158015611e52573d6000803e3d6000fd5b50505050611ee5565b60405162a6cbcd60e21b81526001600160a01b0387169063029b2f3490839060009060040180836080808383875b83811015611ea1578181015183820152602001611e89565b5050505090500182815260200192505050600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050505b50612209565b8160031415611f9057611efc612c29565b89818a60ff1660038110611f0c57fe5b60200201528115611f55576040516315b74c9d60e11b8152815160049091019081526001600160a01b03871690632b6e993a908390600090600190808460608083836020611df0565b604051634515cef360e01b8152815160049091019081526001600160a01b03871690634515cef3908390600090808360608083836020611e89565b611f98612c47565b89818a60ff1660028110611fa857fe5b6020908102919091019190915260075460408051636002a82360e11b81526001600160a01b038a811660048301529151919092169263c00550469260248082019391829003018186803b158015611ffe57600080fd5b505afa158015612012573d6000803e3d6000fd5b505050506040513d602081101561202857600080fd5b5051156120d657856001600160a01b0316630b4c7e4d8b8360006040518463ffffffff1660e01b81526004018083600260200280838360005b83811015612079578181015183820152602001612061565b50505050905001828152602001925050506020604051808303818588803b1580156120a357600080fd5b505af11580156120b7573d6000803e3d6000fd5b50505050506040513d60208110156120ce57600080fd5b506122079050565b811561217a57856001600160a01b031663ee22be2382600060016040518463ffffffff1660e01b81526004018084600260200280838360005b8381101561212757818101518382015260200161210f565b50505050905001838152602001821515151581526020019350505050600060405180830381600087803b15801561215d57600080fd5b505af1158015612171573d6000803e3d6000fd5b50505050612207565b856001600160a01b0316630b4c7e4d8260006040518363ffffffff1660e01b81526004018083600260200280838360005b838110156121c35781810151838201526020016121ab565b5050505090500182815260200192505050600060405180830381600087803b1580156121ee57600080fd5b505af1158015612202573d6000803e3d6000fd5b505050505b505b604080516370a0823160e01b815230600482015290516122559186916001600160a01b038a16916370a08231916024808301926020929190829003018186803b158015610bdc57600080fd5b9a9950505050505050505050565b600080856001600160a01b0316876001600160a01b0316141561228957849150506125ca565b6001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156122b5575083612381565b604080516370a0823160e01b81523060048201529051889187916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156122ff57600080fd5b505afa158015612313573d6000803e3d6000fd5b505050506040513d602081101561232957600080fd5b50511015612375576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b61237f81866129e6565b505b60006001600160a01b0387161561240957604080516370a0823160e01b815230600482015290516001600160a01b038916916370a08231916024808301926020929190829003018186803b1580156123d857600080fd5b505afa1580156123ec573d6000803e3d6000fd5b505050506040513d602081101561240257600080fd5b505161240b565b475b90506000856001600160a01b031683866040518082805190602001908083835b6020831061244a5780518252601f19909201916020918201910161242b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146124ac576040519150601f19603f3d011682016040523d82523d6000602084013e6124b1565b606091505b50509050806124ff576040805162461bcd60e51b81526020600482015260156024820152744572726f72205377617070696e6720546f6b656e7360581b604482015290519081900360640190fd5b6001600160a01b0388161561255f57604080516370a0823160e01b8152306004820152905161255a9184916001600160a01b038c16916370a08231916024808301926020929190829003018186803b158015610bdc57600080fd5b61256f565b61256f478363ffffffff61112d16565b9350600084116125c6576040805162461bcd60e51b815260206004820152601f60248201527f5377617070656420546f20496e76616c696420496e7465726d65646961746500604482015290519081900360640190fd5b5050505b95945050505050565b6000806125de612c0b565b6007546040805163ca4f280360e01b81526001600160a01b0389811660048301529151919092169163ca4f2803916024808301926080929190829003018186803b15801561262b57600080fd5b505afa15801561263f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250608081101561266457600080fd5b50905060005b60048160ff1610156127c4576007546000906001600160a01b031663bbff1a668460ff85166004811061269957fe5b60200201516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156126e457600080fd5b505afa1580156126f8573d6000803e3d6000fd5b505050506040513d602081101561270e57600080fd5b505190506001600160a01b038116156127bb57600754604080516301e09fa360e41b81526001600160a01b0384811660048301528a811660248301528251931692631e09fa3092604480840193919291829003018186803b15801561277257600080fd5b505afa158015612786573d6000803e3d6000fd5b505050506040513d604081101561279c57600080fd5b506020015193506127ae818786611a3e565b94509092506127c7915050565b5060010161266a565b50505b935093915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061280357508115155b949350505050565b60008261281a57506000611172565b8282028284828161282757fe5b041461116f5760405162461bcd60e51b8152600401808060200182810382526021815260200180612cc66021913960400191505060405180910390fd5b600061116f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a93565b60008282018381101561116f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291516000926129919285929188169163dd62ed3e91604480820192602092909190829003018186803b15801561295957600080fd5b505afa15801561296d573d6000803e3d6000fd5b505050506040513d602081101561298357600080fd5b50519063ffffffff6128a616565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905290915061085e908590611702565b60408051636eb1769f60e11b81523060048201526001600160a01b038381166024830152915184926000929084169163dd62ed3e91604480820192602092909190829003018186803b158015612a3b57600080fd5b505afa158015612a4f573d6000803e3d6000fd5b505050506040513d6020811015612a6557600080fd5b50511115612a735750612a8f565b610c376001600160a01b0382168360001963ffffffff612af816565b5050565b60008183612ae25760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156116bf5781810151838201526020016116a7565b506000838581612aee57fe5b0495945050505050565b801580612b7e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b5051155b612bb95760405162461bcd60e51b8152600401808060200182810382526036815260200180612d526036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610c37908490611702565b60405180608001604052806004906020820280388339509192915050565b60405180606001604052806003906020820280388339509192915050565b6040518060400160405280600290602082028038833950919291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77416666696c696174652053706c69742056616c7565206e6f7420616c6c6f7765644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582058c94f492b1cfc709f909e32cd991aeac0b771483986ced46af98a7cb52f8da664736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008aee0a8a05a319bfca41ff2e95c48f3f8638321100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _curveRegistry (address): 0x8AEE0a8A05A319BfCa41fF2E95C48f3F86383211
Arg [1] : _goodwill (uint16): 0
Arg [2] : _affiliateSplit (uint16): 0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008aee0a8a05a319bfca41ff2e95c48f3f86383211
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
30544:11263:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25992:10;26006:9;25992:23;;25984:60;;;;;-1:-1:-1;;;25984:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30544:11263;24081:278;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24081:278:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24081:278:0;;:::i;25323:614::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25323:614:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25323:614:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;25323:614:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25323:614:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;25323:614:0;;-1:-1:-1;25323:614:0;-1:-1:-1;25323:614:0;:::i;23580:86::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23580:86:0;;;:::i;22375:71::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22375:71:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22375:71:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22477:56;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22477:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22477:56:0;-1:-1:-1;;;;;22477:56:0;;:::i;30602:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30602:30:0;;;:::i;:::-;;;;-1:-1:-1;;;;;30602:30:0;;;;;;;;;;;;;;24367:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24367:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24367:150:0;;;;;;;;;;:::i;22289:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22289:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22289:42:0;-1:-1:-1;;;;;22289:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;23835:238;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23835:238:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23835:238:0;;:::i;22164:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22164:23:0;;;:::i;24593:654::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24593:654:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24593:654:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;24593:654:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24593:654:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;24593:654:0;;-1:-1:-1;24593:654:0;-1:-1:-1;24593:654:0;:::i;31677:1205::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;31677:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;31677:1205:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31677:1205:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;31677:1205:0;;-1:-1:-1;31677:1205:0;-1:-1:-1;31677:1205:0;-1:-1:-1;;;;;31677:1205:0;;:::i;4793:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4793:140:0;;;:::i;22033:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22033:27:0;;;:::i;3982:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3982:79:0;;;:::i;4348:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4348:94:0;;;:::i;22111:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22111:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22111:44:0;-1:-1:-1;;;;;22111:44:0;;:::i;41575:229::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41575:229:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41575:229:0;-1:-1:-1;;;;;41575:229:0;;:::i;5088:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5088:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5088:109:0;-1:-1:-1;;;;;5088:109:0;;:::i;23674:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23674:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23674:153:0;;;;;;;;;;:::i;24081:278::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;24240:3;24217:19;:26;;24195:109;;;;-1:-1:-1;;;24195:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24315:14;:36;24081:278::o;25323:614::-;25398:16;;25425:505;25445:17;;;25425:505;;;25512:10;25495:28;;;;:16;:28;;;;;;25524:6;;25531:1;25524:9;;;;;;;;;;;;;-1:-1:-1;;;;;25524:9:0;-1:-1:-1;;;;;25495:39:0;-1:-1:-1;;;;;25495:39:0;;;;;;;;;;;;;25484:50;;25591:1;25549:16;:28;25566:10;-1:-1:-1;;;;;25549:28:0;-1:-1:-1;;;;;25549:28:0;;;;;;;;;;;;:39;25578:6;;25585:1;25578:9;;;;;;;;;;;;;-1:-1:-1;;;;;25578:9:0;-1:-1:-1;;;;;25549:39:0;-1:-1:-1;;;;;25549:39:0;;;;;;;;;;;;:43;;;;25642:64;25697:8;25642:21;:32;25664:6;;25671:1;25664:9;;;;;;;;;;;;;-1:-1:-1;;;;;25664:9:0;-1:-1:-1;;;;;25642:32:0;-1:-1:-1;;;;;25642:32:0;;;;;;;;;;;;;:54;;:64;;;;:::i;:::-;25607:21;:32;25629:6;;25636:1;25629:9;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25629:9:0;25607:32;;-1:-1:-1;25607:32:0;;;;;;;;-1:-1:-1;25607:32:0;:99;22590:42;25727:6;;25734:1;25727:9;;;;;;;;;;;;;-1:-1:-1;;;;;25727:9:0;-1:-1:-1;;;;;25727:23:0;;25723:196;;;25771:39;25789:10;25801:8;25771:17;:39::i;:::-;25723:196;;;25851:52;25882:10;25894:8;25858:6;;25865:1;25858:9;;;;;;;;;;;;;-1:-1:-1;;;;;25858:9:0;-1:-1:-1;;;;;25851:30:0;;;:52;;;;;:::i;:::-;25464:3;;25425:505;;;;25323:614;;;:::o;23580:86::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;23651:7;;;-1:-1:-1;;;;23640:18:0;;-1:-1:-1;;;23651:7:0;;;;;;23650:8;23640:18;;;;;;23580:86::o;22375:71::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;22477:56::-;;;;;;;;;;;;;:::o;30602:30::-;;;-1:-1:-1;;;;;30602:30:0;;:::o;24367:150::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24477:22:0;;;;;;;;:10;:22;;;;;:32;;-1:-1:-1;;24477:32:0;;;;;;;;;;24367:150::o;22289:42::-;;;;;;;;;;;;;;;:::o;23835:238::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;23973:3;23956:13;:20;;23912:118;;;;;-1:-1:-1;;;23912:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24041:8;:24;23835:238::o;22164:23::-;;;;:::o;24593:654::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;24679:9;24674:566;24694:17;;;24674:566;;;24733:11;22590:42;24765:6;;24772:1;24765:9;;;;;;;;;;;;;-1:-1:-1;;;;;24765:9:0;-1:-1:-1;;;;;24765:23:0;;24761:468;;;24815:99;24863:21;:32;24885:6;;24892:1;24885:9;;;;;;;;;;;;;-1:-1:-1;;;;;24885:9:0;-1:-1:-1;;;;;24863:32:0;-1:-1:-1;;;;;24863:32:0;;;;;;;;;;;;;24815:21;:25;;:99;;;;:::i;:::-;24809:105;;24933:50;24951:26;24969:7;:5;:7::i;:::-;24951:17;:26::i;:::-;24979:3;24933:17;:50::i;:::-;24761:468;;;25030:120;25099:21;:32;25121:6;;25128:1;25121:9;;;;;;;;;;;;;-1:-1:-1;;;;;25121:9:0;-1:-1:-1;;;;;25099:32:0;-1:-1:-1;;;;;25099:32:0;;;;;;;;;;;;;25037:6;;25044:1;25037:9;;;;;;;25030:42;;;-1:-1:-1;;;25030:42:0;;25066:4;25030:42;;;;;;25037:9;;;;;;;;;-1:-1:-1;;;;;25037:9:0;;25030:27;;-1:-1:-1;25030:42:0;;;;;25037:9;25030:42;;;;;25037:9;25030:42;;;5:2:-1;;;;30:1;27;20:12;5:2;25030:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25030:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25030:42:0;;:120;:46;:120;:::i;:::-;25024:126;;25169:44;25200:7;:5;:7::i;:::-;25209:3;25176:6;;25183:1;25176:9;;;;;;25169:44;-1:-1:-1;24713:3:0;;24674:566;;;;24593:654;;:::o;31677:1205::-;32008:23;22868:7;;-1:-1:-1;;;22868:7:0;;;;22864:102;;;22892:28;;;-1:-1:-1;;;22892:28:0;;;;;;;;;;;;-1:-1:-1;;;22892:28:0;;;;;;;;;;;;;;22864:102;32044:16;32063:110;32089:17;32121;32153:9;32063:11;:110::i;:::-;32044:129;-1:-1:-1;;;;;;32188:31:0;;32184:94;;22590:42;32236:30;;32184:94;32334:190;32362:17;32394:15;32424:12;32451:8;32474:11;32500:13;;32334:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;32334:13:0;;-1:-1:-1;;;32334:190:0:i;:::-;32316:208;;32577:14;32559:15;:32;32537:114;;;;;-1:-1:-1;;;32537:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32691:8;;:38;;;-1:-1:-1;;;32691:38:0;;-1:-1:-1;;;;;32691:38:0;;;;;;;;;32664:24;;32691:8;;;;;:24;;:38;;;;;;;;;;;;;;;:8;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;32691:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32691:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32691:38:0;32747:52;;;32753:10;32747:52;;-1:-1:-1;;;;;32747:52:0;;32691:38;32747:52;;;;;;;;;;;32691:38;;-1:-1:-1;32747:52:0;;;;;;;;;;32812:62;;;-1:-1:-1;;;32812:62:0;;32846:10;32812:62;;;;;;;;;;;;-1:-1:-1;;;;;32812:33:0;;;;;:62;;;;;;;;;;;;;;-1:-1:-1;32812:33:0;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;32812:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32812:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;31677:1205:0;;;;;;;;;;;:::o;4793:140::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;4892:1;4876:6;;4855:40;;-1:-1:-1;;;;;4876:6:0;;;;4855:40;;4892:1;;4855:40;4923:1;4906:19;;-1:-1:-1;;;;;;4906:19:0;;;4793:140::o;22033:27::-;;;-1:-1:-1;;;22033:27:0;;;;;:::o;3982:79::-;4020:7;4047:6;-1:-1:-1;;;;;4047:6:0;3982:79;:::o;4348:94::-;4388:4;4428:6;;-1:-1:-1;;;;;4428:6:0;4412:12;:10;:12::i;:::-;-1:-1:-1;;;;;4412:22:0;;4405:29;;4348:94;:::o;22111:44::-;;;;;;;;;;;;;;;:::o;41575:229::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;41718:8;;-1:-1:-1;;;;;41698:28:0;;;41718:8;;41698:28;;41690:68;;;;;-1:-1:-1;;;41690:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41769:8;:27;;-1:-1:-1;;;;;;41769:27:0;-1:-1:-1;;;;;41769:27:0;;;;;;;;;;41575:229::o;5088:109::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;5161:28;5180:8;5161:18;:28::i;:::-;5088:109;:::o;23674:153::-;4194:9;:7;:9::i;:::-;4186:54;;;;;-1:-1:-1;;;4186:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4186:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23786:24:0;;;;;;;;:12;:24;;;;;:33;;-1:-1:-1;;23786:33:0;;;;;;;;;;23674:153::o;9974:136::-;10032:7;10059:43;10063:1;10066;10059:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;10052:50;;9974:136;;;;;:::o;16980:445::-;17109:6;17084:21;:31;;17062:110;;;;;-1:-1:-1;;;17062:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17259:32;;17241:12;;-1:-1:-1;;;;;17259:14:0;;;17280:6;;17241:12;17259:32;17241:12;17259:32;17280:6;17259:14;:32;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;17240:51:0;;;17324:7;17302:115;;;;-1:-1:-1;;;17302:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18068:247;18238:58;;;-1:-1:-1;;;;;18238:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18238:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;18185:122:0;;18218:5;;18185:18;:122::i;15844:159::-;15986:7;15844:159::o;34603:906::-;34726:7;;-1:-1:-1;;;;;34791:19:0;;34787:339;;34847:1;34835:9;:13;34827:37;;;;;-1:-1:-1;;;34827:37:0;;;;;;;;;;;;-1:-1:-1;;;34827:37:0;;;;;;;;;;;;;;;34938:117;22590:42;35003:9;35031;34938:17;:117::i;:::-;34915:140;-1:-1:-1;35079:35:0;:9;34915:140;35079:35;:13;:35;:::i;:::-;35072:42;;;;;34787:339;35153:1;35144:6;:10;35136:43;;;;;-1:-1:-1;;;35136:43:0;;;;;;;;;;;;-1:-1:-1;;;35136:43:0;;;;;;;;;;;;;;;35198:9;:14;35190:46;;;;;-1:-1:-1;;;35190:46:0;;;;;;;;;;;;-1:-1:-1;;;35190:46:0;;;;;;;;;;;;;;;35275:65;-1:-1:-1;;;;;35275:30:0;;35306:10;35326:4;35333:6;35275:65;:30;:65;:::i;:::-;35406:43;35424:5;35431:6;35439:9;35406:17;:43::i;:::-;35383:66;-1:-1:-1;35469:32:0;:6;35383:66;35469:32;:10;:32;:::i;:::-;35462:39;;;34603:906;;;;;;:::o;32890:1705::-;33214:8;;:96;;;-1:-1:-1;;;33214:96:0;;-1:-1:-1;;;;;33214:96:0;;;;;;;;;;;;;;;;33133:23;;;;;;33214:8;;;;;:26;;:96;;;;;;;;;;;:8;:96;;;5:2:-1;;;;30:1;27;20:12;5:2;33214:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33214:96:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33214:96:0;;;;;;;;;-1:-1:-1;33214:96:0;-1:-1:-1;33323:1265:0;;;;33374:118;33404:12;33435:8;33462:15;33374:11;:118::i;:::-;33356:136;;33323:1265;;;33566:20;33589:184;33618:17;33654:15;33688:8;33715:11;33745:13;33589:10;:184::i;:::-;33566:207;-1:-1:-1;;;;;;33792:29:0;;33788:63;;22590:42;33823:28;;33788:63;33944:8;;:106;;;-1:-1:-1;;;33944:106:0;;-1:-1:-1;;;;;33944:106:0;;;;;;;;;;;;;;;;:8;;;:26;;:106;;;;;;;;;;;;;:8;:106;;;5:2:-1;;;;30:1;27;20:12;5:2;33944:106:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33944:106:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33944:106:0;;;;;;;;;-1:-1:-1;33944:106:0;-1:-1:-1;34067:510:0;;;;34122:138;34156:12;34191;34226:15;34122:11;:138::i;:::-;34104:156;;34067:510;;;34302:14;34318:15;34337:141;34374:12;34409:15;34447:12;34337:14;:141::i;:::-;34301:177;;;;34517:44;34529:12;34543:6;34551:9;34517:11;:44::i;:::-;34499:62;;34067:510;;;33323:1265;;32890:1705;;;;;;;;;;:::o;2675:98::-;2755:10;2675:98;:::o;5303:266::-;-1:-1:-1;;;;;5391:22:0;;5369:110;;;;-1:-1:-1;;;5369:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5516:6;;;5495:38;;-1:-1:-1;;;;;5495:38:0;;;;5516:6;;;5495:38;;;5544:6;:17;;-1:-1:-1;;;;;;5544:17:0;-1:-1:-1;;;;;5544:17:0;;;;;;;;;;5303:266::o;10447:226::-;10567:7;10603:12;10595:6;;;;10587:29;;;;-1:-1:-1;;;10587:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10587:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10639:5:0;;;10447:226::o;20678:1176::-;21282:27;21290:5;-1:-1:-1;;;;;21282:25:0;;:27::i;:::-;21274:71;;;;;-1:-1:-1;;;21274:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21419:12;21433:23;21468:5;-1:-1:-1;;;;;21460:19:0;21480:4;21460:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21460:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;21418:67:0;;;;21504:7;21496:52;;;;;-1:-1:-1;;;21496:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21565:17;;:21;21561:286;;21738:10;21727:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21727:30:0;21701:134;;;;-1:-1:-1;;;21701:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35517:887;35719:10;35646:28;35706:24;;;:12;:24;;;;;;;;35745:12;;:28;;;;;35772:1;35761:8;;:12;35745:28;35741:656;;;35813:100;35844:30;35857:6;35865:8;;35844:12;:30::i;:::-;35893:5;35813:12;:100::i;:::-;-1:-1:-1;;;;;35934:21:0;;;;;;:10;:21;;;;;;35790:123;;-1:-1:-1;35934:21:0;;35930:456;;;35976:24;36003:93;36092:3;36003:62;36050:14;;36003:20;:46;;:62;;;;:::i;:::-;:88;:93;:88;:93;:::i;:::-;-1:-1:-1;;;;;36152:27:0;;;;;;;:16;:27;;;;;;;;:34;;;;;;;;;;35976:120;;-1:-1:-1;36152:78:0;;35976:120;36152:78;:60;:78;:::i;:::-;-1:-1:-1;;;;;36115:27:0;;;;;;;:16;:27;;;;;;;;:34;;;;;;;;;;;:115;;;;36280:21;:28;;;;;;:90;;36335:16;36280:90;:32;:90;:::i;:::-;-1:-1:-1;;;;;36249:28:0;;;;;;:21;:28;;;;;:121;-1:-1:-1;35930:456:0;35517:887;;;;;;:::o;18323:284::-;18520:68;;;-1:-1:-1;;;;;18520:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18520:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;18467:132:0;;18500:5;;18467:18;:132::i;39453:2114::-;39636:8;;:38;;;-1:-1:-1;;;39636:38:0;;-1:-1:-1;;;;;39636:38:0;;;;;;;;;39577:23;;;;39636:8;;:24;;:38;;;;;;;;;;;;;;:8;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;39636:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39636:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39636:38:0;39710:8;;:40;;;-1:-1:-1;;;39710:40:0;;-1:-1:-1;;;;;39710:40:0;;;;;;;;;39636:38;;-1:-1:-1;39685:22:0;;39710:8;;;;;:26;;:40;;;;;39636:38;;39710:40;;;;;;;:8;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;39710:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39710:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39710:40:0;39786:45;;;-1:-1:-1;;;39786:45:0;;39825:4;39786:45;;;;;;39710:40;;-1:-1:-1;39761:22:0;;-1:-1:-1;;;;;39786:30:0;;;;;:45;;;;;39710:40;;39786:45;;;;;;;:30;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;39786:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39786:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39786:45:0;39863:8;;:36;;;-1:-1:-1;;;39863:36:0;;-1:-1:-1;;;;;39863:36:0;;;;;;;;;39786:45;;-1:-1:-1;39842:18:0;;39863:8;;;;;:22;;:36;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;39863:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39863:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;39863:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39921:24:0;;22590:42;39921:24;39917:179;;39962:122;-1:-1:-1;;;;;39962:40:0;;40029:14;40063:6;39962:122;:40;:122;:::i;:::-;40128:8;;:35;;;-1:-1:-1;;;40128:35:0;;-1:-1:-1;;;;;40128:35:0;;;;;;;;;40108:17;;40128:8;;;;;:21;;:35;;;;;;;;;;;;;;;:8;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;40128:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40128:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40128:35:0;40195:8;;:42;;;-1:-1:-1;;;40195:42:0;;-1:-1:-1;;;;;40195:42:0;;;;;;;;;40108:55;;;;;-1:-1:-1;40174:18:0;;40195:8;;;;;:28;;:42;;;;;40128:35;;40195:42;;;;;;;:8;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;40195:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40195:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40195:42:0;;-1:-1:-1;40267:1:0;40254:14;;40250:1190;;;40285:25;;:::i;:::-;40342:6;40325:7;40333:5;40325:14;;;;;;;;;;;;:23;40363:205;;;;40401:58;;-1:-1:-1;;;40401:58:0;;-1:-1:-1;;;;;40401:40:0;;;;;40442:7;;40451:1;;40454:4;;40401:58;;;40442:7;40401:58;;;40442:7;40451:1;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40401:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40401:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40401:58:0;;;;40363:205;;;40500:52;;-1:-1:-1;;;40500:52:0;;-1:-1:-1;;;;;40500:40:0;;;;;40541:7;;40550:1;;40500:52;;;40541:7;40500:52;;;40541:7;40550:1;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40500:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40500:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40500:52:0;;;;40363:205;40250:1190;;;;40589:9;40602:1;40589:14;40585:855;;;40620:25;;:::i;:::-;40677:6;40660:7;40668:5;40660:14;;;;;;;;;;;;:23;40698:205;;;;40736:58;;-1:-1:-1;;;40736:58:0;;84:18:-1;;40736:58:0;;;;64:39:-1;;;-1:-1;;;;;40736:40:0;;;;;40777:7;;40786:1;;40789:4;;40736:58;40777:7;40736:58;;;40777:7;52:2:-1;8:100;;40698:205:0;40835:52;;-1:-1:-1;;;40835:52:0;;84:18:-1;;40835:52:0;;;;64:39:-1;;;-1:-1;;;;;40835:40:0;;;;;40876:7;;40885:1;;40835:52;40876:7;40835:52;;;40876:7;52:2:-1;8:100;;40585:855:0;40935:25;;:::i;:::-;40992:6;40975:7;40983:5;40975:14;;;;;;;;;;;;;;;;;:23;;;;41017:8;;:34;;;-1:-1:-1;;;41017:34:0;;-1:-1:-1;;;;;41017:34:0;;;;;;;;;:8;;;;;:18;;:34;;;;;;;;;;;:8;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;41017:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41017:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41017:34:0;41013:416;;;41086:14;-1:-1:-1;;;;;41072:43:0;;41122:6;41152:7;41182:1;41072:130;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41072:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41072:130:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41072:130:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41013:416:0;;-1:-1:-1;41013:416:0;;41228:13;41224:205;;;41273:14;-1:-1:-1;;;;;41262:40:0;;41303:7;41312:1;41315:4;41262:58;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41262:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41262:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41262:58:0;;;;41224:205;;;41372:14;-1:-1:-1;;;;;41361:40:0;;41402:7;41411:1;41361:52;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41361:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41361:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41361:52:0;;;;41224:205;40585:855;;41469:45;;;-1:-1:-1;;;41469:45:0;;41508:4;41469:45;;;;;;41468:91;;41534:14;;-1:-1:-1;;;;;41469:30:0;;;;;:45;;;;;;;;;;;;;;:30;:45;;;5:2:-1;;;;30:1;27;20:12;41468:91:0;41450:109;39453:2114;-1:-1:-1;;;;;;;;;;39453:2114:0:o;37765:1349::-;37973:20;38006:19;38063:15;-1:-1:-1;;;;;38042:36:0;:17;-1:-1:-1;;;;;38042:36:0;;38038:83;;;38102:7;38095:14;;;;;38038:83;-1:-1:-1;;;;;38135:31:0;;22590:42;38135:31;38131:369;;;-1:-1:-1;38197:7:0;38131:369;;;38324:34;;;-1:-1:-1;;;38324:34:0;;38352:4;38324:34;;;;;;38263:17;;38362:7;;-1:-1:-1;;;;;38324:19:0;;;;;:34;;;;;;;;;;;;;;:19;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;38324:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38324:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38324:34:0;:45;;38298:127;;;;;-1:-1:-1;;;38298:127:0;;;;;;;;;;;;-1:-1:-1;;;38298:127:0;;;;;;;;;;;;;;;38442:46;38464:9;38476:11;38442:13;:46::i;:::-;38131:369;;38512:22;-1:-1:-1;;;;;38537:29:0;;;:130;;38619:48;;;-1:-1:-1;;;38619:48:0;;38661:4;38619:48;;;;;;-1:-1:-1;;;;;38619:33:0;;;;;:48;;;;;;;;;;;;;;:33;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;38619:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38619:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38619:48:0;38537:130;;;38582:21;38537:130;38512:155;;38681:12;38699:11;-1:-1:-1;;;;;38699:16:0;38722:11;38735:13;38699:50;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;38699:50:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;38680:69:0;;;38768:7;38760:41;;;;;-1:-1:-1;;;38760:41:0;;;;;;;;;;;;-1:-1:-1;;;38760:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38829:29:0;;;:204;;38933:48;;;-1:-1:-1;;;38933:48:0;;38975:4;38933:48;;;;;;:100;;39004:14;;-1:-1:-1;;;;;38933:33:0;;;;;:48;;;;;;;;;;;;;;:33;:48;;;5:2:-1;;;;30:1;27;20:12;38933:100:0;38829:204;;;38874:43;38875:21;38902:14;38874:43;:27;:43;:::i;:::-;38814:219;;39069:1;39054:12;:16;39046:60;;;;;-1:-1:-1;;;39046:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37765:1349;;;;;;;;;;;:::o;36871:886::-;37014:20;37036:11;37060:28;;:::i;:::-;37091:8;;:36;;;-1:-1:-1;;;37091:36:0;;-1:-1:-1;;;;;37091:36:0;;;;;;;;;:8;;;;;:22;;:36;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;37091:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37091:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;37091:36:0;-1:-1:-1;37143:7:0;37138:612;37160:1;37156;:5;;;37138:612;;;37217:8;;37183:31;;-1:-1:-1;;;;;37217:8:0;:23;37259:10;:13;;;;;;;;;;;;;;37217:70;;;;;;;;;;;;;-1:-1:-1;;;;;37217:70:0;-1:-1:-1;;;;;37217:70:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37217:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37217:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37217:70:0;;-1:-1:-1;;;;;;37306:37:0;;;37302:437;;37376:8;;:129;;;-1:-1:-1;;;37376:129:0;;-1:-1:-1;;;;;37376:129:0;;;;;;;;;;;;;;;;:8;;;:26;;:129;;;;;;;;;;;;;:8;:129;;;5:2:-1;;;;30:1;27;20:12;5:2;37376:129:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37376:129:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37376:129:0;;;;-1:-1:-1;37541:137:0;37575:23;37621:10;37376:129;37541:11;:137::i;:::-;37526:152;-1:-1:-1;37721:1:0;;-1:-1:-1;37699:24:0;;-1:-1:-1;;37699:24:0;37302:437;-1:-1:-1;37163:3:0;;37138:612;;;;36871:886;;;;;;;;:::o;14968:659::-;15028:4;15527:20;;15357:66;15576:23;;;;;;:42;;-1:-1:-1;15603:15:0;;;15576:42;15568:51;14968:659;-1:-1:-1;;;;14968:659:0:o;10924:471::-;10982:7;11227:6;11223:47;;-1:-1:-1;11257:1:0;11250:8;;11223:47;11294:5;;;11298:1;11294;:5;:1;11318:5;;;;;:10;11310:56;;;;-1:-1:-1;;;11310:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11863:132;11921:7;11948:39;11952:1;11955;11948:39;;;;;;;;;;;;;;;;;:3;:39::i;9518:181::-;9576:7;9608:5;;;9632:6;;;;9624:46;;;;;-1:-1:-1;;;9624:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19329:446;19483:39;;;-1:-1:-1;;;19483:39:0;;19507:4;19483:39;;;;-1:-1:-1;;;;;19483:39:0;;;;;;;;;19460:20;;19483:74;;19541:5;;19483:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;19483:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19483:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19483:39:0;;:74;:43;:74;:::i;:::-;19621:135;;;-1:-1:-1;;;;;19621:135:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19621:135:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;19460:97:0;;-1:-1:-1;19568:199:0;;19601:5;;19568:18;:199::i;23279:261::-;23398:40;;;-1:-1:-1;;;23398:40:0;;23423:4;23398:40;;;;-1:-1:-1;;;;;23398:40:0;;;;;;;;;23377:5;;23354:13;;23398:16;;;;;;:40;;;;;;;;;;;;;;;:16;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;23398:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23398:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23398:40:0;:44;23394:139;;;23444:7;;;23394:139;23481:40;-1:-1:-1;;;;;23481:18:0;;23500:7;-1:-1:-1;;23481:40:0;:18;:40;:::i;23279:261::-;;;:::o;12525:379::-;12645:7;12747:12;12740:5;12732:28;;;;-1:-1:-1;;;12732:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;12732:28:0;;12771:9;12787:1;12783;:5;;;;;;;12525:379;-1:-1:-1;;;;;12525:379:0:o;18615:706::-;19033:10;;;19032:62;;-1:-1:-1;19049:39:0;;;-1:-1:-1;;;19049:39:0;;19073:4;19049:39;;;;-1:-1:-1;;;;;19049:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;19049:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19049:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19049:39:0;:44;19032:62;19010:166;;;;-1:-1:-1;;;19010:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19240:62;;;-1:-1:-1;;;;;19240:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19240:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;19187:126:0;;19220:5;;19187:18;:126::i;30544:11263::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;30544:11263:0;;;-1:-1:-1;;30544:11263:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;30544:11263:0;;;-1:-1:-1;;30544:11263:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;30544:11263:0;;;-1:-1:-1;;30544:11263:0:o
Swarm Source
bzzr://58c94f492b1cfc709f909e32cd991aeac0b771483986ced46af98a7cb52f8da6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.