Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SwapsImplUniswapV2_ETH
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-20 */ /** * Copyright 2017-2021, bZeroX, LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0. */ pragma solidity 0.5.17; interface IWeth { function deposit() external payable; function withdraw(uint256 wad) external; } contract IERC20 { string public name; uint8 public decimals; string public symbol; function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function allowance(address _owner, address _spender) public view returns (uint256); function approve(address _spender, uint256 _value) public returns (bool); function transfer(address _to, uint256 _value) public returns (bool); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract IWethERC20 is IWeth, IERC20 {} /** * @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; } } /** * @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 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"); } } /** * @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"); } } } contract Constants { uint256 internal constant WEI_PRECISION = 10**18; uint256 internal constant WEI_PERCENT_PRECISION = 10**20; uint256 internal constant DAYS_IN_A_YEAR = 365; uint256 internal constant ONE_MONTH = 2628000; // approx. seconds in a month string internal constant UserRewardsID = "UserRewards"; string internal constant LoanDepositValueID = "LoanDepositValue"; IWethERC20 public constant wethToken = IWethERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); address public constant bzrxTokenAddress = 0x56d811088235F11C8920698a204A5010a788f4b3; address public constant vbzrxTokenAddress = 0xB72B31907C1C95F3650b64b2469e08EdACeE5e8F; } /** * @dev Library for managing loan sets * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * Include with `using EnumerableBytes32Set for EnumerableBytes32Set.Bytes32Set;`. * */ library EnumerableBytes32Set { struct Bytes32Set { // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) index; bytes32[] values; } /** * @dev Add an address value to a set. O(1). * Returns false if the value was already in the set. */ function addAddress(Bytes32Set storage set, address addrvalue) internal returns (bool) { bytes32 value; assembly { value := addrvalue } return addBytes32(set, value); } /** * @dev Add a value to a set. O(1). * Returns false if the value was already in the set. */ function addBytes32(Bytes32Set storage set, bytes32 value) internal returns (bool) { if (!contains(set, value)){ set.index[value] = set.values.push(value); return true; } else { return false; } } /** * @dev Removes an address value from a set. O(1). * Returns false if the value was not present in the set. */ function removeAddress(Bytes32Set storage set, address addrvalue) internal returns (bool) { bytes32 value; assembly { value := addrvalue } return removeBytes32(set, value); } /** * @dev Removes a value from a set. O(1). * Returns false if the value was not present in the set. */ function removeBytes32(Bytes32Set storage set, bytes32 value) internal returns (bool) { if (contains(set, value)){ uint256 toDeleteIndex = set.index[value] - 1; uint256 lastIndex = set.values.length - 1; // If the element we're deleting is the last one, we can just remove it without doing a swap if (lastIndex != toDeleteIndex) { bytes32 lastValue = set.values[lastIndex]; // Move the last value to the index where the deleted value is set.values[toDeleteIndex] = lastValue; // Update the index for the moved value set.index[lastValue] = toDeleteIndex + 1; // All indexes are 1-based } // Delete the index entry for the deleted value delete set.index[value]; // Delete the old entry for the moved value set.values.pop(); return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return set.index[value] != 0; } /** * @dev Returns true if the value is in the set. O(1). */ function containsAddress(Bytes32Set storage set, address addrvalue) internal view returns (bool) { bytes32 value; assembly { value := addrvalue } return set.index[value] != 0; } /** * @dev Returns an array with all values in the set. O(N). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * WARNING: This function may run out of gas on large sets: use {length} and * {get} instead in these cases. */ function enumerate(Bytes32Set storage set, uint256 start, uint256 count) internal view returns (bytes32[] memory output) { uint256 end = start + count; require(end >= start, "addition overflow"); end = set.values.length < end ? set.values.length : end; if (end == 0 || start >= end) { return output; } output = new bytes32[](end-start); for (uint256 i = start; i < end; i++) { output[i-start] = set.values[i]; } return output; } /** * @dev Returns the number of elements on the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return set.values.length; } /** @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function get(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return set.values[index]; } /** @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function getAddress(Bytes32Set storage set, uint256 index) internal view returns (address) { bytes32 value = set.values[index]; address addrvalue; assembly { addrvalue := value } return addrvalue; } } /** * @title Helps contracts guard against reentrancy attacks. * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]> * @dev If you mark a function `nonReentrant`, you should also * mark it `external`. */ contract ReentrancyGuard { /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs. /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056 uint256 internal constant REENTRANCY_GUARD_FREE = 1; /// @dev Constant for locked guard state uint256 internal constant REENTRANCY_GUARD_LOCKED = 2; /** * @dev We use a single lock for the whole contract. */ uint256 internal reentrancyLock = REENTRANCY_GUARD_FREE; /** * @dev Prevents a contract from calling itself, directly or indirectly. * If you mark a function `nonReentrant`, you should also * mark it `external`. Calling one `nonReentrant` function from * another is not supported. Instead, you can implement a * `private` function doing the actual work, and an `external` * wrapper marked as `nonReentrant`. */ modifier nonReentrant() { require(reentrancyLock == REENTRANCY_GUARD_FREE, "nonReentrant"); reentrancyLock = REENTRANCY_GUARD_LOCKED; _; reentrancyLock = REENTRANCY_GUARD_FREE; } } /* * @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; } } /** * @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(), "unauthorized"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @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; } } contract LoanStruct { struct Loan { bytes32 id; // id of the loan bytes32 loanParamsId; // the linked loan params id bytes32 pendingTradesId; // the linked pending trades id uint256 principal; // total borrowed amount outstanding uint256 collateral; // total collateral escrowed for the loan uint256 startTimestamp; // loan start time uint256 endTimestamp; // for active loans, this is the expected loan end time, for in-active loans, is the actual (past) end time uint256 startMargin; // initial margin when the loan opened uint256 startRate; // reference rate when the loan opened for converting collateralToken to loanToken address borrower; // borrower of this loan address lender; // lender of this loan bool active; // if false, the loan has been fully closed } } contract LoanParamsStruct { struct LoanParams { bytes32 id; // id of loan params object bool active; // if false, this object has been disabled by the owner and can't be used for future loans address owner; // owner of this object address loanToken; // the token being loaned address collateralToken; // the required collateral token uint256 minInitialMargin; // the minimum allowed initial margin uint256 maintenanceMargin; // an unhealthy loan when current margin is at or below this value uint256 maxLoanTerm; // the maximum term for new loans (0 means there's no max term) } } contract OrderStruct { struct Order { uint256 lockedAmount; // escrowed amount waiting for a counterparty uint256 interestRate; // interest rate defined by the creator of this order uint256 minLoanTerm; // minimum loan term allowed uint256 maxLoanTerm; // maximum loan term allowed uint256 createdTimestamp; // timestamp when this order was created uint256 expirationTimestamp; // timestamp when this order expires } } contract LenderInterestStruct { struct LenderInterest { uint256 principalTotal; // total borrowed amount outstanding of asset uint256 owedPerDay; // interest owed per day for all loans of asset uint256 owedTotal; // total interest owed for all loans of asset (assuming they go to full term) uint256 paidTotal; // total interest paid so far for asset uint256 updatedTimestamp; // last update } } contract LoanInterestStruct { struct LoanInterest { uint256 owedPerDay; // interest owed per day for loan uint256 depositTotal; // total escrowed interest for loan uint256 updatedTimestamp; // last update } } contract Objects is LoanStruct, LoanParamsStruct, OrderStruct, LenderInterestStruct, LoanInterestStruct {} contract State is Constants, Objects, ReentrancyGuard, Ownable { using SafeMath for uint256; using EnumerableBytes32Set for EnumerableBytes32Set.Bytes32Set; address public priceFeeds; // handles asset reference price lookups address public swapsImpl; // handles asset swaps using dex liquidity mapping (bytes4 => address) public logicTargets; // implementations of protocol functions mapping (bytes32 => Loan) public loans; // loanId => Loan mapping (bytes32 => LoanParams) public loanParams; // loanParamsId => LoanParams mapping (address => mapping (bytes32 => Order)) public lenderOrders; // lender => orderParamsId => Order mapping (address => mapping (bytes32 => Order)) public borrowerOrders; // borrower => orderParamsId => Order mapping (bytes32 => mapping (address => bool)) public delegatedManagers; // loanId => delegated => approved // Interest mapping (address => mapping (address => LenderInterest)) public lenderInterest; // lender => loanToken => LenderInterest object mapping (bytes32 => LoanInterest) public loanInterest; // loanId => LoanInterest object // Internals EnumerableBytes32Set.Bytes32Set internal logicTargetsSet; // implementations set EnumerableBytes32Set.Bytes32Set internal activeLoansSet; // active loans set mapping (address => EnumerableBytes32Set.Bytes32Set) internal lenderLoanSets; // lender loans set mapping (address => EnumerableBytes32Set.Bytes32Set) internal borrowerLoanSets; // borrow loans set mapping (address => EnumerableBytes32Set.Bytes32Set) internal userLoanParamSets; // user loan params set address public feesController; // address controlling fee withdrawals uint256 public lendingFeePercent = 10 ether; // 10% fee // fee taken from lender interest payments mapping (address => uint256) public lendingFeeTokensHeld; // total interest fees received and not withdrawn per asset mapping (address => uint256) public lendingFeeTokensPaid; // total interest fees withdraw per asset (lifetime fees = lendingFeeTokensHeld + lendingFeeTokensPaid) uint256 public tradingFeePercent = 0.15 ether; // 0.15% fee // fee paid for each trade mapping (address => uint256) public tradingFeeTokensHeld; // total trading fees received and not withdrawn per asset mapping (address => uint256) public tradingFeeTokensPaid; // total trading fees withdraw per asset (lifetime fees = tradingFeeTokensHeld + tradingFeeTokensPaid) uint256 public borrowingFeePercent = 0.09 ether; // 0.09% fee // origination fee paid for each loan mapping (address => uint256) public borrowingFeeTokensHeld; // total borrowing fees received and not withdrawn per asset mapping (address => uint256) public borrowingFeeTokensPaid; // total borrowing fees withdraw per asset (lifetime fees = borrowingFeeTokensHeld + borrowingFeeTokensPaid) uint256 public protocolTokenHeld; // current protocol token deposit balance uint256 public protocolTokenPaid; // lifetime total payout of protocol token uint256 public affiliateFeePercent = 30 ether; // 30% fee share // fee share for affiliate program mapping (address => mapping (address => uint256)) public liquidationIncentivePercent; // percent discount on collateral for liquidators per loanToken and collateralToken mapping (address => address) public loanPoolToUnderlying; // loanPool => underlying mapping (address => address) public underlyingToLoanPool; // underlying => loanPool EnumerableBytes32Set.Bytes32Set internal loanPoolsSet; // loan pools set mapping (address => bool) public supportedTokens; // supported tokens for swaps uint256 public maxDisagreement = 5 ether; // % disagreement between swap rate and reference rate uint256 public sourceBufferPercent = 5 ether; // used to estimate kyber swap source amount uint256 public maxSwapSize = 1500 ether; // maximum supported swap size in ETH function _setTarget( bytes4 sig, address target) internal { logicTargets[sig] = target; if (target != address(0)) { logicTargetsSet.addBytes32(bytes32(sig)); } else { logicTargetsSet.removeBytes32(bytes32(sig)); } } } interface IUniswapV2Router { // 0x38ed1739 function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts); // 0x8803dbee function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline) external returns (uint256[] memory amounts); // 0x1f00ca74 function getAmountsIn( uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); // 0xd06ca61f function getAmountsOut( uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); } interface ISwapsImpl { function dexSwap( address sourceTokenAddress, address destTokenAddress, address receiverAddress, address returnToSenderAddress, uint256 minSourceTokenAmount, uint256 maxSourceTokenAmount, uint256 requiredDestTokenAmount) external returns (uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed); function dexExpectedRate( address sourceTokenAddress, address destTokenAddress, uint256 sourceTokenAmount) external view returns (uint256); function dexAmountOut( address sourceTokenAddress, address destTokenAddress, uint256 amountIn) external view returns (uint256 amountOut, address midToken); function dexAmountIn( address sourceTokenAddress, address destTokenAddress, uint256 amountOut) external view returns (uint256 amountIn, address midToken); function setSwapApprovals( address[] calldata tokens) external; } contract SwapsImplUniswapV2_ETH is State, ISwapsImpl { using SafeERC20 for IERC20; address public constant uniswapRouter = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; // sushiswap address public constant dai = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address public constant usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address public constant usdt = 0xdAC17F958D2ee523a2206206994597C13D831ec7; function dexSwap( address sourceTokenAddress, address destTokenAddress, address receiverAddress, address returnToSenderAddress, uint256 minSourceTokenAmount, uint256 maxSourceTokenAmount, uint256 requiredDestTokenAmount) public returns (uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed) { require(sourceTokenAddress != destTokenAddress, "source == dest"); require(supportedTokens[sourceTokenAddress] && supportedTokens[destTokenAddress], "invalid tokens"); IERC20 sourceToken = IERC20(sourceTokenAddress); address _thisAddress = address(this); (sourceTokenAmountUsed, destTokenAmountReceived) = _swapWithUni( sourceTokenAddress, destTokenAddress, receiverAddress, minSourceTokenAmount, maxSourceTokenAmount, requiredDestTokenAmount ); if (returnToSenderAddress != _thisAddress && sourceTokenAmountUsed < maxSourceTokenAmount) { // send unused source token back sourceToken.safeTransfer( returnToSenderAddress, maxSourceTokenAmount-sourceTokenAmountUsed ); } } function dexExpectedRate( address sourceTokenAddress, address destTokenAddress, uint256 sourceTokenAmount) public view returns (uint256 expectedRate) { revert("unsupported"); } function dexAmountOut( address sourceTokenAddress, address destTokenAddress, uint256 amountIn) public view returns (uint256 amountOut, address midToken) { if (sourceTokenAddress == destTokenAddress) { amountOut = amountIn; } else if (amountIn != 0) { uint256 tmpValue; address[] memory path = new address[](2); path[0] = sourceTokenAddress; path[1] = destTokenAddress; amountOut = _getAmountOut(amountIn, path); path = new address[](3); path[0] = sourceTokenAddress; path[2] = destTokenAddress; if (sourceTokenAddress != address(wethToken) && destTokenAddress != address(wethToken)) { path[1] = address(wethToken); tmpValue = _getAmountOut(amountIn, path); if (tmpValue > amountOut) { amountOut = tmpValue; midToken = address(wethToken); } } if (sourceTokenAddress != dai && destTokenAddress != dai) { path[1] = dai; tmpValue = _getAmountOut(amountIn, path); if (tmpValue > amountOut) { amountOut = tmpValue; midToken = dai; } } if (sourceTokenAddress != usdc && destTokenAddress != usdc) { path[1] = usdc; tmpValue = _getAmountOut(amountIn, path); if (tmpValue > amountOut) { amountOut = tmpValue; midToken = usdc; } } if (sourceTokenAddress != usdt && destTokenAddress != usdt) { path[1] = usdt; tmpValue = _getAmountOut(amountIn, path); if (tmpValue > amountOut) { amountOut = tmpValue; midToken = usdt; } } } } function dexAmountIn( address sourceTokenAddress, address destTokenAddress, uint256 amountOut) public view returns (uint256 amountIn, address midToken) { if (sourceTokenAddress == destTokenAddress) { amountIn = amountOut; } else if (amountOut != 0) { uint256 tmpValue; address[] memory path = new address[](2); path[0] = sourceTokenAddress; path[1] = destTokenAddress; amountIn = _getAmountIn(amountOut, path); path = new address[](3); path[0] = sourceTokenAddress; path[2] = destTokenAddress; if (sourceTokenAddress != address(wethToken) && destTokenAddress != address(wethToken)) { path[1] = address(wethToken); tmpValue = _getAmountIn(amountOut, path); if (tmpValue < amountIn) { amountIn = tmpValue; midToken = address(wethToken); } } if (sourceTokenAddress != dai && destTokenAddress != dai) { path[1] = dai; tmpValue = _getAmountIn(amountOut, path); if (tmpValue < amountIn) { amountIn = tmpValue; midToken = dai; } } if (sourceTokenAddress != usdc && destTokenAddress != usdc) { path[1] = usdc; tmpValue = _getAmountIn(amountOut, path); if (tmpValue < amountIn) { amountIn = tmpValue; midToken = usdc; } } if (sourceTokenAddress != usdt && destTokenAddress != usdt) { path[1] = usdt; tmpValue = _getAmountIn(amountOut, path); if (tmpValue < amountIn) { amountIn = tmpValue; midToken = usdt; } } if (amountIn == uint256(-1)) { amountIn = 0; } } } function _getAmountOut( uint256 amountIn, address[] memory path) public view returns (uint256 amountOut) { (bool success, bytes memory data) = uniswapRouter.staticcall( abi.encodeWithSelector( 0xd06ca61f, // keccak("getAmountsOut(uint256,address[])") amountIn, path ) ); if (success) { uint256 len = data.length; assembly { amountOut := mload(add(data, len)) // last amount value array } } } function _getAmountIn( uint256 amountOut, address[] memory path) public view returns (uint256 amountIn) { (bool success, bytes memory data) = uniswapRouter.staticcall( abi.encodeWithSelector( 0x1f00ca74, // keccak("getAmountsIn(uint256,address[])") amountOut, path ) ); if (success) { uint256 len = data.length; assembly { amountIn := mload(add(data, 96)) // first amount value in array } } if (amountIn == 0) { amountIn = uint256(-1); } } function setSwapApprovals( address[] memory tokens) public { for (uint256 i = 0; i < tokens.length; i++) { IERC20(tokens[i]).safeApprove(uniswapRouter, 0); IERC20(tokens[i]).safeApprove(uniswapRouter, uint256(-1)); } } function _swapWithUni( address sourceTokenAddress, address destTokenAddress, address receiverAddress, uint256 minSourceTokenAmount, uint256 maxSourceTokenAmount, uint256 requiredDestTokenAmount) internal returns (uint256 sourceTokenAmountUsed, uint256 destTokenAmountReceived) { address midToken; if (requiredDestTokenAmount != 0) { (sourceTokenAmountUsed, midToken) = dexAmountIn( sourceTokenAddress, destTokenAddress, requiredDestTokenAmount ); if (sourceTokenAmountUsed == 0) { return (0, 0); } require(sourceTokenAmountUsed <= maxSourceTokenAmount, "source amount too high"); } else { sourceTokenAmountUsed = minSourceTokenAmount; (destTokenAmountReceived, midToken) = dexAmountOut( sourceTokenAddress, destTokenAddress, sourceTokenAmountUsed ); if (destTokenAmountReceived == 0) { return (0, 0); } } address[] memory path; if (midToken != address(0)) { path = new address[](3); path[0] = sourceTokenAddress; path[1] = midToken; path[2] = destTokenAddress; } else { path = new address[](2); path[0] = sourceTokenAddress; path[1] = destTokenAddress; } uint256[] memory amounts = IUniswapV2Router(uniswapRouter).swapExactTokensForTokens( sourceTokenAmountUsed, 1, // amountOutMin path, receiverAddress, block.timestamp ); destTokenAmountReceived = amounts[amounts.length - 1]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"_getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"_getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"affiliateFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"borrowerOrders","outputs":[{"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"},{"internalType":"uint256","name":"minLoanTerm","type":"uint256"},{"internalType":"uint256","name":"maxLoanTerm","type":"uint256"},{"internalType":"uint256","name":"createdTimestamp","type":"uint256"},{"internalType":"uint256","name":"expirationTimestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrowingFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"borrowingFeeTokensHeld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"borrowingFeeTokensPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bzrxTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"delegatedManagers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"sourceTokenAddress","type":"address"},{"internalType":"address","name":"destTokenAddress","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"dexAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"midToken","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"sourceTokenAddress","type":"address"},{"internalType":"address","name":"destTokenAddress","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"dexAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"midToken","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"sourceTokenAddress","type":"address"},{"internalType":"address","name":"destTokenAddress","type":"address"},{"internalType":"uint256","name":"sourceTokenAmount","type":"uint256"}],"name":"dexExpectedRate","outputs":[{"internalType":"uint256","name":"expectedRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sourceTokenAddress","type":"address"},{"internalType":"address","name":"destTokenAddress","type":"address"},{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"address","name":"returnToSenderAddress","type":"address"},{"internalType":"uint256","name":"minSourceTokenAmount","type":"uint256"},{"internalType":"uint256","name":"maxSourceTokenAmount","type":"uint256"},{"internalType":"uint256","name":"requiredDestTokenAmount","type":"uint256"}],"name":"dexSwap","outputs":[{"internalType":"uint256","name":"destTokenAmountReceived","type":"uint256"},{"internalType":"uint256","name":"sourceTokenAmountUsed","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feesController","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"lenderInterest","outputs":[{"internalType":"uint256","name":"principalTotal","type":"uint256"},{"internalType":"uint256","name":"owedPerDay","type":"uint256"},{"internalType":"uint256","name":"owedTotal","type":"uint256"},{"internalType":"uint256","name":"paidTotal","type":"uint256"},{"internalType":"uint256","name":"updatedTimestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"lenderOrders","outputs":[{"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"},{"internalType":"uint256","name":"minLoanTerm","type":"uint256"},{"internalType":"uint256","name":"maxLoanTerm","type":"uint256"},{"internalType":"uint256","name":"createdTimestamp","type":"uint256"},{"internalType":"uint256","name":"expirationTimestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lendingFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lendingFeeTokensHeld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lendingFeeTokensPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"liquidationIncentivePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"loanInterest","outputs":[{"internalType":"uint256","name":"owedPerDay","type":"uint256"},{"internalType":"uint256","name":"depositTotal","type":"uint256"},{"internalType":"uint256","name":"updatedTimestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"loanParams","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"minInitialMargin","type":"uint256"},{"internalType":"uint256","name":"maintenanceMargin","type":"uint256"},{"internalType":"uint256","name":"maxLoanTerm","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loanPoolToUnderlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"loans","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bytes32","name":"loanParamsId","type":"bytes32"},{"internalType":"bytes32","name":"pendingTradesId","type":"bytes32"},{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"uint256","name":"startMargin","type":"uint256"},{"internalType":"uint256","name":"startRate","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"lender","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"logicTargets","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxDisagreement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSwapSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceFeeds","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"protocolTokenHeld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"protocolTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"setSwapApprovals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sourceBufferPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"swapsImpl","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradingFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tradingFeeTokensHeld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tradingFeeTokensPaid","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":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"underlyingToLoanPool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vbzrxTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wethToken","outputs":[{"internalType":"contract IWethERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526001600055678ac7230489e80000601455670214e8348c4f000060175567013fbe85edc90000601a556801a055690d9db80000601f55674563918244f40000602655674563918244f40000602755685150ae84a8cdf00000602855600061006f6100c260201b60201c565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506100c6565b3390565b612482806100d56000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c8063735de9f711610167578063b30643d9116100ce578063e8f6276411610087578063e8f62764146109a4578063edab119f146109ac578063f27451ac146109b4578063f2765753146109e2578063f2fde38b14610a8a578063f4b9fa7514610ab057610295565b8063b30643d914610833578063b7e1524114610859578063c4a908151461087f578063cb6eacd114610909578063d473c2da14610976578063d485045e1461097e57610295565b80638da5cb5b116101205780638da5cb5b146107c75780638dc48ba5146107cf5780638f32d59b146107f557806392d894f8146107fd578063ab2c9d7514610823578063ae0a85301461082b57610295565b8063735de9f7146106c95780637420ca3e146106d157806378d849ed146106d957806379505e87146106e157806379702596146107175780637a8faeb8146107bf57610295565b80633bebf6f21161020b5780634b57b0be116101c45780634b57b0be146105f75780634f28cac2146105ff578063569fc1fb1461060757806362fff3f61461064257806368c4ac261461069b578063691bfee8146106c157610295565b80633bebf6f2146104875780633e413bee146104de5780634115a2b6146104e65780634203e395146105265780634699f8461461054c5780634a99e3a11461055457610295565b80632bea87631161025d5780632bea8763146103b25780632f4707641461041d5780632f48ab7d146104255780633432423c1461042d5780633452d2d41461045957806339cd381e1461047f57610295565b806302a31dea1461029a578063065d810f146102e257806317548b7914610341578063218b39c6146103845780632a324027146103aa575b600080fd5b6102d0600480360360608110156102b057600080fd5b506001600160a01b03813581169160208101359091169060400135610ab8565b60408051918252519081900360200190f35b61030e600480360360408110156102f857600080fd5b506001600160a01b038135169060200135610af5565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6103686004803603602081101561035757600080fd5b50356001600160e01b031916610b35565b604080516001600160a01b039092168252519081900360200190f35b6103686004803603602081101561039a57600080fd5b50356001600160a01b0316610b50565b6102d0610b6b565b610404600480360360e08110156103c857600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a08101359060c00135610b71565b6040805192835260208301919091528051918290030190f35b6102d0610cac565b610368610cb2565b61030e6004803603604081101561044357600080fd5b506001600160a01b038135169060200135610cca565b6102d06004803603602081101561046f57600080fd5b50356001600160a01b0316610d0a565b610368610d1c565b6104bd6004803603606081101561049d57600080fd5b506001600160a01b03813581169160208101359091169060400135610d34565b604080519283526001600160a01b0390911660208301528051918290030190f35b610368611172565b610512600480360360408110156104fc57600080fd5b50803590602001356001600160a01b031661118a565b604080519115158252519081900360200190f35b6102d06004803603602081101561053c57600080fd5b50356001600160a01b03166111aa565b6102d06111bc565b6105f56004803603602081101561056a57600080fd5b810190602081018135600160201b81111561058457600080fd5b82018360208201111561059657600080fd5b803590602001918460208302840111600160201b831117156105b757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506111c2945050505050565b005b610368611247565b6102d061125f565b6106246004803603602081101561061d57600080fd5b5035611265565b60408051938452602084019290925282820152519081900360600190f35b6106706004803603604081101561065857600080fd5b506001600160a01b0381358116916020013516611286565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b610512600480360360208110156106b157600080fd5b50356001600160a01b03166112c0565b6102d06112d5565b6103686112db565b6103686112f3565b610368611302565b6104bd600480360360608110156106f757600080fd5b506001600160a01b03813581169160208101359091169060400135611311565b6102d06004803603604081101561072d57600080fd5b81359190810190604081016020820135600160201b81111561074e57600080fd5b82018360208201111561076057600080fd5b803590602001918460208302840111600160201b8311171561078157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061173a945050505050565b6102d061189f565b6103686118a5565b610368600480360360208110156107e557600080fd5b50356001600160a01b03166118b4565b6105126118cf565b6102d06004803603602081101561081357600080fd5b50356001600160a01b03166118f5565b610368611907565b6102d061191f565b6102d06004803603602081101561084957600080fd5b50356001600160a01b0316611925565b6102d06004803603602081101561086f57600080fd5b50356001600160a01b0316611937565b61089c6004803603602081101561089557600080fd5b5035611949565b604080519c8d5260208d019b909b528b8b019990995260608b019790975260808a019590955260a089019390935260c088019190915260e08701526101008601526001600160a01b0390811661012086015216610140840152151561016083015251908190036101800190f35b6109266004803603602081101561091f57600080fd5b50356119bc565b6040805198895296151560208901526001600160a01b0395861688880152938516606088015291909316608086015260a085019290925260c084019190915260e083015251908190036101000190f35b6102d0611a13565b6102d06004803603602081101561099457600080fd5b50356001600160a01b0316611a19565b610368611a2b565b6102d0611a3a565b6102d0600480360360408110156109ca57600080fd5b506001600160a01b0381358116916020013516611a40565b6102d0600480360360408110156109f857600080fd5b81359190810190604081016020820135600160201b811115610a1957600080fd5b820183602082011115610a2b57600080fd5b803590602001918460208302840111600160201b83111715610a4c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a5b945050505050565b6105f560048036036020811015610aa057600080fd5b50356001600160a01b0316611bb1565b610368611c05565b6040805162461bcd60e51b815260206004820152600b60248201526a1d5b9cdd5c1c1bdc9d195960aa1b6044820152905160009181900360640190fd5b6008602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b6004602052600090815260409020546001600160a01b031681565b6022602052600090815260409020546001600160a01b031681565b60175481565b600080876001600160a01b0316896001600160a01b03161415610bcc576040805162461bcd60e51b815260206004820152600e60248201526d1cdbdd5c98d9480f4f4819195cdd60921b604482015290519081900360640190fd5b6001600160a01b03891660009081526025602052604090205460ff168015610c0c57506001600160a01b03881660009081526025602052604090205460ff165b610c4e576040805162461bcd60e51b815260206004820152600e60248201526d696e76616c696420746f6b656e7360901b604482015290519081900360640190fd5b8830610c5e828b8b8a8a8a611c1d565b945092506001600160a01b0388811690821614801590610c7d57508583105b15610c9e57610c9e6001600160a01b0383168985890363ffffffff611fbe16565b505097509795505050505050565b601e5481565b73dac17f958d2ee523a2206206994597c13d831ec781565b6007602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b60196020526000908152604090205481565b73b72b31907c1c95f3650b64b2469e08edacee5e8f81565b600080836001600160a01b0316856001600160a01b03161415610d595782915061116a565b821561116a5760408051600280825260608083018452600093909291906020830190803883390190505090508681600081518110610d9357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610dc157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610deb858261173a565b60408051600380825260808201909252919550602082016060803883390190505090508681600081518110610e1c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600281518110610e4a57fe5b6001600160a01b039283166020918202929092010152871673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214801590610ea257506001600160a01b03861673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214155b15610f185773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110610ec957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610ef3858261173a565b915083821015610f185781935073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292505b6001600160a01b038716736b175474e89094c44da98b954eedeac495271d0f14801590610f6257506001600160a01b038616736b175474e89094c44da98b954eedeac495271d0f14155b15610fd857736b175474e89094c44da98b954eedeac495271d0f81600181518110610f8957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610fb3858261173a565b915083821015610fd857819350736b175474e89094c44da98b954eedeac495271d0f92505b6001600160a01b03871673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481480159061102257506001600160a01b03861673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814155b156110985773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061104957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611073858261173a565b9150838210156110985781935073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4892505b6001600160a01b03871673dac17f958d2ee523a2206206994597c13d831ec7148015906110e257506001600160a01b03861673dac17f958d2ee523a2206206994597c13d831ec714155b156111585773dac17f958d2ee523a2206206994597c13d831ec78160018151811061110957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611133858261173a565b9150838210156111585781935073dac17f958d2ee523a2206206994597c13d831ec792505b60001984141561116757600093505b50505b935093915050565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b600960209081526000928352604080842090915290825290205460ff1681565b60156020526000908152604090205481565b60145481565b60005b81518110156112435761121473d9e1ce17f2641f24ae83637ab66a2cca9c378b9f60008484815181106111f457fe5b60200260200101516001600160a01b03166120159092919063ffffffff16565b61123b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000198484815181106111f457fe5b6001016111c5565b5050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60285481565b600b6020526000908152604090208054600182015460029092015490919083565b600a602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b60256020526000908152604090205460ff1681565b60275481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6002546001600160a01b031681565b600080836001600160a01b0316856001600160a01b031614156113365782915061116a565b821561116a576040805160028082526060808301845260009390929190602083019080388339019050509050868160008151811061137057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061139e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506113c88582611a5b565b604080516003808252608082019092529195506020820160608038833901905050905086816000815181106113f957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160028151811061142757fe5b6001600160a01b039283166020918202929092010152871673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21480159061147f57506001600160a01b03861673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214155b156114f55773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106114a657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506114d08582611a5b565b9150838211156114f55781935073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292505b6001600160a01b038716736b175474e89094c44da98b954eedeac495271d0f1480159061153f57506001600160a01b038616736b175474e89094c44da98b954eedeac495271d0f14155b156115b557736b175474e89094c44da98b954eedeac495271d0f8160018151811061156657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506115908582611a5b565b9150838211156115b557819350736b175474e89094c44da98b954eedeac495271d0f92505b6001600160a01b03871673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48148015906115ff57506001600160a01b03861673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814155b156116755773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061162657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506116508582611a5b565b9150838211156116755781935073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4892505b6001600160a01b03871673dac17f958d2ee523a2206206994597c13d831ec7148015906116bf57506001600160a01b03861673dac17f958d2ee523a2206206994597c13d831ec714155b156111675773dac17f958d2ee523a2206206994597c13d831ec7816001815181106116e657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506117108582611a5b565b91508382111561116757509573dac17f958d2ee523a2206206994597c13d831ec795509350505050565b600080606073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b0316631f00ca7486866040516024018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156117ad578181015183820152602001611795565b5050505090500193505050506040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b602083106118145780518252601f1990920191602091820191016117f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114611874576040519150601f19603f3d011682016040523d82523d6000602084013e611879565b606091505b5091509150811561188c57606081015192505b826118975760001992505b505092915050565b601d5481565b6001546001600160a01b031690565b6021602052600090815260409020546001600160a01b031681565b6001546000906001600160a01b03166118e6612128565b6001600160a01b031614905090565b60166020526000908152604090205481565b7356d811088235f11c8920698a204a5010a788f4b381565b601f5481565b601c6020526000908152604090205481565b601b6020526000908152604090205481565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460088801546009890154600a9099015497999698959794969593949293919290916001600160a01b039081169190811690600160a01b900460ff168c565b60066020819052600091825260409091208054600182015460028301546003840154600485015460058601549590960154939560ff8416956101009094046001600160a01b03908116959381169492169290919088565b60265481565b60186020526000908152604090205481565b6013546001600160a01b031681565b601a5481565b60208080526000928352604080842090915290825290205481565b600080606073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b031663d06ca61f86866040516024018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611ace578181015183820152602001611ab6565b5050505090500193505050506040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b60208310611b355780518252601f199092019160209182019101611b16565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114611b95576040519150601f19603f3d011682016040523d82523d6000602084013e611b9a565b606091505b509150915081156118975780510151949350505050565b611bb96118cf565b611bf9576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b611c028161212c565b50565b736b175474e89094c44da98b954eedeac495271d0f81565b600080808315611c9c57611c32898986610d34565b909350905082611c49575060009150819050611fb3565b84831115611c97576040805162461bcd60e51b81526020600482015260166024820152750e6deeae4c6ca40c2dadeeadce840e8dede40d0d2ced60531b604482015290519081900360640190fd5b611cc1565b859250611caa898985611311565b909250905081611cc1575060009150819050611fb3565b60606001600160a01b03821615611d82576040805160038082526080820190925290602082016060803883390190505090508981600081518110611d0157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110611d2f57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508881600281518110611d5d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611dff565b60408051600280825260608201835290916020830190803883390190505090508981600081518110611db057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508881600181518110611dde57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b606073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b03166338ed1739866001858d426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611ea3578181015183820152602001611e8b565b505050509050019650505050505050600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f0957600080fd5b8101908080516040519392919084600160201b821115611f2857600080fd5b908301906020820185811115611f3d57600080fd5b82518660208202830111600160201b82111715611f5957600080fd5b82525081516020918201928201910280838360005b83811015611f86578181015183820152602001611f6e565b50505050905001604052505050905080600182510381518110611fa557fe5b602002602001015193505050505b965096945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526120109084906121cd565b505050565b80158061209b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561206d57600080fd5b505afa158015612081573d6000803e3d6000fd5b505050506040513d602081101561209757600080fd5b5051155b6120d65760405162461bcd60e51b81526004018080602001828103825260368152602001806124186036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526120109084906121cd565b3390565b6001600160a01b0381166121715760405162461bcd60e51b81526004018080602001828103825260268152602001806123c86026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6121df826001600160a01b031661238b565b612230576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061226e5780518252601f19909201916020918201910161224f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146122d0576040519150601f19603f3d011682016040523d82523d6000602084013e6122d5565b606091505b50915091508161232c576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156123855780806020019051602081101561234857600080fd5b50516123855760405162461bcd60e51b815260040180806020018281038252602a8152602001806123ee602a913960400191505060405180910390fd5b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906123bf57508115155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820de1007b2ece1a9f2bc0bb59bb32f57f06782e242236bfc59d588375ffe701d4264736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102955760003560e01c8063735de9f711610167578063b30643d9116100ce578063e8f6276411610087578063e8f62764146109a4578063edab119f146109ac578063f27451ac146109b4578063f2765753146109e2578063f2fde38b14610a8a578063f4b9fa7514610ab057610295565b8063b30643d914610833578063b7e1524114610859578063c4a908151461087f578063cb6eacd114610909578063d473c2da14610976578063d485045e1461097e57610295565b80638da5cb5b116101205780638da5cb5b146107c75780638dc48ba5146107cf5780638f32d59b146107f557806392d894f8146107fd578063ab2c9d7514610823578063ae0a85301461082b57610295565b8063735de9f7146106c95780637420ca3e146106d157806378d849ed146106d957806379505e87146106e157806379702596146107175780637a8faeb8146107bf57610295565b80633bebf6f21161020b5780634b57b0be116101c45780634b57b0be146105f75780634f28cac2146105ff578063569fc1fb1461060757806362fff3f61461064257806368c4ac261461069b578063691bfee8146106c157610295565b80633bebf6f2146104875780633e413bee146104de5780634115a2b6146104e65780634203e395146105265780634699f8461461054c5780634a99e3a11461055457610295565b80632bea87631161025d5780632bea8763146103b25780632f4707641461041d5780632f48ab7d146104255780633432423c1461042d5780633452d2d41461045957806339cd381e1461047f57610295565b806302a31dea1461029a578063065d810f146102e257806317548b7914610341578063218b39c6146103845780632a324027146103aa575b600080fd5b6102d0600480360360608110156102b057600080fd5b506001600160a01b03813581169160208101359091169060400135610ab8565b60408051918252519081900360200190f35b61030e600480360360408110156102f857600080fd5b506001600160a01b038135169060200135610af5565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6103686004803603602081101561035757600080fd5b50356001600160e01b031916610b35565b604080516001600160a01b039092168252519081900360200190f35b6103686004803603602081101561039a57600080fd5b50356001600160a01b0316610b50565b6102d0610b6b565b610404600480360360e08110156103c857600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a08101359060c00135610b71565b6040805192835260208301919091528051918290030190f35b6102d0610cac565b610368610cb2565b61030e6004803603604081101561044357600080fd5b506001600160a01b038135169060200135610cca565b6102d06004803603602081101561046f57600080fd5b50356001600160a01b0316610d0a565b610368610d1c565b6104bd6004803603606081101561049d57600080fd5b506001600160a01b03813581169160208101359091169060400135610d34565b604080519283526001600160a01b0390911660208301528051918290030190f35b610368611172565b610512600480360360408110156104fc57600080fd5b50803590602001356001600160a01b031661118a565b604080519115158252519081900360200190f35b6102d06004803603602081101561053c57600080fd5b50356001600160a01b03166111aa565b6102d06111bc565b6105f56004803603602081101561056a57600080fd5b810190602081018135600160201b81111561058457600080fd5b82018360208201111561059657600080fd5b803590602001918460208302840111600160201b831117156105b757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506111c2945050505050565b005b610368611247565b6102d061125f565b6106246004803603602081101561061d57600080fd5b5035611265565b60408051938452602084019290925282820152519081900360600190f35b6106706004803603604081101561065857600080fd5b506001600160a01b0381358116916020013516611286565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b610512600480360360208110156106b157600080fd5b50356001600160a01b03166112c0565b6102d06112d5565b6103686112db565b6103686112f3565b610368611302565b6104bd600480360360608110156106f757600080fd5b506001600160a01b03813581169160208101359091169060400135611311565b6102d06004803603604081101561072d57600080fd5b81359190810190604081016020820135600160201b81111561074e57600080fd5b82018360208201111561076057600080fd5b803590602001918460208302840111600160201b8311171561078157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061173a945050505050565b6102d061189f565b6103686118a5565b610368600480360360208110156107e557600080fd5b50356001600160a01b03166118b4565b6105126118cf565b6102d06004803603602081101561081357600080fd5b50356001600160a01b03166118f5565b610368611907565b6102d061191f565b6102d06004803603602081101561084957600080fd5b50356001600160a01b0316611925565b6102d06004803603602081101561086f57600080fd5b50356001600160a01b0316611937565b61089c6004803603602081101561089557600080fd5b5035611949565b604080519c8d5260208d019b909b528b8b019990995260608b019790975260808a019590955260a089019390935260c088019190915260e08701526101008601526001600160a01b0390811661012086015216610140840152151561016083015251908190036101800190f35b6109266004803603602081101561091f57600080fd5b50356119bc565b6040805198895296151560208901526001600160a01b0395861688880152938516606088015291909316608086015260a085019290925260c084019190915260e083015251908190036101000190f35b6102d0611a13565b6102d06004803603602081101561099457600080fd5b50356001600160a01b0316611a19565b610368611a2b565b6102d0611a3a565b6102d0600480360360408110156109ca57600080fd5b506001600160a01b0381358116916020013516611a40565b6102d0600480360360408110156109f857600080fd5b81359190810190604081016020820135600160201b811115610a1957600080fd5b820183602082011115610a2b57600080fd5b803590602001918460208302840111600160201b83111715610a4c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611a5b945050505050565b6105f560048036036020811015610aa057600080fd5b50356001600160a01b0316611bb1565b610368611c05565b6040805162461bcd60e51b815260206004820152600b60248201526a1d5b9cdd5c1c1bdc9d195960aa1b6044820152905160009181900360640190fd5b6008602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b6004602052600090815260409020546001600160a01b031681565b6022602052600090815260409020546001600160a01b031681565b60175481565b600080876001600160a01b0316896001600160a01b03161415610bcc576040805162461bcd60e51b815260206004820152600e60248201526d1cdbdd5c98d9480f4f4819195cdd60921b604482015290519081900360640190fd5b6001600160a01b03891660009081526025602052604090205460ff168015610c0c57506001600160a01b03881660009081526025602052604090205460ff165b610c4e576040805162461bcd60e51b815260206004820152600e60248201526d696e76616c696420746f6b656e7360901b604482015290519081900360640190fd5b8830610c5e828b8b8a8a8a611c1d565b945092506001600160a01b0388811690821614801590610c7d57508583105b15610c9e57610c9e6001600160a01b0383168985890363ffffffff611fbe16565b505097509795505050505050565b601e5481565b73dac17f958d2ee523a2206206994597c13d831ec781565b6007602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b60196020526000908152604090205481565b73b72b31907c1c95f3650b64b2469e08edacee5e8f81565b600080836001600160a01b0316856001600160a01b03161415610d595782915061116a565b821561116a5760408051600280825260608083018452600093909291906020830190803883390190505090508681600081518110610d9357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610dc157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610deb858261173a565b60408051600380825260808201909252919550602082016060803883390190505090508681600081518110610e1c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508581600281518110610e4a57fe5b6001600160a01b039283166020918202929092010152871673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214801590610ea257506001600160a01b03861673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214155b15610f185773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110610ec957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610ef3858261173a565b915083821015610f185781935073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292505b6001600160a01b038716736b175474e89094c44da98b954eedeac495271d0f14801590610f6257506001600160a01b038616736b175474e89094c44da98b954eedeac495271d0f14155b15610fd857736b175474e89094c44da98b954eedeac495271d0f81600181518110610f8957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610fb3858261173a565b915083821015610fd857819350736b175474e89094c44da98b954eedeac495271d0f92505b6001600160a01b03871673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481480159061102257506001600160a01b03861673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814155b156110985773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061104957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611073858261173a565b9150838210156110985781935073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4892505b6001600160a01b03871673dac17f958d2ee523a2206206994597c13d831ec7148015906110e257506001600160a01b03861673dac17f958d2ee523a2206206994597c13d831ec714155b156111585773dac17f958d2ee523a2206206994597c13d831ec78160018151811061110957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611133858261173a565b9150838210156111585781935073dac17f958d2ee523a2206206994597c13d831ec792505b60001984141561116757600093505b50505b935093915050565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b600960209081526000928352604080842090915290825290205460ff1681565b60156020526000908152604090205481565b60145481565b60005b81518110156112435761121473d9e1ce17f2641f24ae83637ab66a2cca9c378b9f60008484815181106111f457fe5b60200260200101516001600160a01b03166120159092919063ffffffff16565b61123b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6000198484815181106111f457fe5b6001016111c5565b5050565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60285481565b600b6020526000908152604090208054600182015460029092015490919083565b600a602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b60256020526000908152604090205460ff1681565b60275481565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6003546001600160a01b031681565b6002546001600160a01b031681565b600080836001600160a01b0316856001600160a01b031614156113365782915061116a565b821561116a576040805160028082526060808301845260009390929190602083019080388339019050509050868160008151811061137057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061139e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506113c88582611a5b565b604080516003808252608082019092529195506020820160608038833901905050905086816000815181106113f957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858160028151811061142757fe5b6001600160a01b039283166020918202929092010152871673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21480159061147f57506001600160a01b03861673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214155b156114f55773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106114a657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506114d08582611a5b565b9150838211156114f55781935073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292505b6001600160a01b038716736b175474e89094c44da98b954eedeac495271d0f1480159061153f57506001600160a01b038616736b175474e89094c44da98b954eedeac495271d0f14155b156115b557736b175474e89094c44da98b954eedeac495271d0f8160018151811061156657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506115908582611a5b565b9150838211156115b557819350736b175474e89094c44da98b954eedeac495271d0f92505b6001600160a01b03871673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48148015906115ff57506001600160a01b03861673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814155b156116755773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061162657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506116508582611a5b565b9150838211156116755781935073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4892505b6001600160a01b03871673dac17f958d2ee523a2206206994597c13d831ec7148015906116bf57506001600160a01b03861673dac17f958d2ee523a2206206994597c13d831ec714155b156111675773dac17f958d2ee523a2206206994597c13d831ec7816001815181106116e657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506117108582611a5b565b91508382111561116757509573dac17f958d2ee523a2206206994597c13d831ec795509350505050565b600080606073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b0316631f00ca7486866040516024018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156117ad578181015183820152602001611795565b5050505090500193505050506040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b602083106118145780518252601f1990920191602091820191016117f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114611874576040519150601f19603f3d011682016040523d82523d6000602084013e611879565b606091505b5091509150811561188c57606081015192505b826118975760001992505b505092915050565b601d5481565b6001546001600160a01b031690565b6021602052600090815260409020546001600160a01b031681565b6001546000906001600160a01b03166118e6612128565b6001600160a01b031614905090565b60166020526000908152604090205481565b7356d811088235f11c8920698a204a5010a788f4b381565b601f5481565b601c6020526000908152604090205481565b601b6020526000908152604090205481565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460088801546009890154600a9099015497999698959794969593949293919290916001600160a01b039081169190811690600160a01b900460ff168c565b60066020819052600091825260409091208054600182015460028301546003840154600485015460058601549590960154939560ff8416956101009094046001600160a01b03908116959381169492169290919088565b60265481565b60186020526000908152604090205481565b6013546001600160a01b031681565b601a5481565b60208080526000928352604080842090915290825290205481565b600080606073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b031663d06ca61f86866040516024018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611ace578181015183820152602001611ab6565b5050505090500193505050506040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040518082805190602001908083835b60208310611b355780518252601f199092019160209182019101611b16565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114611b95576040519150601f19603f3d011682016040523d82523d6000602084013e611b9a565b606091505b509150915081156118975780510151949350505050565b611bb96118cf565b611bf9576040805162461bcd60e51b815260206004820152600c60248201526b1d5b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b611c028161212c565b50565b736b175474e89094c44da98b954eedeac495271d0f81565b600080808315611c9c57611c32898986610d34565b909350905082611c49575060009150819050611fb3565b84831115611c97576040805162461bcd60e51b81526020600482015260166024820152750e6deeae4c6ca40c2dadeeadce840e8dede40d0d2ced60531b604482015290519081900360640190fd5b611cc1565b859250611caa898985611311565b909250905081611cc1575060009150819050611fb3565b60606001600160a01b03821615611d82576040805160038082526080820190925290602082016060803883390190505090508981600081518110611d0157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110611d2f57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508881600281518110611d5d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611dff565b60408051600280825260608201835290916020830190803883390190505090508981600081518110611db057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508881600181518110611dde57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b606073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b03166338ed1739866001858d426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611ea3578181015183820152602001611e8b565b505050509050019650505050505050600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f0957600080fd5b8101908080516040519392919084600160201b821115611f2857600080fd5b908301906020820185811115611f3d57600080fd5b82518660208202830111600160201b82111715611f5957600080fd5b82525081516020918201928201910280838360005b83811015611f86578181015183820152602001611f6e565b50505050905001604052505050905080600182510381518110611fa557fe5b602002602001015193505050505b965096945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526120109084906121cd565b505050565b80158061209b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561206d57600080fd5b505afa158015612081573d6000803e3d6000fd5b505050506040513d602081101561209757600080fd5b5051155b6120d65760405162461bcd60e51b81526004018080602001828103825260368152602001806124186036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526120109084906121cd565b3390565b6001600160a01b0381166121715760405162461bcd60e51b81526004018080602001828103825260268152602001806123c86026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6121df826001600160a01b031661238b565b612230576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061226e5780518252601f19909201916020918201910161224f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146122d0576040519150601f19603f3d011682016040523d82523d6000602084013e6122d5565b606091505b50915091508161232c576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156123855780806020019051602081101561234857600080fd5b50516123855760405162461bcd60e51b815260040180806020018281038252602a8152602001806123ee602a913960400191505060405180910390fd5b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906123bf57508115155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820de1007b2ece1a9f2bc0bb59bb32f57f06782e242236bfc59d588375ffe701d4264736f6c63430005110032
Deployed Bytecode Sourcemap
34883:9796:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34883:9796:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36628:249;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36628:249:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28274:69;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28274:69:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27773:47;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27773:47:0;-1:-1:-1;;;;;;27773:47:0;;:::i;:::-;;;;-1:-1:-1;;;;;27773:47:0;;;;;;;;;;;;;;31699:56;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31699:56:0;-1:-1:-1;;;;;31699:56:0;;:::i;30039:45::-;;;:::i;35327:1293::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;35327:1293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31133:32;;;:::i;35243:73::-;;;:::i;28145:67::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28145:67:0;;;;;;;;:::i;30311:56::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30311:56:0;-1:-1:-1;;;;;30311:56:0;;:::i;13791:86::-;;;:::i;38983:2173::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;38983:2173:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38983:2173:0;;;;;;;;;;;;;;;;35163:73;;;:::i;28407:71::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28407:71:0;;;;;;-1:-1:-1;;;;;28407:71:0;;:::i;:::-;;;;;;;;;;;;;;;;;;29687:56;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29687:56:0;-1:-1:-1;;;;;29687:56:0;;:::i;29551:43::-;;;:::i;42489:290::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42489:290:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;42489:290:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42489:290:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;42489:290:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42489:290:0;;-1:-1:-1;42489:290:0;;-1:-1:-1;;;;;42489:290:0:i;:::-;;13599:93;;;:::i;32346:39::-;;;:::i;28695:53::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28695:53:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;28554:78;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28554:78:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31931:48;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31931:48:0;-1:-1:-1;;;;;31931:48:0;;:::i;32206:44::-;;;:::i;34978:82::-;;;:::i;27635:24::-;;;:::i;27501:25::-;;;:::i;36885:2090::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36885:2090:0;;;;;;;;;;;;;;;;;:::i;41787:694::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41787:694:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41787:694:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41787:694:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41787:694:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41787:694:0;;-1:-1:-1;41787:694:0;;-1:-1:-1;;;;;41787:694:0:i;30998:32::-;;;:::i;23125:79::-;;;:::i;31580:56::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31580:56:0;-1:-1:-1;;;;;31580:56:0;;:::i;23471:94::-;;;:::i;29840:56::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29840:56:0;-1:-1:-1;;;;;29840:56:0;;:::i;13699:85::-;;;:::i;31271:45::-;;;:::i;30794:58::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30794:58:0;-1:-1:-1;;;;;30794:58:0;;:::i;30640:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30640:58:0;-1:-1:-1;;;;;30640:58:0;;:::i;27909:38::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27909:38:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27909:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28020:49;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28020:49:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;28020:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32056:40;;;:::i;30159:56::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30159:56:0;-1:-1:-1;;;;;30159:56:0;;:::i;29417:29::-;;;:::i;30509:47::-;;;:::i;31401:84::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31401:84:0;;;;;;;;;;:::i;41164:615::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41164:615:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41164:615:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41164:615:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41164:615:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41164:615:0;;-1:-1:-1;41164:615:0;;-1:-1:-1;;;;;41164:615:0:i;23720:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23720:109:0;-1:-1:-1;;;;;23720:109:0;;:::i;35084:72::-;;;:::i;36628:249::-;36848:21;;;-1:-1:-1;;;36848:21:0;;;;;;;;;;;;-1:-1:-1;;;36848:21:0;;;;;;36810:20;;36848:21;;;;;;;28274:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27773:47::-;;;;;;;;;;;;-1:-1:-1;;;;;27773:47:0;;:::o;31699:56::-;;;;;;;;;;;;-1:-1:-1;;;;;31699:56:0;;:::o;30039:45::-;;;;:::o;35327:1293::-;35645:31;35678:29;35755:16;-1:-1:-1;;;;;35733:38:0;:18;-1:-1:-1;;;;;35733:38:0;;;35725:65;;;;;-1:-1:-1;;;35725:65:0;;;;;;;;;;;;-1:-1:-1;;;35725:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35809:35:0;;;;;;:15;:35;;;;;;;;:72;;;;-1:-1:-1;;;;;;35848:33:0;;;;;;:15;:33;;;;;;;;35809:72;35801:99;;;;;-1:-1:-1;;;35801:99:0;;;;;;;;;;;;-1:-1:-1;;;35801:99:0;;;;;;;;;;;;;;;35941:18;36002:4;36071:225;35941:18;36131:16;36162:15;36192:20;36227;36262:23;36071:12;:225::i;:::-;36020:276;-1:-1:-1;36020:276:0;-1:-1:-1;;;;;;36313:37:0;;;;;;;;;;:85;;;36378:20;36354:21;:44;36313:85;36309:304;;;36461:140;-1:-1:-1;;;;;36461:24:0;;36504:21;36544:42;;;36461:140;:24;:140;:::i;:::-;35327:1293;;;;;;;;;;;;:::o;31133:32::-;;;;:::o;35243:73::-;35274:42;35243:73;:::o;28145:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30311:56::-;;;;;;;;;;;;;:::o;13791:86::-;13835:42;13791:86;:::o;38983:2173::-;39153:16;39171;39231;-1:-1:-1;;;;;39209:38:0;:18;-1:-1:-1;;;;;39209:38:0;;39205:1944;;;39275:9;39264:20;;39205:1944;;;39306:14;;39302:1847;;39394:16;;;39408:1;39394:16;;;39370:21;39394:16;;;;;39337;;39370:21;;39394:16;39408:1;39394:16;;;;;105:10:-1;39394:16:0;88:34:-1;136:17;;-1:-1;39394:16:0;39370:40;;39435:18;39425:4;39430:1;39425:7;;;;;;;;;;;;;:28;-1:-1:-1;;;;;39425:28:0;;;-1:-1:-1;;;;;39425:28:0;;;;;39478:16;39468:4;39473:1;39468:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;39468:26:0;;;-1:-1:-1;;;;;39468:26:0;;;;;39520:29;39533:9;39544:4;39520:12;:29::i;:::-;39573:16;;;39587:1;39573:16;;;;;;;;;39509:40;;-1:-1:-1;39573:16:0;;;17:15:-1;;105:10;39573:16:0;88:34:-1;136:17;;-1:-1;39573:16:0;39566:23;;39614:18;39604:4;39609:1;39604:7;;;;;;;;;;;;;:28;-1:-1:-1;;;;;39604:28:0;;;-1:-1:-1;;;;;39604:28:0;;;;;39657:16;39647:4;39652:1;39647:7;;;;;;;;-1:-1:-1;;;;;39647:26:0;;;:7;;;;;;;;;:26;39706:40;;13649:42;39706:40;;;;:82;;-1:-1:-1;;;;;;39750:38:0;;13649:42;39750:38;;39706:82;39702:367;;;13649:42;39809:4;39814:1;39809:7;;;;;;;;;;;;;:28;-1:-1:-1;;;;;39809:28:0;;;-1:-1:-1;;;;;39809:28:0;;;;;39867:29;39880:9;39891:4;39867:12;:29::i;:::-;39856:40;;39930:8;39919;:19;39915:139;;;39974:8;39963:19;;13649:42;40005:29;;39915:139;-1:-1:-1;;;;;40089:25:0;;35114:42;40089:25;;;;:52;;-1:-1:-1;;;;;;40118:23:0;;35114:42;40118:23;;40089:52;40085:307;;;35114:42;40162:4;40167:1;40162:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;40162:13:0;;;-1:-1:-1;;;;;40162:13:0;;;;;40205:29;40218:9;40229:4;40205:12;:29::i;:::-;40194:40;;40268:8;40257;:19;40253:124;;;40312:8;40301:19;;35114:42;40343:14;;40253:124;-1:-1:-1;;;;;40412:26:0;;35194:42;40412:26;;;;:54;;-1:-1:-1;;;;;;40442:24:0;;35194:42;40442:24;;40412:54;40408:311;;;35194:42;40487:4;40492:1;40487:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;40487:14:0;;;-1:-1:-1;;;;;40487:14:0;;;;;40531:29;40544:9;40555:4;40531:12;:29::i;:::-;40520:40;;40594:8;40583;:19;40579:125;;;40638:8;40627:19;;35194:42;40669:15;;40579:125;-1:-1:-1;;;;;40739:26:0;;35274:42;40739:26;;;;:54;;-1:-1:-1;;;;;;40769:24:0;;35274:42;40769:24;;40739:54;40735:311;;;35274:42;40814:4;40819:1;40814:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;40814:14:0;;;-1:-1:-1;;;;;40814:14:0;;;;;40858:29;40871:9;40882:4;40858:12;:29::i;:::-;40847:40;;40921:8;40910;:19;40906:125;;;40965:8;40954:19;;35274:42;40996:15;;40906:125;-1:-1:-1;;41066:8:0;:23;41062:76;;;41121:1;41110:12;;41062:76;39302:1847;;;38983:2173;;;;;;:::o;35163:73::-;35194:42;35163:73;:::o;28407:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29687:56::-;;;;;;;;;;;;;:::o;29551:43::-;;;;:::o;42489:290::-;42587:9;42582:190;42606:6;:13;42602:1;:17;42582:190;;;42641:47;35018:42;42686:1;42648:6;42655:1;42648:9;;;;;;;;;;;;;;-1:-1:-1;;;;;42641:29:0;;;:47;;;;;:::i;:::-;42703:57;35018:42;-1:-1:-1;;42710:6:0;42717:1;42710:9;;;;;;;42703:57;42621:3;;42582:190;;;;42489:290;:::o;13599:93::-;13649:42;13599:93;:::o;32346:39::-;;;;:::o;28695:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28554:78::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31931:48::-;;;;;;;;;;;;;;;:::o;32206:44::-;;;;:::o;34978:82::-;35018:42;34978:82;:::o;27635:24::-;;;-1:-1:-1;;;;;27635:24:0;;:::o;27501:25::-;;;-1:-1:-1;;;;;27501:25:0;;:::o;36885:2090::-;37055:17;37074:16;37134;-1:-1:-1;;;;;37112:38:0;:18;-1:-1:-1;;;;;37112:38:0;;37108:1860;;;37179:8;37167:20;;37108:1860;;;37209:13;;37205:1763;;37296:16;;;37310:1;37296:16;;;37272:21;37296:16;;;;;37239;;37272:21;;37296:16;37310:1;37296:16;;;;;105:10:-1;37296:16:0;88:34:-1;136:17;;-1:-1;37296:16:0;37272:40;;37337:18;37327:4;37332:1;37327:7;;;;;;;;;;;;;:28;-1:-1:-1;;;;;37327:28:0;;;-1:-1:-1;;;;;37327:28:0;;;;;37380:16;37370:4;37375:1;37370:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;37370:26:0;;;-1:-1:-1;;;;;37370:26:0;;;;;37423:29;37437:8;37447:4;37423:13;:29::i;:::-;37476:16;;;37490:1;37476:16;;;;;;;;;37411:41;;-1:-1:-1;37476:16:0;;;17:15:-1;;105:10;37476:16:0;88:34:-1;136:17;;-1:-1;37476:16:0;37469:23;;37517:18;37507:4;37512:1;37507:7;;;;;;;;;;;;;:28;-1:-1:-1;;;;;37507:28:0;;;-1:-1:-1;;;;;37507:28:0;;;;;37560:16;37550:4;37555:1;37550:7;;;;;;;;-1:-1:-1;;;;;37550:26:0;;;:7;;;;;;;;;:26;37609:40;;13649:42;37609:40;;;;:82;;-1:-1:-1;;;;;;37653:38:0;;13649:42;37653:38;;37609:82;37605:369;;;13649:42;37712:4;37717:1;37712:7;;;;;;;;;;;;;:28;-1:-1:-1;;;;;37712:28:0;;;-1:-1:-1;;;;;37712:28:0;;;;;37770:29;37784:8;37794:4;37770:13;:29::i;:::-;37759:40;;37833:9;37822:8;:20;37818:141;;;37879:8;37867:20;;13649:42;37910:29;;37818:141;-1:-1:-1;;;;;37994:25:0;;35114:42;37994:25;;;;:52;;-1:-1:-1;;;;;;38023:23:0;;35114:42;38023:23;;37994:52;37990:309;;;35114:42;38067:4;38072:1;38067:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;38067:13:0;;;-1:-1:-1;;;;;38067:13:0;;;;;38110:29;38124:8;38134:4;38110:13;:29::i;:::-;38099:40;;38173:9;38162:8;:20;38158:126;;;38219:8;38207:20;;35114:42;38250:14;;38158:126;-1:-1:-1;;;;;38319:26:0;;35194:42;38319:26;;;;:54;;-1:-1:-1;;;;;;38349:24:0;;35194:42;38349:24;;38319:54;38315:313;;;35194:42;38394:4;38399:1;38394:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;38394:14:0;;;-1:-1:-1;;;;;38394:14:0;;;;;38438:29;38452:8;38462:4;38438:13;:29::i;:::-;38427:40;;38501:9;38490:8;:20;38486:127;;;38547:8;38535:20;;35194:42;38578:15;;38486:127;-1:-1:-1;;;;;38648:26:0;;35274:42;38648:26;;;;:54;;-1:-1:-1;;;;;;38678:24:0;;35274:42;38678:24;;38648:54;38644:313;;;35274:42;38723:4;38728:1;38723:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;38723:14:0;;;-1:-1:-1;;;;;38723:14:0;;;;;38767:29;38781:8;38791:4;38767:13;:29::i;:::-;38756:40;;38830:9;38819:8;:20;38815:127;;;-1:-1:-1;38876:8:0;35274:42;;-1:-1:-1;36885:2090:0;-1:-1:-1;;;;36885:2090:0:o;41787:694::-;41918:16;41953:12;41967:17;35018:42;-1:-1:-1;;;;;41988:24:0;42068:10;42142:9;42170:4;42027:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;42027:162:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42027:162:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;42027:162:0;41988:212;;;;;;;;;;;;;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;;;41988:212: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;;41952:248:0;;;;42215:7;42211:185;;;42335:2;42325:13;;42319:20;;-1:-1:-1;42288:97:0;42410:13;42406:68;;-1:-1:-1;;42440:22:0;;42406:68;41787:694;;;;;;:::o;30998:32::-;;;;:::o;23125:79::-;23190:6;;-1:-1:-1;;;;;23190:6:0;23125:79;:::o;31580:56::-;;;;;;;;;;;;-1:-1:-1;;;;;31580:56:0;;:::o;23471:94::-;23551:6;;23511:4;;-1:-1:-1;;;;;23551:6:0;23535:12;:10;:12::i;:::-;-1:-1:-1;;;;;23535:22:0;;23528:29;;23471:94;:::o;29840:56::-;;;;;;;;;;;;;:::o;13699:85::-;13742:42;13699:85;:::o;31271:45::-;;;;:::o;30794:58::-;;;;;;;;;;;;;:::o;30640:::-;;;;;;;;;;;;;:::o;27909:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27909:38:0;;;;;;;;-1:-1:-1;;;27909:38:0;;;;;:::o;28020:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28020:49:0;;;;;;;;;;;;;;;:::o;32056:40::-;;;;:::o;30159:56::-;;;;;;;;;;;;;:::o;29417:29::-;;;-1:-1:-1;;;;;29417:29:0;;:::o;30509:47::-;;;;:::o;31401:84::-;;;;;;;;;;;;;;;;;;;;;;;:::o;41164:615::-;41295:17;41331:12;41345:17;35018:42;-1:-1:-1;;;;;41366:24:0;41446:10;41521:8;41548:4;41405:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;41405:162:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41405:162:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;41405:162:0;41366:212;;;;;;;;;;;;;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;;;41366:212: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;;41330:248:0;;;;41593:7;41589:183;;;41631:11;;41704:14;41698:21;;41164:615;-1:-1:-1;;;;41164:615:0:o;23720:109::-;23337:9;:7;:9::i;:::-;23329:34;;;;;-1:-1:-1;;;23329:34:0;;;;;;;;;;;;-1:-1:-1;;;23329:34:0;;;;;;;;;;;;;;;23793:28;23812:8;23793:18;:28::i;:::-;23720:109;:::o;35084:72::-;35114:42;35084:72;:::o;42787:1889::-;43072:29;;;43183:28;;43179:791;;43264:140;43294:18;43331:16;43366:23;43264:11;:140::i;:::-;43228:176;;-1:-1:-1;43228:176:0;-1:-1:-1;43423:26:0;43419:80;;-1:-1:-1;43478:1:0;;-1:-1:-1;43478:1:0;;-1:-1:-1;43470:13:0;;43419:80;43546:20;43521:21;:45;;43513:80;;;;;-1:-1:-1;;;43513:80:0;;;;;;;;;;;;-1:-1:-1;;;43513:80:0;;;;;;;;;;;;;;;43179:791;;;43650:20;43626:44;;43723:139;43754:18;43791:16;43826:21;43723:12;:139::i;:::-;43685:177;;-1:-1:-1;43685:177:0;-1:-1:-1;43881:28:0;43877:82;;-1:-1:-1;43938:1:0;;-1:-1:-1;43938:1:0;;-1:-1:-1;43930:13:0;;43877:82;43982:21;-1:-1:-1;;;;;44018:22:0;;;44014:335;;44064:16;;;44078:1;44064:16;;;;;;;;;;;;;17:15:-1;;105:10;44064:16:0;88:34:-1;136:17;;-1:-1;44064:16:0;44057:23;;44105:18;44095:4;44100:1;44095:7;;;;;;;;;;;;;:28;-1:-1:-1;;;;;44095:28:0;;;-1:-1:-1;;;;;44095:28:0;;;;;44148:8;44138:4;44143:1;44138:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;44138:18:0;;;-1:-1:-1;;;;;44138:18:0;;;;;44181:16;44171:4;44176:1;44171:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;44171:26:0;;;-1:-1:-1;;;;;44171:26:0;;;;;44014:335;;;44237:16;;;44251:1;44237:16;;;;;;;;;;;;;;;105:10:-1;44237:16:0;88:34:-1;136:17;;-1:-1;44237:16:0;44230:23;;44278:18;44268:4;44273:1;44268:7;;;;;;;;;;;;;:28;-1:-1:-1;;;;;44268:28:0;;;-1:-1:-1;;;;;44268:28:0;;;;;44321:16;44311:4;44316:1;44311:7;;;;;;;;;;;;;:26;-1:-1:-1;;;;;44311:26:0;;;-1:-1:-1;;;;;44311:26:0;;;;;44014:335;44361:24;35018:42;-1:-1:-1;;;;;44388:56:0;;44459:21;44495:1;44527:4;44546:15;44576;44388:214;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44388:214:0;-1:-1:-1;;;;;44388:214: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;44388:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44388:214:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44388:214:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44388:214:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;44388:214:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;44388:214:0;;421:4:-1;412:14;;;;44388:214:0;;;;;412:14:-1;44388:214: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;44388:214:0;;;;;;;;;;;44361:241;;44641:7;44666:1;44649:7;:14;:18;44641:27;;;;;;;;;;;;;;44615:53;;42787:1889;;;;;;;;;;;;;:::o;10020:176::-;10129:58;;;-1:-1:-1;;;;;10129:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10129:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10103:85:0;;10122:5;;10103:18;:85::i;:::-;10020:176;;;:::o;10416:621::-;10786:10;;;10785:62;;-1:-1:-1;10802:39:0;;;-1:-1:-1;;;10802:39:0;;10826:4;10802:39;;;;-1:-1:-1;;;;;10802:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;10802:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10802:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10802:39:0;:44;10785:62;10777:152;;;;-1:-1:-1;;;10777:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10966:62;;;-1:-1:-1;;;;;10966:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10966:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10940:89:0;;10959:5;;10940:18;:89::i;21916:98::-;21996:10;21916:98;:::o;23935:229::-;-1:-1:-1;;;;;24009:22:0;;24001:73;;;;-1:-1:-1;;;24001:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24111:6;;24090:38;;-1:-1:-1;;;;;24090:38:0;;;;24111:6;;24090:38;;24111:6;;24090:38;24139:6;:17;;-1:-1:-1;;;;;;24139:17:0;-1:-1:-1;;;;;24139:17:0;;;;;;;;;;23935:229::o;12059:1114::-;12663:27;12671:5;-1:-1:-1;;;;;12663:25:0;;:27::i;:::-;12655:71;;;;;-1:-1:-1;;;12655:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12800:12;12814:23;12849:5;-1:-1:-1;;;;;12841:19:0;12861:4;12841: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;;;12841: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;;12799:67:0;;;;12885:7;12877:52;;;;;-1:-1:-1;;;12877:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12946:17;;:21;12942:224;;13088:10;13077:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13077:30:0;13069:85;;;;-1:-1:-1;;;13069:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12059:1114;;;;:::o;7152:619::-;7212:4;7680:20;;7523:66;7720:23;;;;;;:42;;-1:-1:-1;7747:15:0;;;7720:42;7712:51;7152:619;-1:-1:-1;;;;7152:619:0:o
Swarm Source
bzzr://de1007b2ece1a9f2bc0bb59bb32f57f06782e242236bfc59d588375ffe701d42
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.