More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 385 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Close | 20620215 | 109 days ago | IN | 0 ETH | 0.00064935 | ||||
Close | 20571499 | 116 days ago | IN | 0 ETH | 0.00121389 | ||||
Close | 20267329 | 158 days ago | IN | 0 ETH | 0.00078655 | ||||
Close | 19757059 | 230 days ago | IN | 0 ETH | 0.00169983 | ||||
Close | 19748493 | 231 days ago | IN | 0 ETH | 0.0017307 | ||||
Close | 19748487 | 231 days ago | IN | 0 ETH | 0.00179567 | ||||
Close | 19397086 | 280 days ago | IN | 0 ETH | 0.01290278 | ||||
Close | 19198505 | 308 days ago | IN | 0 ETH | 0.00898293 | ||||
Close | 18606417 | 391 days ago | IN | 0 ETH | 0.00512382 | ||||
Close | 18558240 | 398 days ago | IN | 0 ETH | 0.00814895 | ||||
Close | 18558133 | 398 days ago | IN | 0 ETH | 0.00066909 | ||||
Close | 18473690 | 410 days ago | IN | 0 ETH | 0.00639062 | ||||
Close | 18152572 | 455 days ago | IN | 0 ETH | 0.00282791 | ||||
Close | 18130375 | 458 days ago | IN | 0 ETH | 0.00325132 | ||||
Close | 18059051 | 468 days ago | IN | 0 ETH | 0.00267403 | ||||
Close | 18059051 | 468 days ago | IN | 0 ETH | 0.00326909 | ||||
Close | 17897139 | 490 days ago | IN | 0 ETH | 0.00514296 | ||||
Close | 17896934 | 490 days ago | IN | 0 ETH | 0.00497898 | ||||
Close | 17410348 | 559 days ago | IN | 0 ETH | 0.00548343 | ||||
Close | 16856437 | 637 days ago | IN | 0 ETH | 0.00539647 | ||||
Close | 16836098 | 640 days ago | IN | 0 ETH | 0.00720041 | ||||
Close | 16764807 | 650 days ago | IN | 0 ETH | 0.00985475 | ||||
Close | 16720512 | 656 days ago | IN | 0 ETH | 0.00986474 | ||||
Close | 16625179 | 669 days ago | IN | 0 ETH | 0.00428187 | ||||
Close | 16475636 | 690 days ago | IN | 0 ETH | 0.00551459 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
20571499 | 116 days ago | 0.00913193 ETH | ||||
20571499 | 116 days ago | 0.00913193 ETH | ||||
20267329 | 158 days ago | 0.021122 ETH | ||||
20267329 | 158 days ago | 0.021122 ETH | ||||
19757059 | 230 days ago | 0.01004269 ETH | ||||
19757059 | 230 days ago | 0.01004269 ETH | ||||
19748493 | 231 days ago | 0.01165699 ETH | ||||
19748493 | 231 days ago | 0.01165699 ETH | ||||
19748487 | 231 days ago | 0.01189361 ETH | ||||
19748487 | 231 days ago | 0.01189361 ETH | ||||
19397086 | 280 days ago | 0.08720419 ETH | ||||
19397086 | 280 days ago | 0.08720419 ETH | ||||
18606417 | 391 days ago | 0.02206009 ETH | ||||
18606417 | 391 days ago | 0.02206009 ETH | ||||
18473690 | 410 days ago | 0.03057582 ETH | ||||
18473690 | 410 days ago | 0.03057582 ETH | ||||
17410348 | 559 days ago | 0.03537909 ETH | ||||
17410348 | 559 days ago | 0.03537909 ETH | ||||
16764807 | 650 days ago | 0.07979554 ETH | ||||
16764807 | 650 days ago | 0.07979554 ETH | ||||
16720512 | 656 days ago | 6.33951667 ETH | ||||
16720512 | 656 days ago | 6.33951667 ETH | ||||
16254847 | 721 days ago | 0.69125426 ETH | ||||
16254847 | 721 days ago | 0.69125426 ETH | ||||
15857581 | 777 days ago | 0.01009311 ETH |
Loading...
Loading
Contract Name:
BetaRunnerUniswapV3
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-24 */ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.6; // Part: BetaRunnerWithCallback contract BetaRunnerWithCallback { address private constant NO_CALLER = address(42); // nonzero so we don't repeatedly clear storage address private caller = NO_CALLER; modifier withCallback() { require(caller == NO_CALLER); caller = msg.sender; _; caller = NO_CALLER; } modifier isCallback() { require(caller == tx.origin); _; } } // Part: BytesLib library BytesLib { function slice( bytes memory _bytes, uint _start, uint _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, 'slice_overflow'); require(_start + _length >= _start, 'slice_overflow'); require(_bytes.length >= _start + _length, 'slice_outOfBounds'); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) { require(_start + 20 >= _start, 'toAddress_overflow'); require(_bytes.length >= _start + 20, 'toAddress_outOfBounds'); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint24(bytes memory _bytes, uint _start) internal pure returns (uint24) { require(_start + 3 >= _start, 'toUint24_overflow'); require(_bytes.length >= _start + 3, 'toUint24_outOfBounds'); uint24 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x3), _start)) } return tempUint; } } // Part: IBetaBank interface IBetaBank { /// @dev Returns the address of BToken of the given underlying token, or 0 if not exists. function bTokens(address _underlying) external view returns (address); /// @dev Returns the address of the underlying of the given BToken, or 0 if not exists. function underlyings(address _bToken) external view returns (address); /// @dev Returns the address of the oracle contract. function oracle() external view returns (address); /// @dev Returns the address of the config contract. function config() external view returns (address); /// @dev Returns the interest rate model smart contract. function interestModel() external view returns (address); /// @dev Returns the position's collateral token and AmToken. function getPositionTokens(address _owner, uint _pid) external view returns (address _collateral, address _bToken); /// @dev Returns the debt of the given position. Can't be view as it needs to call accrue. function fetchPositionDebt(address _owner, uint _pid) external returns (uint); /// @dev Returns the LTV of the given position. Can't be view as it needs to call accrue. function fetchPositionLTV(address _owner, uint _pid) external returns (uint); /// @dev Opens a new position in the Beta smart contract. function open( address _owner, address _underlying, address _collateral ) external returns (uint pid); /// @dev Borrows tokens on the given position. function borrow( address _owner, uint _pid, uint _amount ) external; /// @dev Repays tokens on the given position. function repay( address _owner, uint _pid, uint _amount ) external; /// @dev Puts more collateral to the given position. function put( address _owner, uint _pid, uint _amount ) external; /// @dev Takes some collateral out of the position. function take( address _owner, uint _pid, uint _amount ) external; /// @dev Liquidates the given position. function liquidate( address _owner, uint _pid, uint _amount ) external; } // Part: IUniswapV3Pool interface IUniswapV3Pool { function mint( address recipient, int24 tickLower, int24 tickUpper, uint128 amount, bytes calldata data ) external returns (uint amount0, uint amount1); function swap( address recipient, bool zeroForOne, int amountSpecified, uint160 sqrtPriceLimitX96, bytes calldata data ) external returns (int amount0, int amount1); function initialize(uint160 sqrtPriceX96) external; } // Part: IUniswapV3SwapCallback interface IUniswapV3SwapCallback { function uniswapV3SwapCallback( int amount0Delta, int amount1Delta, bytes calldata data ) external; } // Part: IWETH interface IWETH { function deposit() external payable; function withdraw(uint wad) external; function approve(address guy, uint wad) external returns (bool); } // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/Context /* * @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 meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Part: OpenZeppelin/[email protected]/Math /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute. return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2); } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // Part: SafeCast /// @title Safe casting methods /// @notice Contains methods for safely casting between types library SafeCast { /// @notice Cast a uint256 to a uint160, revert on overflow /// @param y The uint256 to be downcasted /// @return z The downcasted integer, now type uint160 function toUint160(uint y) internal pure returns (uint160 z) { require((z = uint160(y)) == y); } /// @notice Cast a int256 to a int128, revert on overflow or underflow /// @param y The int256 to be downcasted /// @return z The downcasted integer, now type int128 function toInt128(int y) internal pure returns (int128 z) { require((z = int128(y)) == y); } /// @notice Cast a uint256 to a int256, revert on overflow /// @param y The uint256 to be casted /// @return z The casted integer, now type int256 function toInt256(uint y) internal pure returns (int z) { require(y < 2**255); z = int(y); } } // Part: OpenZeppelin/[email protected]/Ownable /** * @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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * 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. */ abstract 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Part: Path /// @title Functions for manipulating path data for multihop swaps library Path { using BytesLib for bytes; /// @dev The length of the bytes encoded address uint private constant ADDR_SIZE = 20; /// @dev The length of the bytes encoded fee uint private constant FEE_SIZE = 3; /// @dev The offset of a single token address and pool fee uint private constant NEXT_OFFSET = ADDR_SIZE + FEE_SIZE; /// @dev The offset of an encoded pool key uint private constant POP_OFFSET = NEXT_OFFSET + ADDR_SIZE; /// @dev The minimum length of an encoding that contains 2 or more pools uint private constant MULTIPLE_POOLS_MIN_LENGTH = POP_OFFSET + NEXT_OFFSET; /// @notice Returns true iff the path contains two or more pools /// @param path The encoded swap path /// @return True if path contains two or more pools, otherwise false function hasMultiplePools(bytes memory path) internal pure returns (bool) { return path.length >= MULTIPLE_POOLS_MIN_LENGTH; } /// @notice Decodes the first pool in path /// @param path The bytes encoded swap path /// @return tokenA The first token of the given pool /// @return tokenB The second token of the given pool /// @return fee The fee level of the pool function decodeFirstPool(bytes memory path) internal pure returns ( address tokenA, address tokenB, uint24 fee ) { tokenA = path.toAddress(0); fee = path.toUint24(ADDR_SIZE); tokenB = path.toAddress(NEXT_OFFSET); } /// @notice Decodes the last pool in path /// @param path The bytes encoded swap path /// @return tokenA The first token of the given pool /// @return tokenB The second token of the given pool /// @return fee The fee level of the pool function decodeLastPool(bytes memory path) internal pure returns ( address tokenA, address tokenB, uint24 fee ) { tokenB = path.toAddress(path.length - ADDR_SIZE); fee = path.toUint24(path.length - NEXT_OFFSET); tokenA = path.toAddress(path.length - POP_OFFSET); } /// @notice Skips a token + fee element from the buffer and returns the remainder /// @param path The swap path /// @return The remaining token + fee elements in the path function skipToken(bytes memory path) internal pure returns (bytes memory) { return path.slice(NEXT_OFFSET, path.length - NEXT_OFFSET); } } // Part: BetaRunnerBase contract BetaRunnerBase is Ownable { using SafeERC20 for IERC20; address public immutable betaBank; address public immutable weth; modifier onlyEOA() { require(msg.sender == tx.origin, 'BetaRunnerBase/not-eoa'); _; } constructor(address _betaBank, address _weth) { address bweth = IBetaBank(_betaBank).bTokens(_weth); require(bweth != address(0), 'BetaRunnerBase/no-bweth'); IERC20(_weth).safeApprove(_betaBank, type(uint).max); IERC20(_weth).safeApprove(bweth, type(uint).max); betaBank = _betaBank; weth = _weth; } function _borrow( address _owner, uint _pid, address _underlying, address _collateral, uint _amountBorrow, uint _amountCollateral ) internal { if (_pid == type(uint).max) { _pid = IBetaBank(betaBank).open(_owner, _underlying, _collateral); } else { (address collateral, address bToken) = IBetaBank(betaBank).getPositionTokens(_owner, _pid); require(_collateral == collateral, '_borrow/collateral-not-_collateral'); require(_underlying == IBetaBank(betaBank).underlyings(bToken), '_borrow/bad-underlying'); } _approve(_collateral, betaBank, _amountCollateral); IBetaBank(betaBank).put(_owner, _pid, _amountCollateral); IBetaBank(betaBank).borrow(_owner, _pid, _amountBorrow); } function _repay( address _owner, uint _pid, address _underlying, address _collateral, uint _amountRepay, uint _amountCollateral ) internal { (address collateral, address bToken) = IBetaBank(betaBank).getPositionTokens(_owner, _pid); require(_collateral == collateral, '_repay/collateral-not-_collateral'); require(_underlying == IBetaBank(betaBank).underlyings(bToken), '_repay/bad-underlying'); _approve(_underlying, bToken, _amountRepay); IBetaBank(betaBank).repay(_owner, _pid, _amountRepay); IBetaBank(betaBank).take(_owner, _pid, _amountCollateral); } function _transferIn( address _token, address _from, uint _amount ) internal { if (_token == weth) { require(_from == msg.sender, '_transferIn/not-from-sender'); require(_amount <= msg.value, '_transferIn/insufficient-eth-amount'); IWETH(weth).deposit{value: _amount}(); if (msg.value > _amount) { (bool success, ) = _from.call{value: msg.value - _amount}(new bytes(0)); require(success, '_transferIn/eth-transfer-failed'); } } else { IERC20(_token).safeTransferFrom(_from, address(this), _amount); } } function _transferOut( address _token, address _to, uint _amount ) internal { if (_token == weth) { IWETH(weth).withdraw(_amount); (bool success, ) = _to.call{value: _amount}(new bytes(0)); require(success, '_transferOut/eth-transfer-failed'); } else { IERC20(_token).safeTransfer(_to, _amount); } } /// @dev Approves infinite on the given token for the given spender if current approval is insufficient. function _approve( address _token, address _spender, uint _minAmount ) internal { uint current = IERC20(_token).allowance(address(this), _spender); if (current < _minAmount) { if (current != 0) { IERC20(_token).safeApprove(_spender, 0); } IERC20(_token).safeApprove(_spender, type(uint).max); } } /// @dev Caps repay amount by current position's debt. function _capRepay( address _owner, uint _pid, uint _amountRepay ) internal returns (uint) { return Math.min(_amountRepay, IBetaBank(betaBank).fetchPositionDebt(_owner, _pid)); } /// @dev Recovers lost tokens for whatever reason by the owner. function recover(address _token, uint _amount) external onlyOwner { if (_amount == type(uint).max) { _amount = IERC20(_token).balanceOf(address(this)); } IERC20(_token).safeTransfer(msg.sender, _amount); } /// @dev Recovers lost ETH for whatever reason by the owner. function recoverETH(uint _amount) external onlyOwner { if (_amount == type(uint).max) { _amount = address(this).balance; } (bool success, ) = msg.sender.call{value: _amount}(new bytes(0)); require(success, 'recoverETH/eth-transfer-failed'); } /// @dev Override Ownable.sol renounceOwnership to prevent accidental call function renounceOwnership() public override onlyOwner { revert('renounceOwnership/disabled'); } receive() external payable { require(msg.sender == weth, 'receive/not-weth'); } } // File: BetaRunnerUniswapV3.sol contract BetaRunnerUniswapV3 is BetaRunnerBase, BetaRunnerWithCallback, IUniswapV3SwapCallback { using SafeERC20 for IERC20; using Path for bytes; using SafeCast for uint; /// @dev Constants from Uniswap V3 to be used for swap /// (https://github.com/Uniswap/uniswap-v3-core/blob/main/contracts/libraries/TickMath.sol) uint160 internal constant MIN_SQRT_RATIO = 4295128739; uint160 internal constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342; address public immutable factory; bytes32 public immutable codeHash; constructor( address _betaBank, address _weth, address _factory, bytes32 _codeHash ) BetaRunnerBase(_betaBank, _weth) { factory = _factory; codeHash = _codeHash; } struct ShortData { uint pid; uint amountBorrow; uint amountPutExtra; bytes path; uint amountOutMin; } struct CloseData { uint pid; uint amountRepay; uint amountTake; bytes path; uint amountInMax; } struct CallbackData { uint pid; address path0; uint amount0; int memo; // positive if short (extra collateral) | negative if close (amount to take) bytes path; uint slippageControl; // amountInMax if close | amountOutMin if short } /// @dev Borrows the asset using the given collateral, and swaps it using the given path. function short(ShortData calldata _data) external payable onlyEOA withCallback { (, address collateral, ) = _data.path.decodeLastPool(); _transferIn(collateral, msg.sender, _data.amountPutExtra); (address tokenIn, address tokenOut, uint24 fee) = _data.path.decodeFirstPool(); bool zeroForOne = tokenIn < tokenOut; CallbackData memory cb = CallbackData({ pid: _data.pid, path0: tokenIn, amount0: _data.amountBorrow, memo: _data.amountPutExtra.toInt256(), path: _data.path, slippageControl: _data.amountOutMin }); IUniswapV3Pool(_poolFor(tokenIn, tokenOut, fee)).swap( address(this), zeroForOne, _data.amountBorrow.toInt256(), zeroForOne ? MIN_SQRT_RATIO + 1 : MAX_SQRT_RATIO - 1, abi.encode(cb) ); } /// @dev Swaps the collateral to the underlying asset using the given path, and repays it to the pool. function close(CloseData calldata _data) external payable onlyEOA withCallback { uint amountRepay = _capRepay(msg.sender, _data.pid, _data.amountRepay); (address tokenOut, address tokenIn, uint24 fee) = _data.path.decodeFirstPool(); bool zeroForOne = tokenIn < tokenOut; CallbackData memory cb = CallbackData({ pid: _data.pid, path0: tokenOut, amount0: amountRepay, memo: -_data.amountTake.toInt256(), path: _data.path, slippageControl: _data.amountInMax }); IUniswapV3Pool(_poolFor(tokenIn, tokenOut, fee)).swap( address(this), zeroForOne, -amountRepay.toInt256(), zeroForOne ? MIN_SQRT_RATIO + 1 : MAX_SQRT_RATIO - 1, abi.encode(cb) ); } /// @dev Continues the action through uniswapv3 function uniswapV3SwapCallback( int _amount0Delta, int _amount1Delta, bytes calldata _data ) external override isCallback { CallbackData memory data = abi.decode(_data, (CallbackData)); (uint amountToPay, uint amountReceived) = _amount0Delta > 0 ? (uint(_amount0Delta), uint(-_amount1Delta)) : (uint(_amount1Delta), uint(-_amount0Delta)); if (data.memo > 0) { _shortCallback(amountToPay, amountReceived, data); } else { _closeCallback(amountToPay, amountReceived, data); } } function _shortCallback( uint _amountToPay, uint _amountReceived, CallbackData memory data ) internal { (address tokenIn, address tokenOut, uint24 prevFee) = data.path.decodeFirstPool(); require(msg.sender == _poolFor(tokenIn, tokenOut, prevFee), '_shortCallback/bad-caller'); if (data.path.hasMultiplePools()) { data.path = data.path.skipToken(); (, address tokenNext, uint24 fee) = data.path.decodeFirstPool(); bool zeroForOne = tokenOut < tokenNext; IUniswapV3Pool(_poolFor(tokenOut, tokenNext, fee)).swap( address(this), zeroForOne, _amountReceived.toInt256(), zeroForOne ? MIN_SQRT_RATIO + 1 : MAX_SQRT_RATIO - 1, abi.encode(data) ); } else { uint amountPut = _amountReceived + uint(data.memo); require(_amountReceived >= data.slippageControl, '!slippage'); _borrow(tx.origin, data.pid, data.path0, tokenOut, data.amount0, amountPut); } IERC20(tokenIn).safeTransfer(msg.sender, _amountToPay); } function _closeCallback( uint _amountToPay, uint, CallbackData memory data ) internal { (address tokenOut, address tokenIn, uint24 prevFee) = data.path.decodeFirstPool(); require(msg.sender == _poolFor(tokenIn, tokenOut, prevFee), '_closeCallback/bad-caller'); if (data.path.hasMultiplePools()) { data.path = data.path.skipToken(); (, address tokenNext, uint24 fee) = data.path.decodeFirstPool(); bool zeroForOne = tokenNext < tokenIn; IUniswapV3Pool(_poolFor(tokenIn, tokenNext, fee)).swap( msg.sender, zeroForOne, -_amountToPay.toInt256(), zeroForOne ? MIN_SQRT_RATIO + 1 : MAX_SQRT_RATIO - 1, abi.encode(data) ); } else { require(_amountToPay <= data.slippageControl, '!slippage'); uint amountTake = uint(-data.memo); _repay(tx.origin, data.pid, data.path0, tokenIn, data.amount0, amountTake); IERC20(tokenIn).safeTransfer(msg.sender, _amountToPay); _transferOut(tokenIn, tx.origin, IERC20(tokenIn).balanceOf(address(this))); } } function _poolFor( address tokenA, address tokenB, uint24 fee ) internal view returns (address) { (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); bytes32 salt = keccak256(abi.encode(token0, token1, fee)); return address(uint160(uint(keccak256(abi.encodePacked(hex'ff', factory, salt, codeHash))))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_betaBank","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bytes32","name":"_codeHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"betaBank","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amountRepay","type":"uint256"},{"internalType":"uint256","name":"amountTake","type":"uint256"},{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountInMax","type":"uint256"}],"internalType":"struct BetaRunnerUniswapV3.CloseData","name":"_data","type":"tuple"}],"name":"close","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"codeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amountBorrow","type":"uint256"},{"internalType":"uint256","name":"amountPutExtra","type":"uint256"},{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"internalType":"struct BetaRunnerUniswapV3.ShortData","name":"_data","type":"tuple"}],"name":"short","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"_amount0Delta","type":"int256"},{"internalType":"int256","name":"_amount1Delta","type":"int256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"uniswapV3SwapCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610100604052600180546001600160a01b031916602a1790553480156200002557600080fd5b506040516200336e3803806200336e833981016040819052620000489162000607565b83836200005533620001b3565b6040516328f528cd60e11b81526001600160a01b038281166004830152600091908416906351ea519a9060240160206040518083038186803b1580156200009b57600080fd5b505afa158015620000b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d69190620005e9565b90506001600160a01b038116620001345760405162461bcd60e51b815260206004820152601760248201527f4265746152756e6e6572426173652f6e6f2d627765746800000000000000000060448201526064015b60405180910390fd5b6200015b83600019846001600160a01b03166200020360201b62000a9c179092919060201c565b6200018281600019846001600160a01b03166200020360201b62000a9c179092919060201c565b506001600160601b0319606092831b811660805290821b811660a05292901b90911660c05260e052506200071d9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801580620002915750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200025457600080fd5b505afa15801562000269573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028f91906200067d565b155b620003055760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200012b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200035d9185916200036216565b505050565b6000620003be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200044060201b62000bf8179092919060201c565b8051909150156200035d5780806020019051810190620003df919062000659565b6200035d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200012b565b60606200045184846000856200045b565b90505b9392505050565b606082471015620004be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200012b565b843b6200050e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200012b565b600080866001600160a01b031685876040516200052c919062000697565b60006040518083038185875af1925050503d80600081146200056b576040519150601f19603f3d011682016040523d82523d6000602084013e62000570565b606091505b509092509050620005838282866200058e565b979650505050505050565b606083156200059f57508162000454565b825115620005b05782518084602001fd5b8160405162461bcd60e51b81526004016200012b9190620006b5565b80516001600160a01b0381168114620005e457600080fd5b919050565b600060208284031215620005fc57600080fd5b6200045482620005cc565b600080600080608085870312156200061e57600080fd5b6200062985620005cc565b93506200063960208601620005cc565b92506200064960408601620005cc565b6060959095015193969295505050565b6000602082840312156200066c57600080fd5b815180151581146200045457600080fd5b6000602082840312156200069057600080fd5b5051919050565b60008251620006ab818460208701620006ea565b9190910192915050565b6020815260008251806020840152620006d6816040850160208701620006ea565b601f01601f19169190910160400192915050565b60005b8381101562000707578181015183820152602001620006ed565b8381111562000717576000848401525b50505050565b60805160601c60a05160601c60c05160601c60e051612b91620007dd600039600081816101390152610fcf0152600081816102790152610f9201526000818160bb015281816101a601528181610c8401528181610d720152818161219e01526121ec0152600081816101f20152818161104801528181611abc01528181611b6a01528181611c7201528181611d4e01528181611d8a01528181611e0a01528181611eaa01528181611fb1015281816120a501526121250152612b916000f3fe6080604052600436106100ab5760003560e01c8063715018a611610064578063715018a6146102345780638da5cb5b14610249578063c45a015514610267578063d33355531461029b578063f2fde38b146102bb578063fa461e33146102db57600080fd5b806318edaaf21461012757806333cbf0e81461016e5780633667bde7146101815780633fc8cef314610194578063550ba367146101e05780635705ae431461021457600080fd5b3661012257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101205760405162461bcd60e51b815260206004820152601060248201526f0e4cac6cad2ecca5edcdee85aeecae8d60831b60448201526064015b60405180910390fd5b005b600080fd5b34801561013357600080fd5b5061015b7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b61012061017c3660046127ea565b6102fb565b61012061018f3660046127ea565b6105dc565b3480156101a057600080fd5b506101c87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610165565b3480156101ec57600080fd5b506101c87f000000000000000000000000000000000000000000000000000000000000000081565b34801561022057600080fd5b5061012061022f3660046125fa565b61075e565b34801561024057600080fd5b50610120610824565b34801561025557600080fd5b506000546001600160a01b03166101c8565b34801561027357600080fd5b506101c87f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a757600080fd5b506101206102b6366004612827565b610896565b3480156102c757600080fd5b506101206102d6366004612586565b610981565b3480156102e757600080fd5b506101206102f636600461266c565b610a1c565b3332146103435760405162461bcd60e51b81526020600482015260166024820152754265746152756e6e6572426173652f6e6f742d656f6160501b6044820152606401610117565b6001546001600160a01b0316602a1461035b57600080fd5b600180546001600160a01b0319163317905560006103b961037f60608401846129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c1192505050565b509150506103cc81338460400135610c82565b6000808061041a6103e060608701876129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ec992505050565b9250925092506000826001600160a01b0316846001600160a01b031610905060006040518060c0016040528088600001358152602001866001600160a01b03168152602001886020013581526020016104768960400135610efe565b815260200161048860608a018a6129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250608089013560209091015290506104d7858585610f14565b6001600160a01b031663128acb0830846104f48b60200135610efe565b8661051d57610518600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b61052d565b61052d6401000276a36001612a4f565b8660405160200161053e9190612945565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161056d9594939291906128a1565b6040805180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190612648565b5050600180546001600160a01b031916602a17905550505050505050565b3332146106245760405162461bcd60e51b81526020600482015260166024820152754265746152756e6e6572426173652f6e6f742d656f6160501b6044820152606401610117565b6001546001600160a01b0316602a1461063c57600080fd5b600180546001600160a01b03191633908117909155600090610664908335602085013561101a565b90506000808061067a6103e060608701876129a7565b9250925092506000836001600160a01b0316836001600160a01b031610905060006040518060c0016040528088600001358152602001866001600160a01b031681526020018781526020016106d28960400135610efe565b6106db90612afd565b81526020016106ed60608a018a6129a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506080890135602090910152905061073c848685610f14565b6001600160a01b031663128acb0830846107558a610efe565b6104f490612afd565b6000546001600160a01b031633146107885760405162461bcd60e51b815260040161011790612910565b60001981141561080c576040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156107d157600080fd5b505afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108099190612840565b90505b6108206001600160a01b03831633836110ca565b5050565b6000546001600160a01b0316331461084e5760405162461bcd60e51b815260040161011790612910565b60405162461bcd60e51b815260206004820152601a60248201527f72656e6f756e63654f776e6572736869702f64697361626c65640000000000006044820152606401610117565b6000546001600160a01b031633146108c05760405162461bcd60e51b815260040161011790612910565b6000198114156108cd5750475b60408051600080825260208201909252339083906040516108ee9190612885565b60006040518083038185875af1925050503d806000811461092b576040519150601f19603f3d011682016040523d82523d6000602084013e610930565b606091505b50509050806108205760405162461bcd60e51b815260206004820152601e60248201527f7265636f7665724554482f6574682d7472616e736665722d6661696c656400006044820152606401610117565b6000546001600160a01b031633146109ab5760405162461bcd60e51b815260040161011790612910565b6001600160a01b038116610a105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610117565b610a19816110fa565b50565b6001546001600160a01b03163214610a3357600080fd5b6000610a41828401846126ec565b905060008060008713610a5d5785610a5888612afd565b610a67565b86610a6787612afd565b91509150600083606001511315610a8857610a8382828561114a565b610a93565b610a9382828561139a565b50505050505050565b801580610b255750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190612840565b155b610b905760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610117565b6040516001600160a01b038316602482015260448101829052610bf390849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261166b565b505050565b6060610c07848460008561173d565b90505b9392505050565b6000806000610c2e60148551610c279190612aba565b8590611865565b9150610c52610c3f60036014612a7a565b8551610c4b9190612aba565b8590611919565b9050610c7a6014610c64600382612a7a565b610c6e9190612a7a565b8551610c279190612aba565b949193509150565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415610eb4576001600160a01b0382163314610d145760405162461bcd60e51b815260206004820152601b60248201527f5f7472616e73666572496e2f6e6f742d66726f6d2d73656e64657200000000006044820152606401610117565b34811115610d705760405162461bcd60e51b815260206004820152602360248201527f5f7472616e73666572496e2f696e73756666696369656e742d6574682d616d6f6044820152621d5b9d60ea1b6064820152608401610117565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050505080341115610bf35760006001600160a01b038316610e028334612aba565b60408051600081526020810191829052610e1b91612885565b60006040518083038185875af1925050503d8060008114610e58576040519150601f19603f3d011682016040523d82523d6000602084013e610e5d565b606091505b5050905080610eae5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e73666572496e2f6574682d7472616e736665722d6661696c6564006044820152606401610117565b50505050565b610bf36001600160a01b0384168330846119c4565b60008080610ed78482611865565b9250610ee4846014611919565b9050610ef5610c2760036014612a7a565b91509193909250565b6000600160ff1b8210610f1057600080fd5b5090565b6000806000846001600160a01b0316866001600160a01b031610610f39578486610f3c565b85855b604080516001600160a01b03938416602080830191909152929093168382015262ffffff969096166060808401919091528651808403820181526080840188528051908301206001600160f81b031960a08501527f000000000000000000000000000000000000000000000000000000000000000090911b6bffffffffffffffffffffffff191660a184015260b58301527f000000000000000000000000000000000000000000000000000000000000000060d5808401919091528651808403909101815260f5909201909552805194019390932095945050505050565b604051620c3a4160e11b81526001600160a01b03848116600483015260248201849052600091610c079184917f0000000000000000000000000000000000000000000000000000000000000000909116906218748290604401602060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c59190612840565b6119fc565b6040516001600160a01b038316602482015260448101829052610bf390849063a9059cbb60e01b90606401610bbc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600061115c8460800151610ec9565b92509250925061116d838383610f14565b6001600160a01b0316336001600160a01b0316146111cd5760405162461bcd60e51b815260206004820152601960248201527f5f73686f727443616c6c6261636b2f6261642d63616c6c6572000000000000006044820152606401610117565b6111da8460800151611a12565b1561130e576111ec8460800151611a4c565b60808501819052600090819061120190610ec9565b9093509150506001600160a01b0380831690851610611221858484610f14565b6001600160a01b031663128acb08308361123a8c610efe565b856112635761125e600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b611273565b6112736401000276a36001612a4f565b8c6040516020016112849190612945565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016112b39594939291906128a1565b6040805180830381600087803b1580156112cc57600080fd5b505af11580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190612648565b505050505061137e565b60008460600151866113209190612a7a565b90508460a001518610156113625760405162461bcd60e51b815260206004820152600960248201526821736c69707061676560b81b6044820152606401610117565b61137c328660000151876020015186896040015186611a83565b505b6113926001600160a01b03841633886110ca565b505050505050565b60008060006113ac8460800151610ec9565b9250925092506113bd828483610f14565b6001600160a01b0316336001600160a01b03161461141d5760405162461bcd60e51b815260206004820152601960248201527f5f636c6f736543616c6c6261636b2f6261642d63616c6c6572000000000000006044820152606401610117565b61142a8460800151611a12565b156115675761143c8460800151611a4c565b60808501819052600090819061145190610ec9565b9093509150506001600160a01b0380851690831610611471858484610f14565b6001600160a01b031663128acb08338361148a8d610efe565b61149390612afd565b856114bc576114b7600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b6114cc565b6114cc6401000276a36001612a4f565b8c6040516020016114dd9190612945565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161150c9594939291906128a1565b6040805180830381600087803b15801561152557600080fd5b505af1158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190612648565b5050505050611392565b8360a001518611156115a75760405162461bcd60e51b815260206004820152600960248201526821736c69707061676560b81b6044820152606401610117565b600084606001516115b790612afd565b90506115d3328660000151876020015186896040015186611e7f565b6115e76001600160a01b03841633896110ca565b6040516370a0823160e01b8152306004820152610a9390849032906001600160a01b038316906370a082319060240160206040518083038186803b15801561162e57600080fd5b505afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190612840565b61219c565b60006116c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610bf89092919063ffffffff16565b805190915015610bf357808060200190518101906116de9190612626565b610bf35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610117565b60608247101561179e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610117565b843b6117ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610117565b600080866001600160a01b031685876040516118089190612885565b60006040518083038185875af1925050503d8060008114611845576040519150601f19603f3d011682016040523d82523d6000602084013e61184a565b606091505b509150915061185a828286612320565b979650505050505050565b600081611873816014612a7a565b10156118b65760405162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b6044820152606401610117565b6118c1826014612a7a565b835110156119095760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610117565b500160200151600160601b900490565b600081611927816003612a7a565b10156119695760405162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b6044820152606401610117565b611974826003612a7a565b835110156119bb5760405162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b6044820152606401610117565b50016003015190565b6040516001600160a01b0380851660248301528316604482015260648101829052610eae9085906323b872dd60e01b90608401610bbc565b6000818310611a0b5781610c0a565b5090919050565b6000611a2060036014612a7a565b6014611a2d600382612a7a565b611a379190612a7a565b611a419190612a7a565b825110159050919050565b6060611a7d611a5d60036014612a7a565b611a6960036014612a7a565b8451611a759190612aba565b849190612359565b92915050565b600019851415611b3f57604051637b8feacb60e11b81526001600160a01b038781166004830152858116602483015284811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063f71fd59690606401602060405180830381600087803b158015611b0057600080fd5b505af1158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b389190612840565b9450611d48565b60405163e507470960e01b81526001600160a01b0387811660048301526024820187905260009182917f0000000000000000000000000000000000000000000000000000000000000000169063e507470990604401604080518083038186803b158015611bab57600080fd5b505afa158015611bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be391906125c0565b91509150816001600160a01b0316856001600160a01b031614611c535760405162461bcd60e51b815260206004820152602260248201527f5f626f72726f772f636f6c6c61746572616c2d6e6f742d5f636f6c6c61746572604482015261185b60f21b6064820152608401610117565b604051630cf351b560e31b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063679a8da89060240160206040518083038186803b158015611cb457600080fd5b505afa158015611cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cec91906125a3565b6001600160a01b0316866001600160a01b031614611d455760405162461bcd60e51b81526020600482015260166024820152755f626f72726f772f6261642d756e6465726c79696e6760501b6044820152606401610117565b50505b611d73837f0000000000000000000000000000000000000000000000000000000000000000836124b0565b6040516315d21c8d60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632ba4391a90611dc3908990899086906004016128dc565b600060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505060405163c1bce0b760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063c1bce0b79150611e45908990899087906004016128dc565b600060405180830381600087803b158015611e5f57600080fd5b505af1158015611e73573d6000803e3d6000fd5b50505050505050505050565b60405163e507470960e01b81526001600160a01b0387811660048301526024820187905260009182917f0000000000000000000000000000000000000000000000000000000000000000169063e507470990604401604080518083038186803b158015611eeb57600080fd5b505afa158015611eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2391906125c0565b91509150816001600160a01b0316856001600160a01b031614611f925760405162461bcd60e51b815260206004820152602160248201527f5f72657061792f636f6c6c61746572616c2d6e6f742d5f636f6c6c61746572616044820152601b60fa1b6064820152608401610117565b604051630cf351b560e31b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063679a8da89060240160206040518083038186803b158015611ff357600080fd5b505afa158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b91906125a3565b6001600160a01b0316866001600160a01b0316146120835760405162461bcd60e51b81526020600482015260156024820152745f72657061792f6261642d756e6465726c79696e6760581b6044820152606401610117565b61208e8682866124b0565b604051638cd2e0c760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638cd2e0c7906120de908b908b9089906004016128dc565b600060405180830381600087803b1580156120f857600080fd5b505af115801561210c573d6000803e3d6000fd5b505060405163c640e9bf60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063c640e9bf9150612160908b908b9088906004016128dc565b600060405180830381600087803b15801561217a57600080fd5b505af115801561218e573d6000803e3d6000fd5b505050505050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316141561230c57604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561223857600080fd5b505af115801561224c573d6000803e3d6000fd5b5050604080516000808252602082019283905293506001600160a01b038616925084916122799190612885565b60006040518083038185875af1925050503d80600081146122b6576040519150601f19603f3d011682016040523d82523d6000602084013e6122bb565b606091505b5050905080610eae5760405162461bcd60e51b815260206004820181905260248201527f5f7472616e736665724f75742f6574682d7472616e736665722d6661696c65646044820152606401610117565b610bf36001600160a01b03841683836110ca565b6060831561232f575081610c0a565b82511561233f5782518084602001fd5b8160405162461bcd60e51b815260040161011791906128fd565b60608161236781601f612a7a565b10156123a65760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610117565b826123b18382612a7a565b10156123f05760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610117565b6123fa8284612a7a565b8451101561243e5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610117565b60608215801561245d57604051915060008252602082016040526124a7565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561249657805183526020928301920161247e565b5050858452601f01601f1916604052505b50949350505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e9060440160206040518083038186803b1580156124fb57600080fd5b505afa15801561250f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125339190612840565b905081811015610eae578015612558576125586001600160a01b038516846000610a9c565b610eae6001600160a01b03851684600019610a9c565b600060a0828403121561258057600080fd5b50919050565b60006020828403121561259857600080fd5b8135610c0a81612b46565b6000602082840312156125b557600080fd5b8151610c0a81612b46565b600080604083850312156125d357600080fd5b82516125de81612b46565b60208401519092506125ef81612b46565b809150509250929050565b6000806040838503121561260d57600080fd5b823561261881612b46565b946020939093013593505050565b60006020828403121561263857600080fd5b81518015158114610c0a57600080fd5b6000806040838503121561265b57600080fd5b505080516020909101519092909150565b6000806000806060858703121561268257600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156126a857600080fd5b818701915087601f8301126126bc57600080fd5b8135818111156126cb57600080fd5b8860208285010111156126dd57600080fd5b95989497505060200194505050565b600060208083850312156126ff57600080fd5b823567ffffffffffffffff8082111561271757600080fd5b9084019060c0828703121561272b57600080fd5b6127336129f5565b823581528383013561274481612b46565b808583015250604083013560408201526060830135606082015260808301358281111561277057600080fd5b8301601f8101881361278157600080fd5b80358381111561279357612793612b30565b6127a5601f8201601f19168701612a1e565b935080845288868284010111156127bb57600080fd5b80868301878601376000868286010152505081608082015260a083013560a08201528094505050505092915050565b6000602082840312156127fc57600080fd5b813567ffffffffffffffff81111561281357600080fd5b61281f8482850161256e565b949350505050565b60006020828403121561283957600080fd5b5035919050565b60006020828403121561285257600080fd5b5051919050565b60008151808452612871816020860160208601612ad1565b601f01601f19169290920160200192915050565b60008251612897818460208701612ad1565b9190910192915050565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a06080820181905260009061185a90830184612859565b6001600160a01b039390931683526020830191909152604082015260600190565b602081526000610c0a6020830184612859565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602081528151602082015260018060a01b03602083015116604082015260408201516060820152606082015160808201526000608083015160c060a084015261299160e0840182612859565b905060a084015160c08401528091505092915050565b6000808335601e198436030181126129be57600080fd5b83018035915067ffffffffffffffff8211156129d957600080fd5b6020019150368190038213156129ee57600080fd5b9250929050565b60405160c0810167ffffffffffffffff81118282101715612a1857612a18612b30565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612a4757612a47612b30565b604052919050565b60006001600160a01b03828116848216808303821115612a7157612a71612b1a565b01949350505050565b60008219821115612a8d57612a8d612b1a565b500190565b60006001600160a01b0383811690831681811015612ab257612ab2612b1a565b039392505050565b600082821015612acc57612acc612b1a565b500390565b60005b83811015612aec578181015183820152602001612ad4565b83811115610eae5750506000910152565b6000600160ff1b821415612b1357612b13612b1a565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a1957600080fdfea2646970667358221220175f1d4d40b6ad58ec5b57918929a5eefd3003a412603597f328dd56576301e564736f6c63430008060033000000000000000000000000972a785b390d05123497169a04c72de652493be1000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984e34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54
Deployed Bytecode
0x6080604052600436106100ab5760003560e01c8063715018a611610064578063715018a6146102345780638da5cb5b14610249578063c45a015514610267578063d33355531461029b578063f2fde38b146102bb578063fa461e33146102db57600080fd5b806318edaaf21461012757806333cbf0e81461016e5780633667bde7146101815780633fc8cef314610194578063550ba367146101e05780635705ae431461021457600080fd5b3661012257336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101205760405162461bcd60e51b815260206004820152601060248201526f0e4cac6cad2ecca5edcdee85aeecae8d60831b60448201526064015b60405180910390fd5b005b600080fd5b34801561013357600080fd5b5061015b7fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5481565b6040519081526020015b60405180910390f35b61012061017c3660046127ea565b6102fb565b61012061018f3660046127ea565b6105dc565b3480156101a057600080fd5b506101c87f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6040516001600160a01b039091168152602001610165565b3480156101ec57600080fd5b506101c87f000000000000000000000000972a785b390d05123497169a04c72de652493be181565b34801561022057600080fd5b5061012061022f3660046125fa565b61075e565b34801561024057600080fd5b50610120610824565b34801561025557600080fd5b506000546001600160a01b03166101c8565b34801561027357600080fd5b506101c87f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f98481565b3480156102a757600080fd5b506101206102b6366004612827565b610896565b3480156102c757600080fd5b506101206102d6366004612586565b610981565b3480156102e757600080fd5b506101206102f636600461266c565b610a1c565b3332146103435760405162461bcd60e51b81526020600482015260166024820152754265746152756e6e6572426173652f6e6f742d656f6160501b6044820152606401610117565b6001546001600160a01b0316602a1461035b57600080fd5b600180546001600160a01b0319163317905560006103b961037f60608401846129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c1192505050565b509150506103cc81338460400135610c82565b6000808061041a6103e060608701876129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ec992505050565b9250925092506000826001600160a01b0316846001600160a01b031610905060006040518060c0016040528088600001358152602001866001600160a01b03168152602001886020013581526020016104768960400135610efe565b815260200161048860608a018a6129a7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250608089013560209091015290506104d7858585610f14565b6001600160a01b031663128acb0830846104f48b60200135610efe565b8661051d57610518600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b61052d565b61052d6401000276a36001612a4f565b8660405160200161053e9190612945565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161056d9594939291906128a1565b6040805180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190612648565b5050600180546001600160a01b031916602a17905550505050505050565b3332146106245760405162461bcd60e51b81526020600482015260166024820152754265746152756e6e6572426173652f6e6f742d656f6160501b6044820152606401610117565b6001546001600160a01b0316602a1461063c57600080fd5b600180546001600160a01b03191633908117909155600090610664908335602085013561101a565b90506000808061067a6103e060608701876129a7565b9250925092506000836001600160a01b0316836001600160a01b031610905060006040518060c0016040528088600001358152602001866001600160a01b031681526020018781526020016106d28960400135610efe565b6106db90612afd565b81526020016106ed60608a018a6129a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506080890135602090910152905061073c848685610f14565b6001600160a01b031663128acb0830846107558a610efe565b6104f490612afd565b6000546001600160a01b031633146107885760405162461bcd60e51b815260040161011790612910565b60001981141561080c576040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156107d157600080fd5b505afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108099190612840565b90505b6108206001600160a01b03831633836110ca565b5050565b6000546001600160a01b0316331461084e5760405162461bcd60e51b815260040161011790612910565b60405162461bcd60e51b815260206004820152601a60248201527f72656e6f756e63654f776e6572736869702f64697361626c65640000000000006044820152606401610117565b6000546001600160a01b031633146108c05760405162461bcd60e51b815260040161011790612910565b6000198114156108cd5750475b60408051600080825260208201909252339083906040516108ee9190612885565b60006040518083038185875af1925050503d806000811461092b576040519150601f19603f3d011682016040523d82523d6000602084013e610930565b606091505b50509050806108205760405162461bcd60e51b815260206004820152601e60248201527f7265636f7665724554482f6574682d7472616e736665722d6661696c656400006044820152606401610117565b6000546001600160a01b031633146109ab5760405162461bcd60e51b815260040161011790612910565b6001600160a01b038116610a105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610117565b610a19816110fa565b50565b6001546001600160a01b03163214610a3357600080fd5b6000610a41828401846126ec565b905060008060008713610a5d5785610a5888612afd565b610a67565b86610a6787612afd565b91509150600083606001511315610a8857610a8382828561114a565b610a93565b610a9382828561139a565b50505050505050565b801580610b255750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190612840565b155b610b905760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610117565b6040516001600160a01b038316602482015260448101829052610bf390849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261166b565b505050565b6060610c07848460008561173d565b90505b9392505050565b6000806000610c2e60148551610c279190612aba565b8590611865565b9150610c52610c3f60036014612a7a565b8551610c4b9190612aba565b8590611919565b9050610c7a6014610c64600382612a7a565b610c6e9190612a7a565b8551610c279190612aba565b949193509150565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316836001600160a01b03161415610eb4576001600160a01b0382163314610d145760405162461bcd60e51b815260206004820152601b60248201527f5f7472616e73666572496e2f6e6f742d66726f6d2d73656e64657200000000006044820152606401610117565b34811115610d705760405162461bcd60e51b815260206004820152602360248201527f5f7472616e73666572496e2f696e73756666696369656e742d6574682d616d6f6044820152621d5b9d60ea1b6064820152608401610117565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050505080341115610bf35760006001600160a01b038316610e028334612aba565b60408051600081526020810191829052610e1b91612885565b60006040518083038185875af1925050503d8060008114610e58576040519150601f19603f3d011682016040523d82523d6000602084013e610e5d565b606091505b5050905080610eae5760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e73666572496e2f6574682d7472616e736665722d6661696c6564006044820152606401610117565b50505050565b610bf36001600160a01b0384168330846119c4565b60008080610ed78482611865565b9250610ee4846014611919565b9050610ef5610c2760036014612a7a565b91509193909250565b6000600160ff1b8210610f1057600080fd5b5090565b6000806000846001600160a01b0316866001600160a01b031610610f39578486610f3c565b85855b604080516001600160a01b03938416602080830191909152929093168382015262ffffff969096166060808401919091528651808403820181526080840188528051908301206001600160f81b031960a08501527f0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f98490911b6bffffffffffffffffffffffff191660a184015260b58301527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808401919091528651808403909101815260f5909201909552805194019390932095945050505050565b604051620c3a4160e11b81526001600160a01b03848116600483015260248201849052600091610c079184917f000000000000000000000000972a785b390d05123497169a04c72de652493be1909116906218748290604401602060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c59190612840565b6119fc565b6040516001600160a01b038316602482015260448101829052610bf390849063a9059cbb60e01b90606401610bbc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600061115c8460800151610ec9565b92509250925061116d838383610f14565b6001600160a01b0316336001600160a01b0316146111cd5760405162461bcd60e51b815260206004820152601960248201527f5f73686f727443616c6c6261636b2f6261642d63616c6c6572000000000000006044820152606401610117565b6111da8460800151611a12565b1561130e576111ec8460800151611a4c565b60808501819052600090819061120190610ec9565b9093509150506001600160a01b0380831690851610611221858484610f14565b6001600160a01b031663128acb08308361123a8c610efe565b856112635761125e600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b611273565b6112736401000276a36001612a4f565b8c6040516020016112849190612945565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016112b39594939291906128a1565b6040805180830381600087803b1580156112cc57600080fd5b505af11580156112e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113049190612648565b505050505061137e565b60008460600151866113209190612a7a565b90508460a001518610156113625760405162461bcd60e51b815260206004820152600960248201526821736c69707061676560b81b6044820152606401610117565b61137c328660000151876020015186896040015186611a83565b505b6113926001600160a01b03841633886110ca565b505050505050565b60008060006113ac8460800151610ec9565b9250925092506113bd828483610f14565b6001600160a01b0316336001600160a01b03161461141d5760405162461bcd60e51b815260206004820152601960248201527f5f636c6f736543616c6c6261636b2f6261642d63616c6c6572000000000000006044820152606401610117565b61142a8460800151611a12565b156115675761143c8460800151611a4c565b60808501819052600090819061145190610ec9565b9093509150506001600160a01b0380851690831610611471858484610f14565b6001600160a01b031663128acb08338361148a8d610efe565b61149390612afd565b856114bc576114b7600173fffd8963efd1fc6a506488495d951d5263988d26612a92565b6114cc565b6114cc6401000276a36001612a4f565b8c6040516020016114dd9190612945565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161150c9594939291906128a1565b6040805180830381600087803b15801561152557600080fd5b505af1158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190612648565b5050505050611392565b8360a001518611156115a75760405162461bcd60e51b815260206004820152600960248201526821736c69707061676560b81b6044820152606401610117565b600084606001516115b790612afd565b90506115d3328660000151876020015186896040015186611e7f565b6115e76001600160a01b03841633896110ca565b6040516370a0823160e01b8152306004820152610a9390849032906001600160a01b038316906370a082319060240160206040518083038186803b15801561162e57600080fd5b505afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190612840565b61219c565b60006116c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610bf89092919063ffffffff16565b805190915015610bf357808060200190518101906116de9190612626565b610bf35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610117565b60608247101561179e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610117565b843b6117ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610117565b600080866001600160a01b031685876040516118089190612885565b60006040518083038185875af1925050503d8060008114611845576040519150601f19603f3d011682016040523d82523d6000602084013e61184a565b606091505b509150915061185a828286612320565b979650505050505050565b600081611873816014612a7a565b10156118b65760405162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b6044820152606401610117565b6118c1826014612a7a565b835110156119095760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610117565b500160200151600160601b900490565b600081611927816003612a7a565b10156119695760405162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b6044820152606401610117565b611974826003612a7a565b835110156119bb5760405162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b6044820152606401610117565b50016003015190565b6040516001600160a01b0380851660248301528316604482015260648101829052610eae9085906323b872dd60e01b90608401610bbc565b6000818310611a0b5781610c0a565b5090919050565b6000611a2060036014612a7a565b6014611a2d600382612a7a565b611a379190612a7a565b611a419190612a7a565b825110159050919050565b6060611a7d611a5d60036014612a7a565b611a6960036014612a7a565b8451611a759190612aba565b849190612359565b92915050565b600019851415611b3f57604051637b8feacb60e11b81526001600160a01b038781166004830152858116602483015284811660448301527f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063f71fd59690606401602060405180830381600087803b158015611b0057600080fd5b505af1158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b389190612840565b9450611d48565b60405163e507470960e01b81526001600160a01b0387811660048301526024820187905260009182917f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063e507470990604401604080518083038186803b158015611bab57600080fd5b505afa158015611bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be391906125c0565b91509150816001600160a01b0316856001600160a01b031614611c535760405162461bcd60e51b815260206004820152602260248201527f5f626f72726f772f636f6c6c61746572616c2d6e6f742d5f636f6c6c61746572604482015261185b60f21b6064820152608401610117565b604051630cf351b560e31b81526001600160a01b0382811660048301527f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063679a8da89060240160206040518083038186803b158015611cb457600080fd5b505afa158015611cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cec91906125a3565b6001600160a01b0316866001600160a01b031614611d455760405162461bcd60e51b81526020600482015260166024820152755f626f72726f772f6261642d756e6465726c79696e6760501b6044820152606401610117565b50505b611d73837f000000000000000000000000972a785b390d05123497169a04c72de652493be1836124b0565b6040516315d21c8d60e11b81526001600160a01b037f000000000000000000000000972a785b390d05123497169a04c72de652493be11690632ba4391a90611dc3908990899086906004016128dc565b600060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505060405163c1bce0b760e01b81526001600160a01b037f000000000000000000000000972a785b390d05123497169a04c72de652493be116925063c1bce0b79150611e45908990899087906004016128dc565b600060405180830381600087803b158015611e5f57600080fd5b505af1158015611e73573d6000803e3d6000fd5b50505050505050505050565b60405163e507470960e01b81526001600160a01b0387811660048301526024820187905260009182917f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063e507470990604401604080518083038186803b158015611eeb57600080fd5b505afa158015611eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2391906125c0565b91509150816001600160a01b0316856001600160a01b031614611f925760405162461bcd60e51b815260206004820152602160248201527f5f72657061792f636f6c6c61746572616c2d6e6f742d5f636f6c6c61746572616044820152601b60fa1b6064820152608401610117565b604051630cf351b560e31b81526001600160a01b0382811660048301527f000000000000000000000000972a785b390d05123497169a04c72de652493be1169063679a8da89060240160206040518083038186803b158015611ff357600080fd5b505afa158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b91906125a3565b6001600160a01b0316866001600160a01b0316146120835760405162461bcd60e51b81526020600482015260156024820152745f72657061792f6261642d756e6465726c79696e6760581b6044820152606401610117565b61208e8682866124b0565b604051638cd2e0c760e01b81526001600160a01b037f000000000000000000000000972a785b390d05123497169a04c72de652493be11690638cd2e0c7906120de908b908b9089906004016128dc565b600060405180830381600087803b1580156120f857600080fd5b505af115801561210c573d6000803e3d6000fd5b505060405163c640e9bf60e01b81526001600160a01b037f000000000000000000000000972a785b390d05123497169a04c72de652493be116925063c640e9bf9150612160908b908b9088906004016128dc565b600060405180830381600087803b15801561217a57600080fd5b505af115801561218e573d6000803e3d6000fd5b505050505050505050505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316836001600160a01b0316141561230c57604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561223857600080fd5b505af115801561224c573d6000803e3d6000fd5b5050604080516000808252602082019283905293506001600160a01b038616925084916122799190612885565b60006040518083038185875af1925050503d80600081146122b6576040519150601f19603f3d011682016040523d82523d6000602084013e6122bb565b606091505b5050905080610eae5760405162461bcd60e51b815260206004820181905260248201527f5f7472616e736665724f75742f6574682d7472616e736665722d6661696c65646044820152606401610117565b610bf36001600160a01b03841683836110ca565b6060831561232f575081610c0a565b82511561233f5782518084602001fd5b8160405162461bcd60e51b815260040161011791906128fd565b60608161236781601f612a7a565b10156123a65760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610117565b826123b18382612a7a565b10156123f05760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610117565b6123fa8284612a7a565b8451101561243e5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610117565b60608215801561245d57604051915060008252602082016040526124a7565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561249657805183526020928301920161247e565b5050858452601f01601f1916604052505b50949350505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e9060440160206040518083038186803b1580156124fb57600080fd5b505afa15801561250f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125339190612840565b905081811015610eae578015612558576125586001600160a01b038516846000610a9c565b610eae6001600160a01b03851684600019610a9c565b600060a0828403121561258057600080fd5b50919050565b60006020828403121561259857600080fd5b8135610c0a81612b46565b6000602082840312156125b557600080fd5b8151610c0a81612b46565b600080604083850312156125d357600080fd5b82516125de81612b46565b60208401519092506125ef81612b46565b809150509250929050565b6000806040838503121561260d57600080fd5b823561261881612b46565b946020939093013593505050565b60006020828403121561263857600080fd5b81518015158114610c0a57600080fd5b6000806040838503121561265b57600080fd5b505080516020909101519092909150565b6000806000806060858703121561268257600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156126a857600080fd5b818701915087601f8301126126bc57600080fd5b8135818111156126cb57600080fd5b8860208285010111156126dd57600080fd5b95989497505060200194505050565b600060208083850312156126ff57600080fd5b823567ffffffffffffffff8082111561271757600080fd5b9084019060c0828703121561272b57600080fd5b6127336129f5565b823581528383013561274481612b46565b808583015250604083013560408201526060830135606082015260808301358281111561277057600080fd5b8301601f8101881361278157600080fd5b80358381111561279357612793612b30565b6127a5601f8201601f19168701612a1e565b935080845288868284010111156127bb57600080fd5b80868301878601376000868286010152505081608082015260a083013560a08201528094505050505092915050565b6000602082840312156127fc57600080fd5b813567ffffffffffffffff81111561281357600080fd5b61281f8482850161256e565b949350505050565b60006020828403121561283957600080fd5b5035919050565b60006020828403121561285257600080fd5b5051919050565b60008151808452612871816020860160208601612ad1565b601f01601f19169290920160200192915050565b60008251612897818460208701612ad1565b9190910192915050565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a06080820181905260009061185a90830184612859565b6001600160a01b039390931683526020830191909152604082015260600190565b602081526000610c0a6020830184612859565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602081528151602082015260018060a01b03602083015116604082015260408201516060820152606082015160808201526000608083015160c060a084015261299160e0840182612859565b905060a084015160c08401528091505092915050565b6000808335601e198436030181126129be57600080fd5b83018035915067ffffffffffffffff8211156129d957600080fd5b6020019150368190038213156129ee57600080fd5b9250929050565b60405160c0810167ffffffffffffffff81118282101715612a1857612a18612b30565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612a4757612a47612b30565b604052919050565b60006001600160a01b03828116848216808303821115612a7157612a71612b1a565b01949350505050565b60008219821115612a8d57612a8d612b1a565b500190565b60006001600160a01b0383811690831681811015612ab257612ab2612b1a565b039392505050565b600082821015612acc57612acc612b1a565b500390565b60005b83811015612aec578181015183820152602001612ad4565b83811115610eae5750506000910152565b6000600160ff1b821415612b1357612b13612b1a565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a1957600080fdfea2646970667358221220175f1d4d40b6ad58ec5b57918929a5eefd3003a412603597f328dd56576301e564736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000972a785b390d05123497169a04c72de652493be1000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984e34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54
-----Decoded View---------------
Arg [0] : _betaBank (address): 0x972a785b390D05123497169a04c72dE652493BE1
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _factory (address): 0x1F98431c8aD98523631AE4a59f267346ea31F984
Arg [3] : _codeHash (bytes32): 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000972a785b390d05123497169a04c72de652493be1
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 0000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984
Arg [3] : e34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54
Deployed Bytecode Sourcemap
33864:6237:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33776:10;-1:-1:-1;;;;;33790:4:0;33776:18;;33768:47;;;;-1:-1:-1;;;33768:47:0;;15971:2:1;33768:47:0;;;15953:21:1;16010:2;15990:18;;;15983:30;-1:-1:-1;;;16029:18:1;;;16022:46;16085:18;;33768:47:0;;;;;;;;;33864:6237;;;;;34397:33;;;;;;;;;;;;;;;;;;9242:25:1;;;9230:2;9215:18;34397:33:0;;;;;;;;35269:818;;;;;;:::i;:::-;;:::i;36199:754::-;;;;;;:::i;:::-;;:::i;29302:29::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6379:32:1;;;6361:51;;6349:2;6334:18;29302:29:0;6316:102:1;29264:33:0;;;;;;;;;;;;;;;32968:230;;;;;;;;;;-1:-1:-1;32968:230:0;;;;;:::i;:::-;;:::i;33624:104::-;;;;;;;;;;;;;:::i;21525:87::-;;;;;;;;;;-1:-1:-1;21571:7:0;21598:6;-1:-1:-1;;;;;21598:6:0;21525:87;;34360:32;;;;;;;;;;;;;;;33268:272;;;;;;;;;;-1:-1:-1;33268:272:0;;;;;:::i;:::-;;:::i;22425:192::-;;;;;;;;;;-1:-1:-1;22425:192:0;;;;;:::i;:::-;;:::i;37010:548::-;;;;;;;;;;-1:-1:-1;37010:548:0;;;;;:::i;:::-;;:::i;35269:818::-;29372:10;29386:9;29372:23;29364:58;;;;-1:-1:-1;;;29364:58:0;;18119:2:1;29364:58:0;;;18101:21:1;18158:2;18138:18;;;18131:30;-1:-1:-1;;;18177:18:1;;;18170:52;18239:18;;29364:58:0;18091:172:1;29364:58:0;323:6:::1;::::0;-1:-1:-1;;;;;323:6:0::1;187:2;323:19;315:28;;;::::0;::::1;;350:6;:19:::0;;-1:-1:-1;;;;;;350:19:0::1;359:10;350:19;::::0;;:6:::1;35382:27:::2;:10;;::::0;::::2;:5:::0;:10:::2;:::i;:::-;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;35382:25:0::2;::::0;-1:-1:-1;;;35382:27:0:i:2;:::-;35355:54;;;;35416:57;35428:10;35440;35452:5;:20;;;35416:11;:57::i;:::-;35481:15;::::0;;35530:28:::2;:10;;::::0;::::2;:5:::0;:10:::2;:::i;:::-;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;35530:26:0::2;::::0;-1:-1:-1;;;35530:28:0:i:2;:::-;35480:78;;;;;;35565:15;35593:8;-1:-1:-1::0;;;;;35583:18:0::2;:7;-1:-1:-1::0;;;;;35583:18:0::2;;35565:36;;35608:22;35633:218;;;;;;;;35660:5;:9;;;35633:218;;;;35685:7;-1:-1:-1::0;;;;;35633:218:0::2;;;;;35710:5;:18;;;35633:218;;;;35743:31;:5;:20;;;:29;:31::i;:::-;35633:218:::0;;::::2;;35789:10;;::::0;::::2;:5:::0;:10:::2;:::i;:::-;35633:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;;35633:218:0;;;-1:-1:-1;35825:18:0::2;::::0;::::2;;35633:218;::::0;;::::2;::::0;35608:243;-1:-1:-1;35873:32:0::2;35882:7:::0;35891:8;35901:3;35873:8:::2;:32::i;:::-;-1:-1:-1::0;;;;;35858:53:0::2;;35928:4;35942:10;35961:29;:5;:18;;;:27;:29::i;:::-;35999:10;:52;;36033:18;36050:1;34304:49;36033:18;:::i;:::-;35999:52;;;36012:18;34246:10;36029:1;36012:18;:::i;:::-;36071:2;36060:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;35858:223;;;;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;384:6:0::1;:18:::0;;-1:-1:-1;;;;;;384:18:0::1;187:2;384:18;::::0;;-1:-1:-1;;;;;;;35269:818:0:o;36199:754::-;29372:10;29386:9;29372:23;29364:58;;;;-1:-1:-1;;;29364:58:0;;18119:2:1;29364:58:0;;;18101:21:1;18158:2;18138:18;;;18131:30;-1:-1:-1;;;18177:18:1;;;18170:52;18239:18;;29364:58:0;18091:172:1;29364:58:0;323:6:::1;::::0;-1:-1:-1;;;;;323:6:0::1;187:2;323:19;315:28;;;::::0;::::1;;350:6;:19:::0;;-1:-1:-1;;;;;;350:19:0::1;359:10;350:19:::0;;::::1;::::0;;;:6:::1;::::0;36304:51:::2;::::0;36326:9;::::2;36337:17;::::0;::::2;;36304:9;:51::i;:::-;36285:70:::0;-1:-1:-1;36363:16:0::2;::::0;;36412:28:::2;:10;;::::0;::::2;:5:::0;:10:::2;:::i;:28::-;36362:78;;;;;;36447:15;36475:8;-1:-1:-1::0;;;;;36465:18:0::2;:7;-1:-1:-1::0;;;;;36465:18:0::2;;36447:36;;36490:22;36515:208;;;;;;;;36542:5;:9;;;36515:208;;;;36567:8;-1:-1:-1::0;;;;;36515:208:0::2;;;;;36593:11;36515:208;;;;36620:27;:5;:16;;;:25;:27::i;:::-;36619:28;;;:::i;:::-;36515:208:::0;;::::2;;36662:10;;::::0;::::2;:5:::0;:10:::2;:::i;:::-;36515:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;;36515:208:0;;;-1:-1:-1;36698:17:0::2;::::0;::::2;;36515:208;::::0;;::::2;::::0;36490:233;-1:-1:-1;36745:32:0::2;36754:7:::0;36763:8;36773:3;36745:8:::2;:32::i;:::-;-1:-1:-1::0;;;;;36730:53:0::2;;36800:4;36814:10;36834:22;:11;:20;:22::i;:::-;36833:23;;;:::i;32968:230::-:0;21571:7;21598:6;-1:-1:-1;;;;;21598:6:0;15407:10;21745:23;21737:68;;;;-1:-1:-1;;;21737:68:0;;;;;;;:::i;:::-;-1:-1:-1;;33045:7:0::1;:25;33041:97;;;33091:39;::::0;-1:-1:-1;;;33091:39:0;;33124:4:::1;33091:39;::::0;::::1;6361:51:1::0;-1:-1:-1;;;;;33091:24:0;::::1;::::0;::::1;::::0;6334:18:1;;33091:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33081:49;;33041:97;33144:48;-1:-1:-1::0;;;;;33144:27:0;::::1;33172:10;33184:7:::0;33144:27:::1;:48::i;:::-;32968:230:::0;;:::o;33624:104::-;21571:7;21598:6;-1:-1:-1;;;;;21598:6:0;15407:10;21745:23;21737:68;;;;-1:-1:-1;;;21737:68:0;;;;;;;:::i;:::-;33686:36:::1;::::0;-1:-1:-1;;;33686:36:0;;12343:2:1;33686:36:0::1;::::0;::::1;12325:21:1::0;12382:2;12362:18;;;12355:30;12421:28;12401:18;;;12394:56;12467:18;;33686:36:0::1;12315:176:1::0;33268:272:0;21571:7;21598:6;-1:-1:-1;;;;;21598:6:0;15407:10;21745:23;21737:68;;;;-1:-1:-1;;;21737:68:0;;;;;;;:::i;:::-;-1:-1:-1;;33332:7:0::1;:25;33328:79;;;-1:-1:-1::0;33378:21:0::1;33328:79;33464:12;::::0;;33414::::1;33464::::0;;;::::1;::::0;::::1;::::0;;;33432:10:::1;::::0;33455:7;;33432:45:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33413:64;;;33492:7;33484:50;;;::::0;-1:-1:-1;;;33484:50:0;;11577:2:1;33484:50:0::1;::::0;::::1;11559:21:1::0;11616:2;11596:18;;;11589:30;11655:32;11635:18;;;11628:60;11705:18;;33484:50:0::1;11549:180:1::0;22425:192:0;21571:7;21598:6;-1:-1:-1;;;;;21598:6:0;15407:10;21745:23;21737:68;;;;-1:-1:-1;;;21737:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22514:22:0;::::1;22506:73;;;::::0;-1:-1:-1;;;22506:73:0;;9704:2:1;22506:73:0::1;::::0;::::1;9686:21:1::0;9743:2;9723:18;;;9716:30;9782:34;9762:18;;;9755:62;-1:-1:-1;;;9833:18:1;;;9826:36;9879:19;;22506:73:0::1;9676:228:1::0;22506:73:0::1;22590:19;22600:8;22590:9;:19::i;:::-;22425:192:::0;:::o;37010:548::-;451:6;;-1:-1:-1;;;;;451:6:0;461:9;451:19;443:28;;;;;;37157:24:::1;37184:33;::::0;;::::1;37195:5:::0;37184:33:::1;:::i;:::-;37157:60;;37225:16;37243:19:::0;37282:1:::1;37266:13;:17;:123;;37352:13:::0;37373:14:::1;37374:13:::0;37373:14:::1;:::i;:::-;37266:123;;;37299:13:::0;37320:14:::1;37321:13:::0;37320:14:::1;:::i;:::-;37224:165;;;;37412:1;37400:4;:9;;;:13;37396:157;;;37424:49;37439:11;37452:14;37468:4;37424:14;:49::i;:::-;37396:157;;;37496:49;37511:11;37524:14;37540:4;37496:14;:49::i;:::-;37150:408;;;37010:548:::0;;;;:::o;24131:616::-;24495:10;;;24494:62;;-1:-1:-1;24511:39:0;;-1:-1:-1;;;24511:39:0;;24535:4;24511:39;;;6635:34:1;-1:-1:-1;;;;;6705:15:1;;;6685:18;;;6678:43;24511:15:0;;;;;6570:18:1;;24511:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;24494:62;24472:166;;;;-1:-1:-1;;;24472:166:0;;18470:2:1;24472:166:0;;;18452:21:1;18509:2;18489:18;;;18482:30;18548:34;18528:18;;;18521:62;-1:-1:-1;;;18599:18:1;;;18592:52;18661:19;;24472:166:0;18442:244:1;24472:166:0;24676:62;;-1:-1:-1;;;;;8659:32:1;;24676:62:0;;;8641:51:1;8708:18;;;8701:34;;;24649:90:0;;24669:5;;-1:-1:-1;;;24699:22:0;8614:18:1;;24676:62:0;;;;-1:-1:-1;;24676:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;24676:62:0;-1:-1:-1;;;;;;24676:62:0;;;;;;;;;;24649:19;:90::i;:::-;24131:616;;;:::o;10418:229::-;10555:12;10587:52;10609:6;10617:4;10623:1;10626:12;10587:21;:52::i;:::-;10580:59;;10418:229;;;;;;:::o;28500:326::-;28589:14;28612;28635:10;28672:39;26911:2;28687:4;:11;:23;;;;:::i;:::-;28672:4;;:14;:39::i;:::-;28663:48;-1:-1:-1;28724:40:0;27105:20;26999:1;26911:2;27105:20;:::i;:::-;28738:4;:11;:25;;;;:::i;:::-;28724:4;;:13;:40::i;:::-;28718:46;-1:-1:-1;28780:40:0;26911:2;27105:20;26999:1;26911:2;27105:20;:::i;:::-;27211:23;;;;:::i;:::-;28795:4;:11;:24;;;;:::i;28780:40::-;28771:49;28500:326;;-1:-1:-1;28500:326:0;-1:-1:-1;28500:326:0:o;31184:598::-;31300:4;-1:-1:-1;;;;;31290:14:0;:6;-1:-1:-1;;;;;31290:14:0;;31286:491;;;-1:-1:-1;;;;;31323:19:0;;31332:10;31323:19;31315:59;;;;-1:-1:-1;;;31315:59:0;;10111:2:1;31315:59:0;;;10093:21:1;10150:2;10130:18;;;10123:30;10189:29;10169:18;;;10162:57;10236:18;;31315:59:0;10083:177:1;31315:59:0;31402:9;31391:7;:20;;31383:68;;;;-1:-1:-1;;;31383:68:0;;13793:2:1;31383:68:0;;;13775:21:1;13832:2;13812:18;;;13805:30;13871:34;13851:18;;;13844:62;-1:-1:-1;;;13922:18:1;;;13915:33;13965:19;;31383:68:0;13765:225:1;31383:68:0;31466:4;-1:-1:-1;;;;;31460:19:0;;31487:7;31460:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31522:7;31510:9;:19;31506:179;;;31543:12;-1:-1:-1;;;;;31561:10:0;;31579:19;31591:7;31579:9;:19;:::i;:::-;31600:12;;;31610:1;31600:12;;;;;;;;;31561:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31542:71;;;31632:7;31624:51;;;;-1:-1:-1;;;31624:51:0;;14197:2:1;31624:51:0;;;14179:21:1;14236:2;14216:18;;;14209:30;14275:33;14255:18;;;14248:61;14326:18;;31624:51:0;14169:181:1;31624:51:0;31531:154;24131:616;;;:::o;31286:491::-;31707:62;-1:-1:-1;;;;;31707:31:0;;31739:5;31754:4;31761:7;31707:31;:62::i;27968:276::-;28058:14;;;28141:17;:4;28058:14;28141;:17::i;:::-;28132:26;-1:-1:-1;28171:24:0;:4;26911:2;28171:13;:24::i;:::-;28165:30;-1:-1:-1;28211:27:0;27105:20;26999:1;26911:2;27105:20;:::i;28211:27::-;28202:36;;27968:276;;;;;:::o;20441:105::-;20490:5;-1:-1:-1;;;20512:1:0;:10;20504:19;;;;;;-1:-1:-1;20538:1:0;20441:105::o;39720:378::-;39825:7;39842:14;39858;39885:6;-1:-1:-1;;;;;39876:15:0;:6;-1:-1:-1;;;;;39876:15:0;;:53;;39914:6;39922;39876:53;;;39895:6;39903;39876:53;39961:31;;;-1:-1:-1;;;;;7377:15:1;;;39961:31:0;;;;7359:34:1;;;;7429:15;;;;7409:18;;;7402:43;7493:8;7481:21;;;;7461:18;;;;7454:49;;;;39961:31:0;;;;;;;;;7294:18:1;;;39961:31:0;;39951:42;;;;;;-1:-1:-1;;;;;;40038:50:0;;;5993:26:1;40064:7:0;6052:15:1;;;-1:-1:-1;;6048:53:1;6035:11;;;6028:74;6118:12;;;6111:28;40079:8:0;6155:12:1;;;;6148:28;;;;40038:50:0;;;;;;;;;;6192:12:1;;;;40038:50:0;;;40028:61;;;;;;;;;;-1:-1:-1;;;;;39720:378:0:o;32691:204::-;32837:51;;-1:-1:-1;;;32837:51:0;;-1:-1:-1;;;;;8659:32:1;;;32837:51:0;;;8641::1;8708:18;;;8701:34;;;-1:-1:-1;;32814:75:0;;32823:12;;32847:8;32837:37;;;;;;8614:18:1;;32837:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32814:8;:75::i;23395:211::-;23539:58;;-1:-1:-1;;;;;8659:32:1;;23539:58:0;;;8641:51:1;8708:18;;;8701:34;;;23512:86:0;;23532:5;;-1:-1:-1;;;23562:23:0;8614:18:1;;23539:58:0;8596:145:1;22625:173:0;22681:16;22700:6;;-1:-1:-1;;;;;22717:17:0;;;-1:-1:-1;;;;;;22717:17:0;;;;;;22750:40;;22700:6;;;;;;;22750:40;;22681:16;22750:40;22670:128;22625:173;:::o;37564:1051::-;37692:15;37709:16;37727:14;37745:27;:4;:9;;;:25;:27::i;:::-;37691:81;;;;;;37801:36;37810:7;37819:8;37829:7;37801:8;:36::i;:::-;-1:-1:-1;;;;;37787:50:0;:10;-1:-1:-1;;;;;37787:50:0;;37779:88;;;;-1:-1:-1;;;37779:88:0;;15617:2:1;37779:88:0;;;15599:21:1;15656:2;15636:18;;;15629:30;15695:27;15675:18;;;15668:55;15740:18;;37779:88:0;15589:175:1;37779:88:0;37878:28;:4;:9;;;:26;:28::i;:::-;37874:675;;;37929:21;:4;:9;;;:19;:21::i;:::-;37917:9;;;:33;;;37962:17;;;;37995:27;;:25;:27::i;:::-;37959:63;;-1:-1:-1;37959:63:0;-1:-1:-1;;;;;;;38049:20:0;;;;;;;38093:34;38049:8;37959:63;;38093:8;:34::i;:::-;-1:-1:-1;;;;;38078:55:0;;38152:4;38168:10;38189:26;:15;:24;:26::i;:::-;38226:10;:52;;38260:18;38277:1;34304:49;38260:18;:::i;:::-;38226:52;;;38239:18;34246:10;38256:1;38239:18;:::i;:::-;38300:4;38289:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;38078:236;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37908:414;;;37874:675;;;38337:14;38377:4;:9;;;38354:15;:33;;;;:::i;:::-;38337:50;;38423:4;:20;;;38404:15;:39;;38396:61;;;;-1:-1:-1;;;38396:61:0;;17020:2:1;38396:61:0;;;17002:21:1;17059:1;17039:18;;;17032:29;-1:-1:-1;;;17077:18:1;;;17070:39;17126:18;;38396:61:0;16992:158:1;38396:61:0;38466:75;38474:9;38485:4;:8;;;38495:4;:10;;;38507:8;38517:4;:12;;;38531:9;38466:7;:75::i;:::-;38328:221;37874:675;38555:54;-1:-1:-1;;;;;38555:28:0;;38584:10;38596:12;38555:28;:54::i;:::-;37684:931;;;37564:1051;;;:::o;38621:1093::-;38733:16;38751:15;38768:14;38786:27;:4;:9;;;:25;:27::i;:::-;38732:81;;;;;;38842:36;38851:7;38860:8;38870:7;38842:8;:36::i;:::-;-1:-1:-1;;;;;38828:50:0;:10;-1:-1:-1;;;;;38828:50:0;;38820:88;;;;-1:-1:-1;;;38820:88:0;;18893:2:1;38820:88:0;;;18875:21:1;18932:2;18912:18;;;18905:30;18971:27;18951:18;;;18944:55;19016:18;;38820:88:0;18865:175:1;38820:88:0;38919:28;:4;:9;;;:26;:28::i;:::-;38915:794;;;38970:21;:4;:9;;;:19;:21::i;:::-;38958:9;;;:33;;;39003:17;;;;39036:27;;:25;:27::i;:::-;39000:63;;-1:-1:-1;39000:63:0;-1:-1:-1;;;;;;;39090:19:0;;;;;;;39133:33;39102:7;39000:63;;39133:8;:33::i;:::-;-1:-1:-1;;;;;39118:54:0;;39183:10;39204;39226:23;:12;:21;:23::i;:::-;39225:24;;;:::i;:::-;39260:10;:52;;39294:18;39311:1;34304:49;39294:18;:::i;:::-;39260:52;;;39273:18;34246:10;39290:1;39273:18;:::i;:::-;39334:4;39323:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;39118:230;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38949:407;;;38915:794;;;39395:4;:20;;;39379:12;:36;;39371:58;;;;-1:-1:-1;;;39371:58:0;;17020:2:1;39371:58:0;;;17002:21:1;17059:1;17039:18;;;17032:29;-1:-1:-1;;;17077:18:1;;;17070:39;17126:18;;39371:58:0;16992:158:1;39371:58:0;39438:15;39462:4;:9;;;39461:10;;;:::i;:::-;39438:34;;39481:74;39488:9;39499:4;:8;;;39509:4;:10;;;39521:7;39530:4;:12;;;39544:10;39481:6;:74::i;:::-;39564:54;-1:-1:-1;;;;;39564:28:0;;39593:10;39605:12;39564:28;:54::i;:::-;39660:40;;-1:-1:-1;;;39660:40:0;;39694:4;39660:40;;;6361:51:1;39627:74:0;;39640:7;;39649:9;;-1:-1:-1;;;;;39660:25:0;;;;;6334:18:1;;39660:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39627:12;:74::i;25968:716::-;26392:23;26418:69;26446:4;26418:69;;;;;;;;;;;;;;;;;26426:5;-1:-1:-1;;;;;26418:27:0;;;:69;;;;;:::i;:::-;26502:17;;26392:95;;-1:-1:-1;26502:21:0;26498:179;;26599:10;26588:30;;;;;;;;;;;;:::i;:::-;26580:85;;;;-1:-1:-1;;;26580:85:0;;17357:2:1;26580:85:0;;;17339:21:1;17396:2;17376:18;;;17369:30;17435:34;17415:18;;;17408:62;-1:-1:-1;;;17486:18:1;;;17479:40;17536:19;;26580:85:0;17329:232:1;11538:511:0;11708:12;11766:5;11741:21;:30;;11733:81;;;;-1:-1:-1;;;11733:81:0;;11936:2:1;11733:81:0;;;11918:21:1;11975:2;11955:18;;;11948:30;12014:34;11994:18;;;11987:62;-1:-1:-1;;;12065:18:1;;;12058:36;12111:19;;11733:81:0;11908:228:1;11733:81:0;7935:20;;11825:60;;;;-1:-1:-1;;;11825:60:0;;16316:2:1;11825:60:0;;;16298:21:1;16355:2;16335:18;;;16328:30;16394:31;16374:18;;;16367:59;16443:18;;11825:60:0;16288:179:1;11825:60:0;11899:12;11913:23;11940:6;-1:-1:-1;;;;;11940:11:0;11959:5;11966:4;11940:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11898:73;;;;11989:52;12007:7;12016:10;12028:12;11989:17;:52::i;:::-;11982:59;11538:511;-1:-1:-1;;;;;;;11538:511:0:o;3050:391::-;3126:7;3165:6;3150:11;3165:6;3159:2;3150:11;:::i;:::-;:21;;3142:52;;;;-1:-1:-1;;;3142:52:0;;19247:2:1;3142:52:0;;;19229:21:1;19286:2;19266:18;;;19259:30;-1:-1:-1;;;19305:18:1;;;19298:48;19363:18;;3142:52:0;19219:168:1;3142:52:0;3226:11;:6;3235:2;3226:11;:::i;:::-;3209:6;:13;:28;;3201:62;;;;-1:-1:-1;;;3201:62:0;;15267:2:1;3201:62:0;;;15249:21:1;15306:2;15286:18;;;15279:30;-1:-1:-1;;;15325:18:1;;;15318:51;15386:18;;3201:62:0;15239:171:1;3201:62:0;-1:-1:-1;3341:30:0;3357:4;3341:30;3335:37;-1:-1:-1;;;3331:71:0;;;3050:391::o;3447:340::-;3522:6;3559;3545:10;3559:6;3554:1;3545:10;:::i;:::-;:20;;3537:50;;;;-1:-1:-1;;;3537:50:0;;11231:2:1;3537:50:0;;;11213:21:1;11270:2;11250:18;;;11243:30;-1:-1:-1;;;11289:18:1;;;11282:47;11346:18;;3537:50:0;11203:167:1;3537:50:0;3619:10;:6;3628:1;3619:10;:::i;:::-;3602:6;:13;:27;;3594:60;;;;-1:-1:-1;;;3594:60:0;;14557:2:1;3594:60:0;;;14539:21:1;14596:2;14576:18;;;14569:30;-1:-1:-1;;;14615:18:1;;;14608:50;14675:18;;3594:60:0;14529:170:1;3594:60:0;-1:-1:-1;3721:29:0;3737:3;3721:29;3715:36;;3447:340::o;23614:248::-;23785:68;;-1:-1:-1;;;;;7772:15:1;;;23785:68:0;;;7754:34:1;7824:15;;7804:18;;;7797:43;7856:18;;;7849:34;;;23758:96:0;;23778:5;;-1:-1:-1;;;23808:27:0;7689:18:1;;23785:68:0;7671:218:1;18755:106:0;18813:7;18844:1;18840;:5;:13;;18852:1;18840:13;;;-1:-1:-1;18848:1:0;;18833:20;-1:-1:-1;18755:106:0:o;27577:134::-;27645:4;27105:20;26999:1;26911:2;27105:20;:::i;:::-;26911:2;27105:20;26999:1;26911:2;27105:20;:::i;:::-;27211:23;;;;:::i;:::-;27365:24;;;;:::i;:::-;27665:4;:11;:40;;27658:47;;27577:134;;;:::o;29012:145::-;29073:12;29101:50;27105:20;26999:1;26911:2;27105:20;:::i;:::-;;26999:1;26911:2;27105:20;:::i;:::-;29125:4;:11;:25;;;;:::i;:::-;29101:4;;:50;:10;:50::i;:::-;29094:57;29012:145;-1:-1:-1;;29012:145:0:o;29780:770::-;-1:-1:-1;;29965:4:0;:22;29961:402;;;30005:58;;-1:-1:-1;;;30005:58:0;;-1:-1:-1;;;;;6990:15:1;;;30005:58:0;;;6972:34:1;7042:15;;;7022:18;;;7015:43;7094:15;;;7074:18;;;7067:43;30015:8:0;30005:24;;;;6907:18:1;;30005:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29998:65;;29961:402;;;30125:51;;-1:-1:-1;;;30125:51:0;;-1:-1:-1;;;;;8659:32:1;;;30125:51:0;;;8641::1;8708:18;;;8701:34;;;30087:18:0;;;;30135:8;30125:37;;;;8614:18:1;;30125:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30086:90;;;;30208:10;-1:-1:-1;;;;;30193:25:0;:11;-1:-1:-1;;;;;30193:25:0;;30185:72;;;;-1:-1:-1;;;30185:72:0;;10467:2:1;30185:72:0;;;10449:21:1;10506:2;10486:18;;;10479:30;10545:34;10525:18;;;10518:62;-1:-1:-1;;;10596:18:1;;;10589:32;10638:19;;30185:72:0;10439:224:1;30185:72:0;30289:39;;-1:-1:-1;;;30289:39:0;;-1:-1:-1;;;;;6379:32:1;;;30289:39:0;;;6361:51:1;30299:8:0;30289:31;;;;6334:18:1;;30289:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30274:54:0;:11;-1:-1:-1;;;;;30274:54:0;;30266:89;;;;-1:-1:-1;;;30266:89:0;;17768:2:1;30266:89:0;;;17750:21:1;17807:2;17787:18;;;17780:30;-1:-1:-1;;;17826:18:1;;;17819:52;17888:18;;30266:89:0;17740:172:1;30266:89:0;30077:286;;29961:402;30369:50;30378:11;30391:8;30401:17;30369:8;:50::i;:::-;30426:56;;-1:-1:-1;;;30426:56:0;;-1:-1:-1;;;;;30436:8:0;30426:23;;;;:56;;30450:6;;30458:4;;30464:17;;30426:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30489:55:0;;-1:-1:-1;;;30489:55:0;;-1:-1:-1;;;;;30499:8:0;30489:26;;-1:-1:-1;30489:26:0;;-1:-1:-1;30489:55:0;;30516:6;;30524:4;;30530:13;;30489:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29780:770;;;;;;:::o;30556:622::-;30774:51;;-1:-1:-1;;;30774:51:0;;-1:-1:-1;;;;;8659:32:1;;;30774:51:0;;;8641::1;8708:18;;;8701:34;;;30736:18:0;;;;30784:8;30774:37;;;;8614:18:1;;30774:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30735:90;;;;30855:10;-1:-1:-1;;;;;30840:25:0;:11;-1:-1:-1;;;;;30840:25:0;;30832:71;;;;-1:-1:-1;;;30832:71:0;;13391:2:1;30832:71:0;;;13373:21:1;13430:2;13410:18;;;13403:30;13469:34;13449:18;;;13442:62;-1:-1:-1;;;13520:18:1;;;13513:31;13561:19;;30832:71:0;13363:223:1;30832:71:0;30933:39;;-1:-1:-1;;;30933:39:0;;-1:-1:-1;;;;;6379:32:1;;;30933:39:0;;;6361:51:1;30943:8:0;30933:31;;;;6334:18:1;;30933:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30918:54:0;:11;-1:-1:-1;;;;;30918:54:0;;30910:88;;;;-1:-1:-1;;;30910:88:0;;13041:2:1;30910:88:0;;;13023:21:1;13080:2;13060:18;;;13053:30;-1:-1:-1;;;13099:18:1;;;13092:51;13160:18;;30910:88:0;13013:171:1;30910:88:0;31005:43;31014:11;31027:6;31035:12;31005:8;:43::i;:::-;31055:53;;-1:-1:-1;;;31055:53:0;;-1:-1:-1;;;;;31065:8:0;31055:25;;;;:53;;31081:6;;31089:4;;31095:12;;31055:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31115:57:0;;-1:-1:-1;;;31115:57:0;;-1:-1:-1;;;;;31125:8:0;31115:24;;-1:-1:-1;31115:24:0;;-1:-1:-1;31115:57:0;;31140:6;;31148:4;;31154:17;;31115:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30728:450;;30556:622;;;;;;:::o;31788:363::-;31903:4;-1:-1:-1;;;;;31893:14:0;:6;-1:-1:-1;;;;;31893:14:0;;31889:257;;;31918:29;;-1:-1:-1;;;31918:29:0;;;;;9242:25:1;;;31924:4:0;-1:-1:-1;;;;;31918:20:0;;;;9215:18:1;;31918:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32000:12:0;;;31957;32000;;;;;;;;;;31957;-1:-1:-1;;;;;;31975:8:0;;;-1:-1:-1;31991:7:0;;31975:38;;32000:12;31975:38;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31956:57;;;32030:7;32022:52;;;;-1:-1:-1;;;32022:52:0;;10870:2:1;32022:52:0;;;10852:21:1;;;10889:18;;;10882:30;10948:34;10928:18;;;10921:62;11000:18;;32022:52:0;10842:182:1;31889:257:0;32097:41;-1:-1:-1;;;;;32097:27:0;;32125:3;32130:7;32097:27;:41::i;14007:712::-;14157:12;14186:7;14182:530;;;-1:-1:-1;14217:10:0;14210:17;;14182:530;14331:17;;:21;14327:374;;14529:10;14523:17;14590:15;14577:10;14573:2;14569:19;14562:44;14327:374;14672:12;14665:20;;-1:-1:-1;;;14665:20:0;;;;;;;;:::i;535:2509::-;641:12;686:7;670:12;686:7;680:2;670:12;:::i;:::-;:23;;662:50;;;;-1:-1:-1;;;662:50:0;;12698:2:1;662:50:0;;;12680:21:1;12737:2;12717:18;;;12710:30;-1:-1:-1;;;12756:18:1;;;12749:44;12810:18;;662:50:0;12670:164:1;662:50:0;747:6;727:16;736:7;747:6;727:16;:::i;:::-;:26;;719:53;;;;-1:-1:-1;;;719:53:0;;12698:2:1;719:53:0;;;12680:21:1;12737:2;12717:18;;;12710:30;-1:-1:-1;;;12756:18:1;;;12749:44;12810:18;;719:53:0;12670:164:1;719:53:0;804:16;813:7;804:6;:16;:::i;:::-;787:6;:13;:33;;779:63;;;;-1:-1:-1;;;779:63:0;;16674:2:1;779:63:0;;;16656:21:1;16713:2;16693:18;;;16686:30;-1:-1:-1;;;16732:18:1;;;16725:47;16789:18;;779:63:0;16646:167:1;779:63:0;851:22;907:15;;930:1731;;;;2785:4;2779:11;2766:24;;2950:1;2939:9;2932:20;2992:4;2981:9;2977:20;2971:4;2964:34;900:2107;;930:1731;1091:4;1085:11;1072:24;;1688:2;1679:7;1675:16;2036:9;2029:17;2023:4;2019:28;2007:9;1996;1992:25;1988:60;2077:7;2073:2;2069:16;2296:6;2282:9;2275:17;2269:4;2265:28;2253:9;2245:6;2241:22;2237:57;2233:70;2097:350;2322:3;2318:2;2315:11;2097:350;;;2426:9;;2415:21;;2354:4;2346:13;;;;2377;2097:350;;;-1:-1:-1;;2459:26:0;;;2647:2;2630:11;-1:-1:-1;;2626:25:0;2620:4;2613:39;-1:-1:-1;900:2107:0;-1:-1:-1;3029:9:0;535:2509;-1:-1:-1;;;;535:2509:0:o;32265:362::-;32385:49;;-1:-1:-1;;;32385:49:0;;32418:4;32385:49;;;6635:34:1;-1:-1:-1;;;;;6705:15:1;;;6685:18;;;6678:43;32370:12:0;;32385:24;;;;;;6570:18:1;;32385:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32370:64;;32455:10;32445:7;:20;32441:181;;;32480:12;;32476:78;;32505:39;-1:-1:-1;;;;;32505:26:0;;32532:8;32542:1;32505:26;:39::i;:::-;32562:52;-1:-1:-1;;;;;32562:26:0;;32589:8;-1:-1:-1;;32562:26:0;:52::i;14:158:1:-;76:5;121:3;112:6;107:3;103:16;99:26;96:2;;;138:1;135;128:12;96:2;-1:-1:-1;160:6:1;86:86;-1:-1:-1;86:86:1:o;177:247::-;236:6;289:2;277:9;268:7;264:23;260:32;257:2;;;305:1;302;295:12;257:2;344:9;331:23;363:31;388:5;363:31;:::i;429:251::-;499:6;552:2;540:9;531:7;527:23;523:32;520:2;;;568:1;565;558:12;520:2;600:9;594:16;619:31;644:5;619:31;:::i;685:385::-;764:6;772;825:2;813:9;804:7;800:23;796:32;793:2;;;841:1;838;831:12;793:2;873:9;867:16;892:31;917:5;892:31;:::i;:::-;992:2;977:18;;971:25;942:5;;-1:-1:-1;1005:33:1;971:25;1005:33;:::i;:::-;1057:7;1047:17;;;783:287;;;;;:::o;1075:315::-;1143:6;1151;1204:2;1192:9;1183:7;1179:23;1175:32;1172:2;;;1220:1;1217;1210:12;1172:2;1259:9;1246:23;1278:31;1303:5;1278:31;:::i;:::-;1328:5;1380:2;1365:18;;;;1352:32;;-1:-1:-1;;;1162:228:1:o;1395:277::-;1462:6;1515:2;1503:9;1494:7;1490:23;1486:32;1483:2;;;1531:1;1528;1521:12;1483:2;1563:9;1557:16;1616:5;1609:13;1602:21;1595:5;1592:32;1582:2;;1638:1;1635;1628:12;1677:243;1754:6;1762;1815:2;1803:9;1794:7;1790:23;1786:32;1783:2;;;1831:1;1828;1821:12;1783:2;-1:-1:-1;;1854:16:1;;1910:2;1895:18;;;1889:25;1854:16;;1889:25;;-1:-1:-1;1773:147:1:o;1925:725::-;2011:6;2019;2027;2035;2088:2;2076:9;2067:7;2063:23;2059:32;2056:2;;;2104:1;2101;2094:12;2056:2;2140:9;2127:23;2117:33;;2197:2;2186:9;2182:18;2169:32;2159:42;;2252:2;2241:9;2237:18;2224:32;2275:18;2316:2;2308:6;2305:14;2302:2;;;2332:1;2329;2322:12;2302:2;2370:6;2359:9;2355:22;2345:32;;2415:7;2408:4;2404:2;2400:13;2396:27;2386:2;;2437:1;2434;2427:12;2386:2;2477;2464:16;2503:2;2495:6;2492:14;2489:2;;;2519:1;2516;2509:12;2489:2;2564:7;2559:2;2550:6;2546:2;2542:15;2538:24;2535:37;2532:2;;;2585:1;2582;2575:12;2532:2;2046:604;;;;-1:-1:-1;;2616:2:1;2608:11;;-1:-1:-1;;;2046:604:1:o;2655:1402::-;2744:6;2775:2;2818;2806:9;2797:7;2793:23;2789:32;2786:2;;;2834:1;2831;2824:12;2786:2;2874:9;2861:23;2903:18;2944:2;2936:6;2933:14;2930:2;;;2960:1;2957;2950:12;2930:2;2983:22;;;;3039:4;3021:16;;;3017:27;3014:2;;;3057:1;3054;3047:12;3014:2;3083:22;;:::i;:::-;3141:2;3128:16;3121:5;3114:31;3190:2;3186;3182:11;3169:25;3203:33;3228:7;3203:33;:::i;:::-;3268:7;3263:2;3256:5;3252:14;3245:31;;3329:2;3325;3321:11;3308:25;3303:2;3296:5;3292:14;3285:49;3387:2;3383;3379:11;3366:25;3361:2;3354:5;3350:14;3343:49;3438:3;3434:2;3430:12;3417:26;3468:2;3458:8;3455:16;3452:2;;;3484:1;3481;3474:12;3452:2;3507:17;;3555:4;3547:13;;3543:27;-1:-1:-1;3533:2:1;;3584:1;3581;3574:12;3533:2;3620;3607:16;3642:2;3638;3635:10;3632:2;;;3648:18;;:::i;:::-;3690:53;3733:2;3714:13;;-1:-1:-1;;3710:27:1;3706:36;;3690:53;:::i;:::-;3677:66;;3766:2;3759:5;3752:17;3806:7;3801:2;3796;3792;3788:11;3784:20;3781:33;3778:2;;;3827:1;3824;3817:12;3778:2;3882;3877;3873;3869:11;3864:2;3857:5;3853:14;3840:45;3926:1;3921:2;3916;3909:5;3905:14;3901:23;3894:34;;;3961:5;3955:3;3948:5;3944:15;3937:30;4021:3;4017:2;4013:12;4000:26;3994:3;3987:5;3983:15;3976:51;4046:5;4036:15;;;;;;2755:1302;;;;:::o;4062:360::-;4150:6;4203:2;4191:9;4182:7;4178:23;4174:32;4171:2;;;4219:1;4216;4209:12;4171:2;4259:9;4246:23;4292:18;4284:6;4281:30;4278:2;;;4324:1;4321;4314:12;4278:2;4347:69;4408:7;4399:6;4388:9;4384:22;4347:69;:::i;:::-;4337:79;4161:261;-1:-1:-1;;;;4161:261:1:o;4792:180::-;4851:6;4904:2;4892:9;4883:7;4879:23;4875:32;4872:2;;;4920:1;4917;4910:12;4872:2;-1:-1:-1;4943:23:1;;4862:110;-1:-1:-1;4862:110:1:o;4977:184::-;5047:6;5100:2;5088:9;5079:7;5075:23;5071:32;5068:2;;;5116:1;5113;5106:12;5068:2;-1:-1:-1;5139:16:1;;5058:103;-1:-1:-1;5058:103:1:o;5166:257::-;5207:3;5245:5;5239:12;5272:6;5267:3;5260:19;5288:63;5344:6;5337:4;5332:3;5328:14;5321:4;5314:5;5310:16;5288:63;:::i;:::-;5405:2;5384:15;-1:-1:-1;;5380:29:1;5371:39;;;;5412:4;5367:50;;5215:208;-1:-1:-1;;5215:208:1:o;5428:274::-;5557:3;5595:6;5589:13;5611:53;5657:6;5652:3;5645:4;5637:6;5633:17;5611:53;:::i;:::-;5680:16;;;;;5565:137;-1:-1:-1;;5565:137:1:o;7894:568::-;-1:-1:-1;;;;;8183:15:1;;;8165:34;;8242:14;;8235:22;8230:2;8215:18;;8208:50;8289:2;8274:18;;8267:34;;;8337:15;;8332:2;8317:18;;8310:43;8145:3;8384;8369:19;;8362:32;;;8108:4;;8411:45;;8436:19;;8428:6;8411:45;:::i;8746:345::-;-1:-1:-1;;;;;8966:32:1;;;;8948:51;;9030:2;9015:18;;9008:34;;;;9073:2;9058:18;;9051:34;8936:2;8921:18;;8903:188::o;9278:219::-;9427:2;9416:9;9409:21;9390:4;9447:44;9487:2;9476:9;9472:18;9464:6;9447:44;:::i;14704:356::-;14906:2;14888:21;;;14925:18;;;14918:30;14984:34;14979:2;14964:18;;14957:62;15051:2;15036:18;;14878:182::o;19392:705::-;19581:2;19570:9;19563:21;19626:6;19620:13;19615:2;19604:9;19600:18;19593:41;19715:1;19711;19706:3;19702:11;19698:19;19692:2;19684:6;19680:15;19674:22;19670:48;19665:2;19654:9;19650:18;19643:76;19773:2;19765:6;19761:15;19755:22;19750:2;19739:9;19735:18;19728:50;19833:2;19825:6;19821:15;19815:22;19809:3;19798:9;19794:19;19787:51;19544:4;19885:3;19877:6;19873:16;19867:23;19927:4;19921:3;19910:9;19906:19;19899:33;19955:51;20001:3;19990:9;19986:19;19972:12;19955:51;:::i;:::-;19941:65;;20062:3;20054:6;20050:16;20044:23;20037:4;20026:9;20022:20;20015:53;20085:6;20077:14;;;19553:544;;;;:::o;20284:521::-;20361:4;20367:6;20427:11;20414:25;20521:2;20517:7;20506:8;20490:14;20486:29;20482:43;20462:18;20458:68;20448:2;;20540:1;20537;20530:12;20448:2;20567:33;;20619:20;;;-1:-1:-1;20662:18:1;20651:30;;20648:2;;;20694:1;20691;20684:12;20648:2;20727:4;20715:17;;-1:-1:-1;20758:14:1;20754:27;;;20744:38;;20741:2;;;20795:1;20792;20785:12;20741:2;20378:427;;;;;:::o;20810:253::-;20882:2;20876:9;20924:4;20912:17;;20959:18;20944:34;;20980:22;;;20941:62;20938:2;;;21006:18;;:::i;:::-;21042:2;21035:22;20856:207;:::o;21068:275::-;21139:2;21133:9;21204:2;21185:13;;-1:-1:-1;;21181:27:1;21169:40;;21239:18;21224:34;;21260:22;;;21221:62;21218:2;;;21286:18;;:::i;:::-;21322:2;21315:22;21113:230;;-1:-1:-1;21113:230:1:o;21348:238::-;21388:3;-1:-1:-1;;;;;21455:10:1;;;21485;;;21515:12;;;21507:21;;21504:2;;;21531:18;;:::i;:::-;21567:13;;21396:190;-1:-1:-1;;;;21396:190:1:o;21591:128::-;21631:3;21662:1;21658:6;21655:1;21652:13;21649:2;;;21668:18;;:::i;:::-;-1:-1:-1;21704:9:1;;21639:80::o;21724:231::-;21764:4;-1:-1:-1;;;;;21862:10:1;;;;21832;;21884:12;;;21881:2;;;21899:18;;:::i;:::-;21936:13;;21773:182;-1:-1:-1;;;21773:182:1:o;21960:125::-;22000:4;22028:1;22025;22022:8;22019:2;;;22033:18;;:::i;:::-;-1:-1:-1;22070:9:1;;22009:76::o;22090:258::-;22162:1;22172:113;22186:6;22183:1;22180:13;22172:113;;;22262:11;;;22256:18;22243:11;;;22236:39;22208:2;22201:10;22172:113;;;22303:6;22300:1;22297:13;22294:2;;;-1:-1:-1;;22338:1:1;22320:16;;22313:27;22143:205::o;22353:136::-;22388:3;-1:-1:-1;;;22409:22:1;;22406:2;;;22434:18;;:::i;:::-;-1:-1:-1;22474:1:1;22470:13;;22396:93::o;22494:127::-;22555:10;22550:3;22546:20;22543:1;22536:31;22586:4;22583:1;22576:15;22610:4;22607:1;22600:15;22626:127;22687:10;22682:3;22678:20;22675:1;22668:31;22718:4;22715:1;22708:15;22742:4;22739:1;22732:15;22758:131;-1:-1:-1;;;;;22833:31:1;;22823:42;;22813:2;;22879:1;22876;22869:12
Swarm Source
ipfs://175f1d4d40b6ad58ec5b57918929a5eefd3003a412603597f328dd56576301e5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.