Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 14992815 | 993 days ago | IN | 0 ETH | 0.00288094 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PoolCollection
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { Math } from "@openzeppelin/contracts/utils/math/Math.sol";import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol";import { Token } from "../token/Token.sol";import { TokenLibrary } from "../token/TokenLibrary.sol";import { IMasterVault } from "../vaults/interfaces/IMasterVault.sol";import { IExternalProtectionVault } from "../vaults/interfaces/IExternalProtectionVault.sol";import { IVersioned } from "../utility/interfaces/IVersioned.sol";import { PPM_RESOLUTION } from "../utility/Constants.sol";import { Owned } from "../utility/Owned.sol";import { BlockNumber } from "../utility/BlockNumber.sol";import { Fraction, Fraction112, FractionLibrary, zeroFraction, zeroFraction112 } from "../utility/FractionLibrary.sol";import { Sint256, MathEx } from "../utility/MathEx.sol";// prettier-ignoreimport {Utils,AlreadyExists,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)pragma solidity ^0.8.0;import "./IAccessControlUpgradeable.sol";/*** @dev External interface of AccessControlEnumerable declared to support ERC165 detection.*/interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable {/*** @dev Returns one of the accounts that have `role`. `index` must be a* value between 0 and {getRoleMemberCount}, non-inclusive.** Role bearers are not sorted in any particular way, and their ordering may* change at any point.** WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure* you perform all queries on the same block. See the following* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]* for more information.*/function getRoleMember(bytes32 role, uint256 index) external view returns (address);/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)pragma solidity ^0.8.0;/*** @dev External interface of AccessControl declared to support ERC165 detection.*/interface IAccessControlUpgradeable {/*** @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`** `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite* {RoleAdminChanged} not being emitted signaling this.** _Available since v3.1._*/event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);/*** @dev Emitted when `account` is granted `role`.** `sender` is the account that originated the contract call, an admin role* bearer except when using {AccessControl-_setupRole}.*/event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)pragma solidity ^0.8.0;import "./IERC20.sol";import "./extensions/IERC20Metadata.sol";import "../../utils/Context.sol";/*** @dev Implementation of the {IERC20} interface.** This implementation is agnostic to the way tokens are created. This means* that a supply mechanism has to be added in a derived contract using {_mint}.* For a generic mechanism see {ERC20PresetMinterPauser}.** TIP: For a detailed writeup see our guide* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How* to implement supply mechanisms].** We have followed general OpenZeppelin Contracts guidelines: functions revert* instead returning `false` on failure. This behavior is nonetheless* conventional and does not conflict with the expectations of ERC20* applications.** Additionally, an {Approval} event is emitted on calls to {transferFrom}.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.0;/*** @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 `to`.** Returns a boolean value indicating whether the operation succeeded.** Emits a {Transfer} event.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)pragma solidity ^0.8.0;import "../IERC20.sol";/*** @dev Interface for the optional metadata functions from the ERC20 standard.** _Available since v4.1._*/interface IERC20Metadata is IERC20 {/*** @dev Returns the name of the token.*/function name() external view returns (string memory);/*** @dev Returns the symbol of the token.*/function symbol() external view returns (string memory);/*** @dev Returns the decimals places of the token.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].** Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't* need to send a transaction, and thus is not required to hold Ether at all.*/interface IERC20Permit {/*** @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,* given ``owner``'s signed approval.** IMPORTANT: The same issues {IERC20-approve} has related to transaction* ordering also apply here.** Emits an {Approval} event.** Requirements:** - `spender` cannot be the zero address.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)pragma solidity ^0.8.0;import "../IERC20.sol";import "../../../utils/Address.sol";/*** @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));
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)pragma solidity ^0.8.1;/*** @dev Collection of functions related to the address type*/library Address {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed* ====*
123456789101112131415161718192021222324// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragma solidity ^0.8.0;/*** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with 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;}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)pragma solidity ^0.8.0;/*** @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.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol)pragma solidity ^0.8.0;/*** @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow* checks.** Downcasting from uint256/int256 in Solidity does not revert on overflow. This can* easily result in undesired exploitation or bugs, since developers usually* assume that overflows raise errors. `SafeCast` restores this intuition by* reverting the transaction when such an operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.** Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing* all math on `uint256` and `int256` and then downcasting.*/library SafeCast {/*** @dev Returns the downcasted uint224 from uint256, reverting on* overflow (when the input is greater than largest uint224).** Counterpart to Solidity's `uint224` operator.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)pragma solidity ^0.8.0;/*** @dev Library for managing* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive* types.** Sets have the following properties:** - Elements are added, removed, and checked for existence in constant time* (O(1)).* - Elements are enumerated in O(n). No guarantees are made on the ordering.** ```* contract Example {* // Add the library methods* using EnumerableSet for EnumerableSet.AddressSet;** // Declare a set state variable* EnumerableSet.AddressSet private mySet;* }* ```*
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { IUpgradeable } from "../../utility/interfaces/IUpgradeable.sol";import { Token } from "../../token/Token.sol";import { IPoolCollection } from "../../pools/interfaces/IPoolCollection.sol";import { IPoolToken } from "../../pools/interfaces/IPoolToken.sol";/*** @dev Flash-loan recipient interface*/interface IFlashLoanRecipient {/*** @dev a flash-loan recipient callback after each the caller must return the borrowed amount and an additional fee*/function onFlashLoan(address caller,IERC20 erc20Token,uint256 amount,uint256 feeAmount,bytes memory data) external;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IUpgradeable } from "../../utility/interfaces/IUpgradeable.sol";import { Token } from "../../token/Token.sol";error NotWhitelisted();struct VortexRewards {// the percentage of converted BNT to be sent to the initiator of the burning event (in units of PPM)uint32 burnRewardPPM;// the maximum burn reward to be sent to the initiator of the burning eventuint256 burnRewardMaxAmount;}/*** @dev Network Settings interface*/interface INetworkSettings is IUpgradeable {/*** @dev returns the protected tokens whitelist*/function protectedTokenWhitelist() external view returns (Token[] memory);/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { PPM_RESOLUTION as M } from "../utility/Constants.sol";import { Sint256, Uint512, MathEx } from "../utility/MathEx.sol";error PoolCollectionWithdrawalInputInvalid();/*** @dev This library implements the mathematics behind base-token withdrawal.* It exposes a single function which takes the following input values:* `a` - BNT trading liquidity* `b` - base token trading liquidity* `c` - base token excess amount* `e` - base token staked amount* `w` - base token external protection vault balance* `m` - trading fee in PPM units* `n` - withdrawal fee in PPM units* `x` - base token withdrawal amount* And returns the following output values:* `p` - BNT amount to add to the trading liquidity and to the master vault* `q` - BNT amount to add to the protocol equity* `r` - base token amount to add to the trading liquidity* `s` - base token amount to transfer from the master vault to the provider* `t` - BNT amount to mint directly for the provider* `u` - base token amount to transfer from the external protection vault to the provider
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IPoolToken } from "./IPoolToken.sol";import { Token } from "../../token/Token.sol";import { IVault } from "../../vaults/interfaces/IVault.sol";// the BNT pool token manager role is required to access the BNT pool tokensbytes32 constant ROLE_BNT_POOL_TOKEN_MANAGER = keccak256("ROLE_BNT_POOL_TOKEN_MANAGER");// the BNT manager role is required to request the BNT pool to mint BNTbytes32 constant ROLE_BNT_MANAGER = keccak256("ROLE_BNT_MANAGER");// the vault manager role is required to request the BNT pool to burn BNT from the master vaultbytes32 constant ROLE_VAULT_MANAGER = keccak256("ROLE_VAULT_MANAGER");// the funding manager role is required to request or renounce funding from the BNT poolbytes32 constant ROLE_FUNDING_MANAGER = keccak256("ROLE_FUNDING_MANAGER");/*** @dev BNT Pool interface*/interface IBNTPool is IVault {/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IVersioned } from "../../utility/interfaces/IVersioned.sol";import { Fraction112 } from "../../utility/FractionLibrary.sol";import { Token } from "../../token/Token.sol";import { IPoolToken } from "./IPoolToken.sol";struct PoolLiquidity {uint128 bntTradingLiquidity; // the BNT trading liquidityuint128 baseTokenTradingLiquidity; // the base token trading liquidityuint256 stakedBalance; // the staked balance}struct AverageRates {uint32 blockNumber;Fraction112 rate;Fraction112 invRate;}struct Pool {IPoolToken poolToken; // the pool token of the pooluint32 tradingFeePPM; // the trading fee (in units of PPM)bool tradingEnabled; // whether trading is enabled
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { Token } from "../../token/Token.sol";import { IVersioned } from "../../utility/interfaces/IVersioned.sol";import { IPoolCollection } from "./IPoolCollection.sol";/*** @dev Pool Migrator interface*/interface IPoolMigrator is IVersioned {/*** @dev migrates a pool and returns the new pool collection it exists in** notes:** - invalid or incompatible pools will be skipped gracefully** requirements:** - the caller must be the network contract*/function migratePool(Token pool, IPoolCollection newPoolCollection) external;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";import { IERC20Burnable } from "../../token/interfaces/IERC20Burnable.sol";import { Token } from "../../token/Token.sol";import { IVersioned } from "../../utility/interfaces/IVersioned.sol";import { IOwned } from "../../utility/interfaces/IOwned.sol";/*** @dev Pool Token interface*/interface IPoolToken is IVersioned, IOwned, IERC20, IERC20Permit, IERC20Burnable {/*** @dev returns the address of the reserve token*/function reserveToken() external view returns (Token);/*** @dev increases the token supply and sends the new tokens to the given account** requirements:*
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { Token } from "../../token/Token.sol";import { IUpgradeable } from "../../utility/interfaces/IUpgradeable.sol";import { IPoolToken } from "./IPoolToken.sol";/*** @dev Pool Token Factory interface*/interface IPoolTokenFactory is IUpgradeable {/*** @dev returns the custom symbol override for a given reserve token*/function tokenSymbolOverride(Token token) external view returns (string memory);/*** @dev returns the custom decimals override for a given reserve token*/function tokenDecimalsOverride(Token token) external view returns (uint8);/*** @dev creates a pool token for the specified token*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";/*** @dev extends the SafeERC20 library with additional operations*/library SafeERC20Ex {using SafeERC20 for IERC20;/*** @dev ensures that the spender has sufficient allowance*/function ensureApprove(IERC20 token,address spender,uint256 amount) internal {if (amount == 0) {return;}uint256 allowance = token.allowance(address(this), spender);if (allowance >= amount) {
12345678910// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;/*** @dev the main purpose of the Token interfaces is to ensure artificially that we won't use ERC20's standard functions,* but only their safe versions, which are provided by SafeERC20 and SafeERC20Ex via the TokenLibrary contract*/interface Token {}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";import { SafeERC20Ex } from "./SafeERC20Ex.sol";import { Token } from "./Token.sol";/*** @dev This library implements ERC20 and SafeERC20 utilities for both the native token and for ERC20 tokens*/library TokenLibrary {using SafeERC20 for IERC20;using SafeERC20Ex for IERC20;error PermitUnsupported();// the address that represents the native token reserveaddress private constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;// the symbol that represents the native tokenstring private constant NATIVE_TOKEN_SYMBOL = "ETH";
123456789101112131415161718192021// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;/*** @dev burnable ERC20 interface*/interface IERC20Burnable {/*** @dev Destroys tokens from the caller.*/function burn(uint256 amount) external;/*** @dev Destroys tokens from a recipient, deducting from the caller's allowance** requirements:** - the caller must have allowance for recipient's tokens of at least the specified amount*/function burnFrom(address recipient, uint256 amount) external;}
1234567891011121314// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;/*** @dev this contract abstracts the block number in order to allow for more flexible control in tests*/abstract contract BlockNumber {/*** @dev returns the current block-number*/function _blockNumber() internal view virtual returns (uint32) {return uint32(block.number);}}
1234// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;uint32 constant PPM_RESOLUTION = 1_000_000;
1234567891011121314// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;struct Fraction {uint256 n;uint256 d;}struct Fraction112 {uint112 n;uint112 d;}error InvalidFraction();
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { Fraction, Fraction112, InvalidFraction } from "./Fraction.sol";import { MathEx } from "./MathEx.sol";// solhint-disable-next-line func-visibilityfunction zeroFraction() pure returns (Fraction memory) {return Fraction({ n: 0, d: 1 });}// solhint-disable-next-line func-visibilityfunction zeroFraction112() pure returns (Fraction112 memory) {return Fraction112({ n: 0, d: 1 });}/*** @dev this library provides a set of fraction operations*/library FractionLibrary {/*** @dev returns whether a standard fraction is valid*/function isValid(Fraction memory fraction) internal pure returns (bool) {return fraction.d != 0;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { Math } from "@openzeppelin/contracts/utils/math/Math.sol";import { Fraction, InvalidFraction } from "./Fraction.sol";import { PPM_RESOLUTION } from "./Constants.sol";uint256 constant ONE = 0x80000000000000000000000000000000;uint256 constant LN2 = 0x58b90bfbe8e7bcd5e4f1d9cc01f97b57;struct Uint512 {uint256 hi; // 256 most significant bitsuint256 lo; // 256 least significant bits}struct Sint256 {uint256 value;bool isNeg;}/*** @dev this library provides a set of complex math operations*/library MathEx {error Overflow();
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IOwned } from "./interfaces/IOwned.sol";import { AccessDenied } from "./Utils.sol";/*** @dev this contract provides support and utilities for contract ownership*/abstract contract Owned is IOwned {error SameOwner();address private _owner;address private _newOwner;/*** @dev triggered when the owner is updated*/event OwnerUpdate(address indexed prevOwner, address indexed newOwner);// solhint-disable func-name-mixedcase/*** @dev initializes the contract*/constructor() {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { PPM_RESOLUTION } from "./Constants.sol";error AccessDenied();error AlreadyExists();error DoesNotExist();error InvalidAddress();error InvalidExternalAddress();error InvalidFee();error InvalidPool();error InvalidPoolCollection();error InvalidStakedBalance();error InvalidToken();error InvalidParam();error NotEmpty();error NotPayable();error ZeroValue();/*** @dev common utilities*/abstract contract Utils {// allows execution by the caller onlymodifier only(address caller) {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;/*** @dev Owned interface*/interface IOwned {/*** @dev returns the address of the current owner*/function owner() external view returns (address);/*** @dev allows transferring the contract ownership** requirements:** - the caller must be the owner of the contract* - the new owner still needs to accept the transfer*/function transferOwnership(address ownerCandidate) external;/*** @dev used by a new owner to accept an ownership transfer*/function acceptOwnership() external;
12345678910111213// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IVersioned } from "./IVersioned.sol";import { IAccessControlEnumerableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/IAccessControlEnumerableUpgradeable.sol";/*** @dev this is the common interface for upgradeable contracts*/interface IUpgradeable is IAccessControlEnumerableUpgradeable, IVersioned {}
123456789// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;/*** @dev an interface for a versioned contract*/interface IVersioned {function version() external view returns (uint16);}
123456// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IVault } from "./IVault.sol";interface IExternalProtectionVault is IVault {}
123456// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IVault } from "./IVault.sol";interface IMasterVault is IVault {}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: SEE LICENSE IN LICENSEpragma solidity 0.8.13;import { IUpgradeable } from "../../utility/interfaces/IUpgradeable.sol";import { Token } from "../../token/Token.sol";// the asset manager role is required to access all the fundsbytes32 constant ROLE_ASSET_MANAGER = keccak256("ROLE_ASSET_MANAGER");interface IVault is IUpgradeable {/*** @dev triggered when tokens have been withdrawn from the vault*/event FundsWithdrawn(Token indexed token, address indexed caller, address indexed target, uint256 amount);/*** @dev triggered when tokens have been burned from the vault*/event FundsBurned(Token indexed token, address indexed caller, uint256 amount);/*** @dev tells whether the vault accepts native token deposits*/function isPayable() external view returns (bool);
12345678910111213141516171819202122232425{"evmVersion": "london","libraries": {},"metadata": {"bytecodeHash": "none","useLiteralContent": true},"optimizer": {"enabled": true,"runs": 200},"remappings": [],"outputSelection": {"*": {"*": ["evm.bytecode","evm.deployedBytecode","devdoc","userdoc","metadata","abi"]}}}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IBancorNetwork","name":"initNetwork","type":"address"},{"internalType":"contract IERC20","name":"initBNT","type":"address"},{"internalType":"contract INetworkSettings","name":"initNetworkSettings","type":"address"},{"internalType":"contract IMasterVault","name":"initMasterVault","type":"address"},{"internalType":"contract IBNTPool","name":"initBNTPool","type":"address"},{"internalType":"contract IExternalProtectionVault","name":"initExternalProtectionVault","type":"address"},{"internalType":"contract IPoolTokenFactory","name":"initPoolTokenFactory","type":"address"},{"internalType":"contract IPoolMigrator","name":"initPoolMigrator","type":"address"},{"internalType":"uint32","name":"initNetworkFeePPM","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessDenied","type":"error"},{"inputs":[],"name":"AlreadyEnabled","type":"error"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"DepositingDisabled","type":"error"},{"inputs":[],"name":"DoesNotExist","type":"error"},{"inputs":[],"name":"FundingLimitTooHigh","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"inputs":[],"name":"InsufficientSourceAmount","type":"error"},{"inputs":[],"name":"InsufficientTargetAmount","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidFee","type":"error"},{"inputs":[],"name":"InvalidFraction","type":"error"},{"inputs":[],"name":"InvalidParam","type":"error"},{"inputs":[],"name":"InvalidRate","type":"error"},{"inputs":[],"name":"InvalidStakedBalance","type":"error"},{"inputs":[],"name":"NotWhitelisted","type":"error"},{"inputs":[],"name":"Overflow","type":"error"},{"inputs":[],"name":"PoolCollectionWithdrawalInputInvalid","type":"error"},{"inputs":[],"name":"RateUnstable","type":"error"},{"inputs":[],"name":"SameOwner","type":"error"},{"inputs":[],"name":"TradingDisabled","type":"error"},{"inputs":[],"name":"ZeroValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"prevFeePPM","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"newFeePPM","type":"uint32"}],"name":"DefaultTradingFeePPMUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract Token","name":"pool","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"DepositingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"contextId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"contract Token","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolTokenAmount","type":"uint256"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"contextId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"contract Token","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"externalProtectionBaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bntAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawalFeeAmount","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"contextId","type":"bytes32"},{"indexed":true,"internalType":"contract Token","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolTokenSupply","type":"uint256"}],"name":"TotalLiquidityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract Token","name":"pool","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"},{"indexed":true,"internalType":"uint8","name":"reason","type":"uint8"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract Token","name":"pool","type":"address"},{"indexed":false,"internalType":"uint32","name":"prevFeePPM","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"newFeePPM","type":"uint32"}],"name":"TradingFeePPMUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"contextId","type":"bytes32"},{"indexed":true,"internalType":"contract Token","name":"pool","type":"address"},{"indexed":true,"internalType":"contract Token","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"prevLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLiquidity","type":"uint256"}],"name":"TradingLiquidityUpdated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"token","type":"address"}],"name":"createPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultTradingFeePPM","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"contextId","type":"bytes32"},{"internalType":"address","name":"provider","type":"address"},{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint256","name":"baseTokenAmount","type":"uint256"}],"name":"depositFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"depositingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"enableDepositing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"enableProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint256","name":"bntVirtualBalance","type":"uint256"},{"internalType":"uint256","name":"baseTokenVirtualBalance","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"isPoolStable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"isPoolValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"components":[{"internalType":"contract IPoolToken","name":"poolToken","type":"address"},{"internalType":"uint32","name":"tradingFeePPM","type":"uint32"},{"internalType":"bool","name":"tradingEnabled","type":"bool"},{"internalType":"bool","name":"depositingEnabled","type":"bool"},{"components":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"components":[{"internalType":"uint112","name":"n","type":"uint112"},{"internalType":"uint112","name":"d","type":"uint112"}],"internalType":"struct Fraction112","name":"rate","type":"tuple"},{"components":[{"internalType":"uint112","name":"n","type":"uint112"},{"internalType":"uint112","name":"d","type":"uint112"}],"internalType":"struct Fraction112","name":"invRate","type":"tuple"}],"internalType":"struct AverageRates","name":"averageRates","type":"tuple"},{"components":[{"internalType":"uint128","name":"bntTradingLiquidity","type":"uint128"},{"internalType":"uint128","name":"baseTokenTradingLiquidity","type":"uint128"},{"internalType":"uint256","name":"stakedBalance","type":"uint256"}],"internalType":"struct PoolLiquidity","name":"liquidity","type":"tuple"}],"internalType":"struct Pool","name":"data","type":"tuple"}],"name":"migratePoolIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"contract IPoolCollection","name":"targetPoolCollection","type":"address"}],"name":"migratePoolOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"networkFeePPM","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"onFeesCollected","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"poolData","outputs":[{"components":[{"internalType":"contract IPoolToken","name":"poolToken","type":"address"},{"internalType":"uint32","name":"tradingFeePPM","type":"uint32"},{"internalType":"bool","name":"tradingEnabled","type":"bool"},{"internalType":"bool","name":"depositingEnabled","type":"bool"},{"components":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"components":[{"internalType":"uint112","name":"n","type":"uint112"},{"internalType":"uint112","name":"d","type":"uint112"}],"internalType":"struct Fraction112","name":"rate","type":"tuple"},{"components":[{"internalType":"uint112","name":"n","type":"uint112"},{"internalType":"uint112","name":"d","type":"uint112"}],"internalType":"struct Fraction112","name":"invRate","type":"tuple"}],"internalType":"struct AverageRates","name":"averageRates","type":"tuple"},{"components":[{"internalType":"uint128","name":"bntTradingLiquidity","type":"uint128"},{"internalType":"uint128","name":"baseTokenTradingLiquidity","type":"uint128"},{"internalType":"uint256","name":"stakedBalance","type":"uint256"}],"internalType":"struct PoolLiquidity","name":"liquidity","type":"tuple"}],"internalType":"struct Pool","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"poolLiquidity","outputs":[{"components":[{"internalType":"uint128","name":"bntTradingLiquidity","type":"uint128"},{"internalType":"uint128","name":"baseTokenTradingLiquidity","type":"uint128"},{"internalType":"uint256","name":"stakedBalance","type":"uint256"}],"internalType":"struct PoolLiquidity","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"poolToken","outputs":[{"internalType":"contract IPoolToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint256","name":"baseTokenAmountToDistribute","type":"uint256"},{"internalType":"uint256","name":"protocolPoolTokenAmount","type":"uint256"}],"name":"poolTokenAmountToBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint256","name":"poolTokenAmount","type":"uint256"}],"name":"poolTokenToUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolType","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pools","outputs":[{"internalType":"contract Token[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protectionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"newDefaultTradingFeePPM","type":"uint32"}],"name":"setDefaultTradingFeePPM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint32","name":"newTradingFeePPM","type":"uint32"}],"name":"setTradingFeePPM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"contextId","type":"bytes32"},{"internalType":"contract Token","name":"sourceToken","type":"address"},{"internalType":"contract Token","name":"targetToken","type":"address"},{"internalType":"uint256","name":"sourceAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"}],"name":"tradeBySourceAmount","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tradingFeeAmount","type":"uint256"},{"internalType":"uint256","name":"networkFeeAmount","type":"uint256"}],"internalType":"struct TradeAmountAndFee","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"contextId","type":"bytes32"},{"internalType":"contract Token","name":"sourceToken","type":"address"},{"internalType":"contract Token","name":"targetToken","type":"address"},{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"maxSourceAmount","type":"uint256"}],"name":"tradeByTargetAmount","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tradingFeeAmount","type":"uint256"},{"internalType":"uint256","name":"networkFeeAmount","type":"uint256"}],"internalType":"struct TradeAmountAndFee","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"sourceToken","type":"address"},{"internalType":"contract Token","name":"targetToken","type":"address"},{"internalType":"uint256","name":"targetAmount","type":"uint256"}],"name":"tradeInputAndFeeByTargetAmount","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tradingFeeAmount","type":"uint256"},{"internalType":"uint256","name":"networkFeeAmount","type":"uint256"}],"internalType":"struct TradeAmountAndFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"sourceToken","type":"address"},{"internalType":"contract Token","name":"targetToken","type":"address"},{"internalType":"uint256","name":"sourceAmount","type":"uint256"}],"name":"tradeOutputAndFeeBySourceAmount","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tradingFeeAmount","type":"uint256"},{"internalType":"uint256","name":"networkFeeAmount","type":"uint256"}],"internalType":"struct TradeAmountAndFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"}],"name":"tradingFeePPM","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ownerCandidate","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint256","name":"baseTokenAmount","type":"uint256"}],"name":"underlyingToPoolToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"contextId","type":"bytes32"},{"internalType":"address","name":"provider","type":"address"},{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint256","name":"poolTokenAmount","type":"uint256"},{"internalType":"uint256","name":"baseTokenAmount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Token","name":"pool","type":"address"},{"internalType":"uint256","name":"poolTokenAmount","type":"uint256"}],"name":"withdrawalAmounts","outputs":[{"components":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"baseTokenAmount","type":"uint256"},{"internalType":"uint256","name":"bntAmount","type":"uint256"}],"internalType":"struct WithdrawalAmounts","name":"","type":"tuple"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101a06040526005805460ff60201b19166401000000001790553480156200002657600080fd5b5060405162005ebe38038062005ebe833981016040819052620000499162000251565b620000543362000119565b6200005f8962000173565b6200006a8862000173565b620000758762000173565b620000808662000173565b6200008b8562000173565b620000968462000173565b620000a18362000173565b620000ac8262000173565b620000b7816200019e565b6001600160a01b03808a1660805288811660a05287811660c05286811660e05285811661010052848116610120528381166101405282166101605263ffffffff8116610180526200010a6107d0620001c9565b50505050505050505062000330565b600080546001600160a01b038381166001600160a01b031980841682178555600180549091169055604051919092169283917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a9190a35050565b6001600160a01b0381166200019b5760405163e6c4247b60e01b815260040160405180910390fd5b50565b620f424063ffffffff821611156200019b576040516358d620b360e01b815260040160405180910390fd5b60055463ffffffff9081169082168103620001e2575050565b6005805463ffffffff191663ffffffff84811691821790925560408051928416835260208301919091527fb804b0ec3f0ea43004870df377170ce44cb789adca16d23286e337605558117f910160405180910390a15050565b6001600160a01b03811681146200019b57600080fd5b60008060008060008060008060006101208a8c0312156200027157600080fd5b89516200027e816200023b565b60208b015190995062000291816200023b565b60408b0151909850620002a4816200023b565b60608b0151909750620002b7816200023b565b60808b0151909650620002ca816200023b565b60a08b0151909550620002dd816200023b565b60c08b0151909450620002f0816200023b565b60e08b015190935062000303816200023b565b6101008b015190925063ffffffff811681146200031f57600080fd5b809150509295985092959850929598565b60805160a05160c05160e0516101005161012051610140516101605161018051615a6762000457600039600081816103ea0152818161429501526142d001526000818161150c0152611c62015260006112ba015260008181612b3601526131c801526000818161204701528181612115015281816121e701528181612f3001528181612fca0152818161301e0152818161310b0152614136015260008181611eed01528181612ada0152818161304b015281816131980152818161327801526139a00152600081816108b3015281816112100152818161197c01528181612b76015261336501526000818161263101526143d10152600081816107a101528181610caa01528181610ecc015281816111c90152818161177a0152611b200152615a676000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80639049f9d21161013b578063bedf9525116100b8578063ee4808fe1161007c578063ee4808fe1461061c578063f2fde38b1461062f578063f525cb6814610642578063f6c578611461064a578063fba8cdee1461067857600080fd5b8063bedf95251461057d578063c2cf4252146105b0578063c5c51dca146105e3578063d3df2424146105f8578063d4ee1d901461060b57600080fd5b80639f5c734b116100ff5780639f5c734b146104bf5780639fc19231146104d2578063a135ef17146104e0578063b1dd61b614610563578063b7fafb7a1461056a57600080fd5b80639049f9d214610460578063915b9941146104735780639181d2e314610486578063921a929e146104995780639dad4613146104ac57600080fd5b8063541868c8116101c957806372d960e11161018d57806372d960e11461040e5780637516baec1461042157806379ba509714610434578063814175851461043c5780638da5cb5b1461044f57600080fd5b8063541868c81461036857806354fd4d501461037b57806356aca36f146103915780635768adcf146103a45780636161b626146103e857600080fd5b8063279105651161021057806327910565146102b657806330cdb308146102c957806334afba2b146103145780634ceea7531461033457806352c8f9901461035557600080fd5b8063136efb7a146102425780631510748b1461026b5780631c754cae146102805780632258cc6914610293575b600080fd5b610255610250366004615236565b61068b565b6040516102629190615253565b60405180910390f35b61027e610279366004615319565b61079f565b005b61027e61028e366004615345565b6107ff565b6102a66102a1366004615236565b610a77565b6040519015158152602001610262565b61027e6102c4366004615236565b610b4f565b6102ff6102d7366004615236565b6001600160a01b0316600090815260026020526040902054600160a01b900463ffffffff1690565b60405163ffffffff9091168152602001610262565b61032761032236600461537a565b610b76565b60405161026291906153bb565b610347610342366004615319565b610beb565b604051908152602001610262565b6103276103633660046153dc565b610c84565b610327610376366004615319565b610d38565b60065b60405161ffff9091168152602001610262565b61034761039f3660046153dc565b610ec8565b6103d06103b2366004615236565b6001600160a01b039081166000908152600260205260409020541690565b6040516001600160a01b039091168152602001610262565b7f00000000000000000000000000000000000000000000000000000000000000006102ff565b61032761041c36600461537a565b611084565b600554640100000000900460ff166102a6565b61027e611100565b61027e61044a36600461543c565b611142565b6000546001600160a01b03166103d0565b61027e61046e366004615236565b6111c7565b61027e610481366004615475565b611500565b61027e6104943660046154ca565b6115b1565b6103476104a7366004615345565b611662565b61027e6104ba3660046154f8565b611738565b6103476104cd366004615515565b611776565b60055463ffffffff166102ff565b6105566104ee366004615236565b6040805160608082018352600080835260208084018290529284018190526001600160a01b0394909416845260028252928290208251938401835260048101546001600160801b038082168652600160801b9091041691840191909152600501549082015290565b604051610262919061555d565b600161037e565b6103276105783660046153dc565b611afa565b6102a661058b366004615236565b6001600160a01b0316600090815260026020526040902054600160c01b900460ff1690565b6102a66105be366004615236565b6001600160a01b0316600090815260026020526040902054600160c81b900460ff1690565b6105eb611ba6565b604051610262919061558c565b61027e6106063660046155d9565b611c56565b6001546001600160a01b03166103d0565b61034761062a366004615319565b611d11565b61027e61063d366004615236565b611da0565b610347611df9565b6102a6610658366004615236565b6001600160a01b0390811660009081526002602052604090205416151590565b61027e610686366004615607565b611e0a565b610693615051565b506001600160a01b03908116600090815260026020818152604092839020835160c0810185528154958616815263ffffffff600160a01b870481168285015260ff600160c01b88048116151583880152600160c81b9097049096161515606080830191909152855180820187526001840154909716875285518087018752948301546001600160701b038082168752600160701b9182900481168787015288860196909652865180880188526003850154808816825291909104909516858501528686019490945260808101959095528351928301845260048101546001600160801b038082168552600160801b9091041691830191909152600501549181019190915260a082015290565b7f00000000000000000000000000000000000000000000000000000000000000006107c981611e25565b81156107fa5760006107da84611e4e565b9050828160040160010160008282546107f3919061563a565b9091555050505b505050565b610807611e8b565b604080518082019091528281526020810182905261082481611eb6565b600061082f85611e4e565b8054909150600160c01b900460ff161561085c57604051637952fbad60e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff1933606090811b8216602084015287901b166034820152604881018590526068810184905260009060880160405160208183030381529060405280519060200120905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166387ba006a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109339190615652565b90506109428288858785611edc565b60048301546001600160801b03168111156109705760405163bb55fd2760e01b815260040160405180910390fd5b600061097b8561238c565b9050604051806060016040528061098f4390565b63ffffffff1681526020018281526020016109a9836123ec565b905280516001868101805463ffffffff191663ffffffff909316929092179091556020808301518051600289018054928401516001600160701b039283166001600160e01b031994851617600160701b918416820217909155604095860151805160038c0180549290960151908416919094161792909116021790558554600160c01b60ff60c01b19909116178655905181906001600160a01b038b16907f162ed187f3ed3879ae360c5df2a0a5dcaac7a208a9d762c2cbbfb1f5fad8b81d90600090a45050505050505050565b6001600160a01b038116600090815260026020818152604080842081516060808201845260048301546001600160801b038082168452600160801b909104168286015260058301548285015283519081018452600183015463ffffffff16815283518085018552838701546001600160701b038082168352600160701b918290048116838901528388019290925285518087018752600386015480841682529190910490911695810195909552928301939093529291610b3691612446565b6002811115610b4757610b4761566b565b149392505050565b610b57611e8b565b6000610b6282611e4e565b9050610b7260008383600161255e565b5050565b610b9a60405180606001604052806000815260200160008152602001600081525090565b81610ba481612582565b6000610bb681878787600019846125a3565b9050610bc1816127e1565b60408051606080820183528351825283015160208201526080909201519082015295945050505050565b6001600160a01b038083166000908152600260209081526040808320805482516318160ddd60e01b8152925194959194610c7a94889492909316926318160ddd92600480820193918290030181865afa158015610c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c709190615652565b600584015461290c565b9150505b92915050565b610ca860405180606001604052806000815260200160008152602001600081525090565b7f0000000000000000000000000000000000000000000000000000000000000000610cd281611e25565b83610cdc81612582565b83610ce681612582565b6000610cf78a8a8a8a8a60016125a3565b9050610d028161294f565b60405180606001604052808260200151815260200182606001518152602001826080015181525094505050505095945050505050565b610d5c60405180606001604052806000815260200160008152602001600081525090565b82610d6681612a8b565b82610d7081612582565b6001600160a01b03808616600090815260026020908152604080832081516060810183526004808301546001600160801b038082168452600160801b9091041682860152600583015482850152825484516318160ddd60e01b8152945193979296959216936318160ddd93818301939290918290030181865afa158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190615652565b90506000610e328883856040015161290c565b90506000610e588a8a84878960000160149054906101000a900463ffffffff1688612ab2565b905060405180606001604052808260c001518360e00151610e799190615681565b815260200182604001518360000151610e92919061563a565b8152602001600560049054906101000a900460ff16610eb2576000610eb8565b82602001515b90529a9950505050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000610ef481611e25565b85610efe81612a8b565b84610f0881612582565b84610f1281612582565b6000610f1d89611e4e565b604080516060810182526004808401546001600160801b038082168452600160801b90910416602080840191909152600585015483850152845484516318160ddd60e01b8152945195965092946000946001600160a01b03909416936318160ddd938181019392918290030181865afa158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc29190615652565b90506000610fd58b83856040015161290c565b9050808a1115610ff857604051633494a40d60e21b815260040160405180910390fd5b600061101c8d8d8d878960000160149054906101000a900463ffffffff1688612ab2565b905061102b8f8f8f8885612d0c565b8454600160c01b900460ff1615611071576040805180820190915260048601546001600160801b038082168352600160801b9091041660208201526110719086906134df565b519e9d5050505050505050505050505050565b6110a860405180606001604052806000815260200160008152602001600081525090565b816110b281612582565b60006110c3818787876001806125a3565b90506110ce816127e1565b604051806060016040528082602001518152602001826060015181526020018260800151815250925050509392505050565b6001546001600160a01b0316331461112b57604051634ca8886760e01b815260040160405180910390fd5b600154611140906001600160a01b031661360e565b565b61114a611e8b565b600061115583611e4e565b8054909150821515600160c81b90910460ff1615150361117457505050565b805460ff60c81b1916600160c81b8315159081029190911782556040516001600160a01b038516907fa606e6917bc476eb72d24f486596af7f564fb7b50f73135c81c0e8e0553430cd90600090a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006111f181611e25565b60405163b5af090f60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b5af090f90602401602060405180830381865afa158015611257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127b9190615698565b61129857604051630b094f2760e31b815260040160405180910390fd5b604051632b625f2360e01b81526001600160a01b0383811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690632b625f23906024016020604051808303816000875af1158015611305573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132991906156b5565b9050806001600160a01b03166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b5050505060006040518060c00160405280836001600160a01b03168152602001600560009054906101000a900463ffffffff1663ffffffff1681526020016000151581526020016001151581526020016040518060600160405280600063ffffffff1681526020016113ea613668565b81526020016113f7613668565b9052815260408051606081018252600080825260208281018290529282015291015290506114258482613691565b60408082015190516000911515906001600160a01b038716907f162ed187f3ed3879ae360c5df2a0a5dcaac7a208a9d762c2cbbfb1f5fad8b81d908490a4836001600160a01b03167fa2d66c1e2cc4b2cc5daaabc06447542e989ed748a9fb22476b6c913dcc1c7f4b600083602001516040516114b592919063ffffffff92831681529116602082015260400190565b60405180910390a280606001511515846001600160a01b03167fa606e6917bc476eb72d24f486596af7f564fb7b50f73135c81c0e8e0553430cd60405160405180910390a350505050565b8161150a81612a8b565b7f000000000000000000000000000000000000000000000000000000000000000061153481611e25565b61154c8461154736869003860186615865565b613691565b6115596020840184615236565b6001600160a01b03166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561159357600080fd5b505af11580156115a7573d6000803e3d6000fd5b5050505050505050565b6115b9611e8b565b806115c3816137ea565b60006115ce84611e4e565b805490915063ffffffff600160a01b909104811690841681036115f2575050505050565b815463ffffffff60a01b1916600160a01b63ffffffff86811691820292909217845560408051928416835260208301919091526001600160a01b038716917fa2d66c1e2cc4b2cc5daaabc06447542e989ed748a9fb22476b6c913dcc1c7f4b910160405180910390a25050505050565b60008260000361167457506000611731565b6001600160a01b038085166000908152600260209081526040808320805482516318160ddd60e01b81529251919516926318160ddd92600480820193918290030181865afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee9190615652565b905060006116fc8287615938565b905061172b818361170d8882615681565b600587015461171c9190615938565b611726908561563a565b613814565b93505050505b9392505050565b611740611e8b565b60055460ff64010000000090910416151581151514611773576005805464ff000000001916640100000000831515021790555b50565b60007f00000000000000000000000000000000000000000000000000000000000000006117a281611e25565b846117ac81612a8b565b836117b681612582565b60006117c187611e4e565b8054909150600160c81b900460ff166117ed576040516303a5be3f60e31b815260040160405180910390fd5b604080516060810182526004808401546001600160801b038082168452600160801b909104166020808401919091526005850154838501819052855485516318160ddd60e01b81529551949591946000946001600160a01b03909216936318160ddd9380840193919291908290030181865afa158015611871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118959190615652565b9050801580156118a457508115155b156118ba57600091506118ba8c8b86600361255e565b60006118c78a83856138e3565b90506118d38a8461563a565b600586015584546040516340c10f1960e01b81526001600160a01b038e8116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561192557600080fd5b505af1158015611939573d6000803e3d6000fd5b50506040805180820190915260028801546001600160701b038082168352600160701b909104166020820152611a0192508f91508d90889061197a90613917565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166387ba006a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fc9190615652565b611edc565b8454600160c01b900460ff1615611a47576040805180820190915260048601546001600160801b038082168352600160801b909104166020820152611a479086906134df565b8a6001600160a01b03168c6001600160a01b03168e7fecb7e4cd1580472adaeba712b36acf94439b2e1760af55fedb61960ca4422af38d85604051611a96929190918252602082015260400190565b60405180910390a4611aea8d8c611aad848661563a565b6040805160608101825260048b01546001600160801b038082168352600160801b90910416602082015260058b0154918101919091528890613953565b9c9b505050505050505050505050565b611b1e60405180606001604052806000815260200160008152602001600081525090565b7f0000000000000000000000000000000000000000000000000000000000000000611b4881611e25565b83611b5281612582565b83611b5c81612582565b6000611b6d8a8a8a8a8a60006125a3565b9050611b788161294f565b6040805160608082018352835182528301516020820152608090920151908201529998505050505050505050565b60606000611bb460036139eb565b905060008167ffffffffffffffff811115611bd157611bd16156d2565b604051908082528060200260200182016040528015611bfa578160200160208202803683370190505b50905060005b82811015611c4f57611c136003826139f5565b828281518110611c2557611c25615957565b6001600160a01b039092166020928302919091019091015280611c478161596d565b915050611c00565b5092915050565b80611c6081612a8b565b7f0000000000000000000000000000000000000000000000000000000000000000611c8a81611e25565b6001600160a01b0380851660009081526002602052604090205416611cae85613a01565b60405163f2fde38b60e01b81526001600160a01b03858116600483015282169063f2fde38b906024015b600060405180830381600087803b158015611cf257600080fd5b505af1158015611d06573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038083166000908152600260209081526040808320805482516318160ddd60e01b8152925194959194610c7a94889492909316926318160ddd92600480820193918290030181865afa158015611d72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d969190615652565b60058401546138e3565b611da8611e8b565b6000546001600160a01b0390811690821603611dd757604051630a98f1f360e21b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000611e0560036139eb565b905090565b611e12611e8b565b80611e1c816137ea565b610b7282613a8b565b336001600160a01b0382161461177357604051634ca8886760e01b815260040160405180910390fd5b6001600160a01b03808216600090815260026020526040812080549192909116610c7e5760405163b0ce759160e01b815260040160405180910390fd5b6000546001600160a01b0316331461114057604051634ca8886760e01b815260040160405180910390fd5b611ebf81613afc565b61177357604051636a43f8d160e01b815260040160405180910390fd5b6000611f116001600160a01b0386167f0000000000000000000000000000000000000000000000000000000000000000613b19565b905080600003611f345760405163bb55fd2760e01b815260040160405180910390fd5b604080516060808201835260048701546001600160801b038082168452600160801b909104166020808401919091526005880154838501528351918201845260018089015463ffffffff1683528451808601865260028a01546001600160701b038082168352600160701b91829004811683860152858501929092528651808801885260038c01548084168252919091049091169281019290925293820152909190611fe1908390612446565b6002811115611ff257611ff261566b565b03611ffe575050612385565b61200784613afc565b61201f57612018878787600261255e565b5050612385565b604051638d0c782760e01b81526001600160a01b0387811660048301526000916120bc9185917f000000000000000000000000000000000000000000000000000000000000000090911690638d0c782790602401602060405180830381865afa158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190615652565b848888613bbd565b80519091506120cd57505050612385565b602081015115806120e057506040810151155b156120fa576120f2888888600261255e565b505050612385565b81600001516001600160801b0316816020015111156121cc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371c0feb7898985600001516001600160801b031685602001516121619190615681565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301526044820152606401600060405180830381600087803b1580156121af57600080fd5b505af11580156121c3573d6000803e3d6000fd5b5050505061229a565b81600001516001600160801b03168160200151101561229a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631ebda06d8989846020015186600001516001600160801b03166122339190615681565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301526044820152606401600060405180830381600087803b15801561228157600080fd5b505af1158015612295573d6000803e3d6000fd5b505050505b600060405180606001604052806122b48460200151613d86565b6001600160801b031681526020016122cf8460400151613d86565b6001600160801b0390811682526040808701516020938401528351848401518316600160801b029216919091176004808c01919091558382015160058c01558a5482516318160ddd60e01b81529251949550611d06948e948e946001600160a01b03909316936318160ddd938082019391908290030181865afa15801561235a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237e9190615652565b8685613953565b5050505050565b604080518082019091526000808252602082015260006123b3836001600160701b03613df7565b9050604051806040016040528082600001516001600160701b0316815260200182602001516001600160701b0316815250915050919050565b6040805180820190915260008082526020820152604080518082019091526020838101516001600160701b03908116835284511690820181905215155b610c7e57604051630d38a7e760e11b815260040160405180910390fd5b6040805180820190915282516001600160801b039081168252602080850151909116818301528201516000919061247c82613afc565b158061248e575061248c81613e86565b155b1561249e57600092505050610c7e565b60006124a983613eb5565b60408601519091506124ba82613afc565b15806124cc57506124ca81613e86565b155b156124de576000945050505050610c7e565b4363ffffffff16866000015163ffffffff161461250e576124ff8385613eea565b925061250b8183613eea565b90505b61252361251a84613917565b85612710613f5c565b801561253f575061253f61253682613917565b83612710613f5c565b15612551576002945050505050610c7e565b5060019695505050505050565b600482015461257c908590859085906001600160801b031685613ffe565b50505050565b8060000361177357604051637c946ed760e01b815260040160405180910390fd5b612624604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600015158152602001600015158152602001600063ffffffff168152602001600080191681525090565b6001600160a01b038681167f0000000000000000000000000000000000000000000000000000000000000000821690811491871614818015612664575080155b156126865760016101208401526001600160a01b0387166101008401526126cc565b811580156126915750805b156126b35760006101208401526001600160a01b0388166101008401526126cc565b60405163b0ce759160e01b815260040160405180910390fd5b60006126dc846101000151611e4e565b8054909150600160c01b900460ff166127085760405163bcb8b8fb60e01b815260040160405180910390fd5b61018084018a9052841580156101408601526127265786845261272e565b602084018790525b60408481018790528154600160a01b900463ffffffff16610160860152805160608101825260048301546001600160801b038082168352600160801b909104166020820152600583015491810191909152610120850151156127ac5780516001600160801b0390811660a087015260208201511660c08601526127ca565b60208101516001600160801b0390811660a087015281511660c08601525b6040015160e0850152509198975050505050505050565b6040805180820190915260008082526020820152816101400151156128525761281d8260a001518360c001518461016001518560000151614165565b8051602084018190526040840151919250101561284d5760405163f31ee7a560e01b815260040160405180910390fd5b6128a5565b61286f8260a001518360c0015184610160015185602001516141f7565b80518084529091501580612887575060408201518251115b156128a55760405163681c2ccd60e11b815260040160405180910390fd5b60208101516060830152815160a0830180516128c290839061563a565b905250602082015160c0830180516128db908390615681565b905250610120820151156129035781606001518260e0018181516128ff919061563a565b9052505b610b7282614293565b60008260000361293c57811561293557604051636a9c61e160e01b815260040160405180910390fd5b5082611731565b612947848385613814565b949350505050565b6101008101516001600160a01b0316600090815260026020908152604091829020825160608101845260048201546001600160801b038082168352600160801b90910481168285019081526005840154838701528551808701909652825182168652511692840192909252916129c69083906134df565b6129cf836127e1565b600060405180606001604052806129fd8661012001516129f3578660c00151613d86565b8660a00151613d86565b6001600160801b03168152602001612a2c866101200151612a22578660a00151613d86565b8660c00151613d86565b6001600160801b031681526020018560e001518152509050612a5a8461018001518561010001518484614393565b805160208201516001600160801b03908116600160801b029116176004840155604001516005909201919091555050565b6001600160a01b0381166117735760405163e6c4247b60e01b815260040160405180910390fd5b612aba6150a9565b60208401516000906001600160801b0316612afe6001600160a01b038a167f0000000000000000000000000000000000000000000000000000000000000000613b19565b612b089190615681565b90506000612c0286600001516001600160801b031687602001516001600160801b0316848960400151612b6d7f00000000000000000000000000000000000000000000000000000000000000008f6001600160a01b0316613b1990919063ffffffff16565b8a63ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632aac012c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190615986565b63ffffffff168e6144b7565b905060405180610180016040528082606001518152602001826080015181526020018260a0015181526020018260400151815260200182600001518152602001826020015181526020018260c001518152602001888152602001898152602001858152602001826040015160200151612c98576040830151516020890151612c9391906001600160801b031661563a565b612cb6565b6040830151516020890151612cb691906001600160801b0316615681565b8152602001826000015160200151612ce5578251518851612ce091906001600160801b031661563a565b612cfd565b8251518851612cfd91906001600160801b0316615681565b90529998505050505050505050565b60408051606080820183526004850180546001600160801b038082168552600160801b909104166020808501919091526005870154848601528451928301855260018088015463ffffffff1684528551808701875260028901546001600160701b038082168352600160701b91829004811683860152868501929092528751808901895260038b0154808416825291909104909116928101929092529483015292612db78383612446565b6002811115612dc857612dc861566b565b03612de6576040516301a6272960e41b815260040160405180910390fd5b8454610100850151604051630852cd8d60e31b81526001600160a01b03909216916342966c6891612e1d9160040190815260200190565b600060405180830381600087803b158015612e3757600080fd5b505af1158015612e4b573d6000803e3d6000fd5b505050506000846101000151856101200151612e679190615681565b9050612e7d846001015482876101200151613814565b6001850155610140850151612e9190613d86565b84546001600160801b03918216600160801b029116178455610160850151612eb890613d86565b84546fffffffffffffffffffffffffffffffff19166001600160801b039190911617845560a08501515115612f94578460a0015160200151612efc57612efc6159a3565b60a085015151604051631ebda06d60e01b8152600481018b90526001600160a01b03898116602483015260448201929092527f000000000000000000000000000000000000000000000000000000000000000090911690631ebda06d906064015b600060405180830381600087803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b505050506130ba565b608085015151156130ba578460800151602001511561300157608085015151604051631538c64b60e31b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9c6325890602401612f5d565b6080850151516040516340c10f1960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916340c10f1991613087917f0000000000000000000000000000000000000000000000000000000000000000916004016001600160a01b03929092168252602082015260400190565b600060405180830381600087803b1580156130a157600080fd5b505af11580156130b5573d6000803e3d6000fd5b505050505b600554602086015164010000000090910460ff1690158015906130da5750805b1561316a5760208601516040516340c10f1960e01b81526001600160a01b038b8116600483015260248201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906340c10f1990604401600060405180830381600087803b15801561315157600080fd5b505af1158015613165573d6000803e3d6000fd5b505050505b604086015115613240576040868101519051631c20fadd60e01b81526001600160a01b038a811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201929092527f000000000000000000000000000000000000000000000000000000000000000090911690631c20fadd90606401600060405180830381600087803b15801561320e57600080fd5b505af1158015613222573d6000803e3d6000fd5b5050505085604001518660000181815161323c919061563a565b9052505b8551156132d7578551604051631c20fadd60e01b81526001600160a01b038a811660048301528b8116602483015260448201929092527f000000000000000000000000000000000000000000000000000000000000000090911690631c20fadd90606401600060405180830381600087803b1580156132be57600080fd5b505af11580156132d2573d6000803e3d6000fd5b505050505b856101400151600003613363576132ec613668565b80516002890180546020909301516001600160701b03908116600160701b026001600160e01b031990941692169190911791909117905561332b613668565b80516003890180546020909301516001600160701b03908116600160701b026001600160e01b03199094169216919091179190911790555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166387ba006a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e59190615652565b8661016001511015613404576134048a89898961016001516002613ffe565b876001600160a01b0316896001600160a01b03168b7feab8ac9e9478a4b3c37a794ecef629b8a8bbcd96f9eaeac8ed26054d144da52d89600001518a61010001518b604001518761345657600061345c565b8c602001515b60c08e0151604080519586526020860194909452928401919091526060830152608082015260a00160405180910390a46040805160608101825260048901546001600160801b038082168352600160801b9091041660208201526005890154918101919091526134d3908b908a9085908890613953565b50505050505050505050565b6001820154439063ffffffff8083169116146107fa576040805160608101825263ffffffff83168152815180830190925260028501546001600160701b038082168452600160701b909104166020838101919091529091908201906135449085613eea565b81526040805180820190915260038601546001600160701b038082168352600160701b909104166020828101919091529091019061358a9061358586613eb5565b613eea565b9052805160018501805463ffffffff191663ffffffff9092169190911790556020808201518051600287018054928401516001600160701b039283166001600160e01b031994851617600160701b91841682021790915560409094015180516003909801805491909401519782169216919091179516909102939093179092555050565b600080546001600160a01b038381166001600160a01b031980841682178555600180549091169055604051919092169283917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a9190a35050565b604080518082018252600080825260209182018190528251808401909352825260019082015290565b61369c600383614739565b6136b95760405163119b4fd360e11b815260040160405180910390fd5b6001600160a01b039182166000908152600260208181526040928390208451815486840151878701516060890151939099166001600160c01b031990921691909117600160a01b63ffffffff928316021761ffff60c01b1916600160c01b9815159890980260ff60c81b191697909717600160c81b911515919091021781556080850151805160018301805463ffffffff191691909816179096558582015180519382018054918401516001600160701b039586166001600160e01b031993841617600160701b91871682021790915596850151805160038401805492860151918716929093169190911794169096029290921790945560a0909201518051938101516001600160801b03948516600160801b95909116949094029390931760048301559190910151600590910155565b620f424063ffffffff82161115611773576040516358d620b360e01b815260040160405180910390fd5b600080613821858561474e565b80519091506000036138455782816020015161383d91906159cf565b915050611731565b8051831161386657604051631a93c68960e11b815260040160405180910390fd5b60006138738686866147d5565b9050600061388183836147f0565b80519091506000036138a75784816020015161389d91906159cf565b9350505050611731565b60008581038616906138b98383614875565b905060006138cf6138ca848a6159cf565b6148ac565b90508181025b9a9950505050505050505050565b60008260000361390c57811561293557604051636a9c61e160e01b815260040160405180910390fd5b6129478484846148d7565b6040805180820182526000808252602091820152815180830190925282516001600160701b039081168352928101519092169181019190915290565b61395f85858484614393565b8160400151816040015114612385576001600160a01b038416857f67c4863f17da9847c57c9fa043e63a0ddf4f5a86fd63a6f71ea69057a11c411a6139c4837f0000000000000000000000000000000000000000000000000000000000000000613b19565b60408086015181519283526020830152810187905260600160405180910390a35050505050565b6000610c7e825490565b60006117318383614927565b613a0c600382614951565b613a295760405163b0ce759160e01b815260040160405180910390fd5b6001600160a01b03166000908152600260208190526040822080546001600160d01b031916815560018101805463ffffffff1916905590810180546001600160e01b031990811690915560038201805490911690556004810182905560050155565b60055463ffffffff9081169082168103613aa3575050565b6005805463ffffffff191663ffffffff84811691821790925560408051928416835260208301919091527fb804b0ec3f0ea43004870df377170ce44cb789adca16d23286e337605558117f910160405180910390a15050565b6000613b0b8260200151151590565b8015610c7e57505051151590565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603613b5057506001600160a01b03811631610c7e565b826040516370a0823160e01b81526001600160a01b03848116600483015291909116906370a0823190602401602060405180830381865afa158015613b99573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190615652565b613be3604051806060016040528060001515815260200160008152602001600081525090565b600084602001516001600160801b031687613bfe9190615681565b90506000613c1e613c188387600001518860200151613814565b88614966565b905060008187600001516001600160801b0316613c3b919061563a565b905084811015613c6f5760405180606001604052806001151581526020016000815260200160008152509350505050613d7d565b86516001600160801b0316600003613cca576000613c8e600287615938565b905081811115613cc3576040518060600160405280600015158152602001600081526020016000815250945050505050613d7d565b9050613d01565b86516001600160801b03168110613d0157613cfe81600289600001516001600160801b0316613cf99190615938565b614966565b90505b8651600090613d19906001600160801b031683615681565b905060008115613d3b57613d368289602001518a60000151613814565b613d3e565b60005b90506040518060600160405280600115158152602001848152602001828b602001516001600160801b0316613d73919061563a565b9052955050505050505b95945050505050565b60006001600160801b03821115613df35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b606482015260840160405180910390fd5b5090565b60408051808201909152600080825260208201526000613e28613e228560000151866020015161497c565b8461498c565b905060006040518060400160405280838760000151613e4791906159cf565b8152602001838760200151613e5c91906159cf565b81525090508060200151600003610c7a57604051630d38a7e760e11b815260040160405180910390fd5b6000613e9e82602001516001600160701b0316151590565b8015610c7e575050516001600160701b0316151590565b604080518082019091526000808252602082015260408051808201909152602083810151825283519082018190521515612429565b604080518082019091526000808252602082015282516020830151613f18916001600160701b031690615938565b60208401518351613f32916001600160701b031690615938565b03613f3e575081610c7e565b611731613f57613f4d85613917565b84600460016149be565b61238c565b82516000908190613f8e90613f7485620f42406159e3565b63ffffffff168660200151613f899190615938565b61474e565b90506000613fb38660200151620f424063ffffffff168760000151613f899190615938565b8651909150600090613fe190613fcc87620f4240615a08565b63ffffffff168860200151613f899190615938565b9050613fed8383614a5a565b801561172b575061172b8282614a5a565b600060048401819055604080516060810190915290815260208101614021613668565b815260200161402e613668565b9052805160018501805463ffffffff191663ffffffff9092169190911790556020808201518051600287018054928401516001600160701b039283166001600160e01b031994851617600160701b91841682021790915560409094015180516003890180549290950151908316919093161791169092029190911790558254600160c01b900460ff161561410357825460ff60c01b1916835560405160ff8216906000906001600160a01b038716907f162ed187f3ed3879ae360c5df2a0a5dcaac7a208a9d762c2cbbfb1f5fad8b81d908390a45b811561238557604051631ebda06d60e01b8152600481018690526001600160a01b038581166024830152604482018490527f00000000000000000000000000000000000000000000000000000000000000001690631ebda06d90606401611cd8565b6040805180820190915260008082526020820152841580614184575083155b156141a25760405163bb55fd2760e01b815260040160405180910390fd5b60006141b38584611726818a61563a565b905060006141cb8263ffffffff8716620f4240613814565b9050604051806040016040528082846141e49190615681565b8152602001919091529695505050505050565b60408051808201909152600080825260208201528460000361422c5760405163bb55fd2760e01b815260040160405180910390fd5b60006142518363ffffffff861661424687620f42406159e3565b63ffffffff16613814565b9050600061425f828561563a565b905060006142728883611726818b615681565b60408051808201909152908152602081019390935250909695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff166000036142c45750565b600061430482606001517f000000000000000000000000000000000000000000000000000000000000000063ffffffff16620f424063ffffffff16613814565b9050808260c0018181516143189190615681565b90525061012082015161432d57608090910152565b6143428260c001518360a00151600084614165565b51608083015260c08201805182919061435c90839061563a565b905250608082015160a083018051614375908390615681565b90525060e08201805182919061438c908390615681565b9052505050565b815181516001600160801b039081169116146144255781518151604080516001600160801b0393841681529290911660208301526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116929086169187917f6e96dc5343d067ec486a9920e0304c3610ed05c65e45cc029d9b9fe7ecfa7620910160405180910390a45b81602001516001600160801b031681602001516001600160801b03161461257c57826001600160a01b0316836001600160a01b0316857f6e96dc5343d067ec486a9920e0304c3610ed05c65e45cc029d9b9fe7ecfa7620856020015185602001516040516144a99291906001600160801b0392831681529116602082015260400190565b60405180910390a450505050565b6144bf615161565b6001600160801b038911806144da57506001600160801b0388115b806144eb57506001600160801b0387115b806144fc57506001600160801b0386115b8061450d57506001600160801b0385115b8061451a5750620f424084115b806145275750620f424083115b8061453157508582115b1561454f576040516318b103bd60e21b815260040160405180910390fd5b6000620f424061455f8582615681565b6145699085615938565b61457391906159cf565b905061457f888a61563a565b620f424061458d8682615681565b614597908a615938565b6145a191906159cf565b11156146a25760006145b3898b61563a565b620f42406145c18782615681565b6145cb908b615938565b6145d591906159cf565b6145df9190615681565b905060006145ed8a8c61563a565b6145f7908a615681565b90506146058b8b8b88614a6e565b801561461b575061461b8b8a84848b8b8b614a98565b156146365761462f8c8c8b858b8a89614afa565b935061469b565b8b15614668576146498c8c8c8c87614bd3565b93506146598c8c8b84878d614c54565b60a0860152608085015261469b565b886146738b85615938565b61467d91906159cf565b60608501526146908c8c8b84878d614c54565b60a086015260808501525b505061471d565b60006146b76146b18a8c61563a565b89614cc9565b90506000811180156146d057506146d08a8a8a87614a6e565b80156146e557506146e58a8983898989614ce3565b15614701576146fa8b8b8a848a8a8a89614d6d565b925061471b565b8a15614713576146fa8b8b8b85614e1b565b606083018290525b505b6147278184615681565b60c08301525098975050505050505050565b6000611731836001600160a01b038416614e8c565b6040805180820190915260008082526020820152600061476e8484614edb565b90508383028082106147a357604051806040016040528082846147919190615681565b81526020018281525092505050610c7e565b604051806040016040528060016147ba8585900390565b6147c49190615681565b815260200191909152949350505050565b600081806147e5576147e56159b9565b838509949350505050565b60408051808201909152600080825260208201528183602001511061483d576040518060400160405280846000015181526020018385602001516148349190615681565b90529050610c7e565b6040518060400160405280600185600001516148599190615681565b815260200161486c856020015185900390565b90529392505050565b60008061488d614887848084036159cf565b60010190565b905082846020015161489f91906159cf565b8451820217949350505050565b60006001815b6008811015611c4f5783820260020382029150806148cf8161596d565b9150506148b2565b6000806148e5858585613814565b905060006148f48686866147d5565b111561294757600019811061491c57604051631a93c68960e11b815260040160405180910390fd5b61383d81600161563a565b600082600001828154811061493e5761493e615957565b9060005260206000200154905092915050565b6000611731836001600160a01b038416614eea565b60008183106149755781611731565b5090919050565b6000818310156149755781611731565b60006149988284615a30565b156149a45760016149a7565b60005b60ff166149b483856159cf565b611731919061563a565b6040805180820190915260008082526020820152604051806040016040528083866000015188602001516149f29190615938565b6149fc9190615938565b602087015188518791614a0e91615938565b614a189190615938565b614a22919061563a565b8152602001614a31848661563a565b86602001518860200151614a459190615938565b614a4f9190615938565b905295945050505050565b6000614a668383614fdd565b159392505050565b6000614a7a8284615681565b614a849085615938565b614a8e8387615938565b1095945050505050565b600080614ac6614aa8898b615938565b614ab2868b615938565b614abc888b615938565b613f89919061563a565b90506000614aee614ad7858a615938565b614ae488620f4240615681565b613f89908a615938565b90506138d58282614fdd565b614b02615161565b6000614b1185620f4240615681565b614b1b9087615938565b90506000614b3989614b30620f42408b615938565b87856001615005565b9050614b7e614b52614b4b878d615938565b8484613814565b604080518082019091526000808252602082015250604080518082019091529081526000602082015290565b8352614bba614b8e86898b613814565b604080518082019091526000808252602082015250604080518082019091529081526001602082015290565b6040840152505060608101919091529695505050505050565b614bdb615161565b6000614c03614bea8785615938565b614bf48587615681565b614bfe9088615938565b614cc9565b9050614c17614b8e8883611726888b615938565b8083526020830152614c2c614b8e85836159cf565b6040830152614c4583614c3f878961563a565b86613814565b60608301525095945050505050565b60008080614c628686615938565b90506000614c708886615938565b905080821115614cab5760008a11614c89576000614ca1565b614ca18a614c978385615681565b6117268b8d615938565b9350849250614cbc565b60009350614cb988836159cf565b92505b5050965096945050505050565b6000818311614cd9576000611731565b6117318284615681565b600080614d1f614cf3888a615938565b620f4240614d01878b615938565b614d0b898b615938565b614d15919061563a565b613f899190615938565b90506000614d54614d308589615938565b614d3d88620f4240615681565b614d47888c615938565b614d0b620f42408c615938565b9050614d608282614fdd565b9998505050505050505050565b614d75615161565b6000614d818589615938565b614d8e620f424089615938565b614d98919061563a565b90506000614dd88a614dad89620f4240615681565b614db7908c615938565b87614dc58b620f4240615681565b614dcf9087615938565b620f4240615030565b9050614dea614b8e614b4b878e615938565b8352614e01614b528684611726620f42408e615938565b604084015250506060810191909152979650505050505050565b614e23615161565b6000614e2f8385614cc9565b9050614e3f614b8e878388613814565b8083526020830152614e7781604080518082019091526000808252602082015250604080518082019091529081526001602082015290565b60408301525060608101919091529392505050565b6000818152600183016020526040812054614ed357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c7e565b506000610c7e565b60006000198284099392505050565b60008181526001830160205260408120548015614fd3576000614f0e600183615681565b8554909150600090614f2290600190615681565b9050818114614f87576000866000018281548110614f4257614f42615957565b9060005260206000200154905080876000018481548110614f6557614f65615957565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614f9857614f98615a44565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c7e565b6000915050610c7e565b8051825160009110806117315750815183511480156117315750506020908101519101511190565b6000615012848484613814565b61501c8688615938565b6150269190615681565b9695505050505050565b600061503d848484613814565b6150478688615938565b615026919061563a565b6040805160c0810182526000808252602082018190529181018290526060810191909152608081016150816151d0565b815260408051606081018252600080825260208281018290529282015291015290565b905290565b6040518061018001604052806000815260200160008152602001600081526020016150e96040518060400160405280600081526020016000151581525090565b815260200161510d6040518060400160405280600081526020016000151581525090565b81526020016151316040518060400160405280600081526020016000151581525090565b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805161012081018252600060e082018181526101008301829052825282518084018452818152602080820183905280840191909152835180850185528281529081019190915290918201908152602001600081526020016000815260200160008152602001600081525090565b6040518060600160405280600063ffffffff168152602001615202604080518082019091526000808252602082015290565b81526020016150a4604080518082019091526000808252602082015290565b6001600160a01b038116811461177357600080fd5b60006020828403121561524857600080fd5b813561173181615221565b81516001600160a01b0316815260208083015163ffffffff908116828401526040808501511515908401526060808501511515908401526080808501518051909216908401528082015180516001600160701b0390811660a08601529281015190921660c0840152610180830191506040015180516001600160701b0390811660e08501526020820151166101008401525060a083015180516001600160801b039081166101208501526020820151166101408401526040810151610160840152611c4f565b6000806040838503121561532c57600080fd5b823561533781615221565b946020939093013593505050565b60008060006060848603121561535a57600080fd5b833561536581615221565b95602085013595506040909401359392505050565b60008060006060848603121561538f57600080fd5b833561539a81615221565b925060208401356153aa81615221565b929592945050506040919091013590565b81518152602080830151908201526040808301519082015260608101610c7e565b600080600080600060a086880312156153f457600080fd5b85359450602086013561540681615221565b9350604086013561541681615221565b94979396509394606081013594506080013592915050565b801515811461177357600080fd5b6000806040838503121561544f57600080fd5b823561545a81615221565b9150602083013561546a8161542e565b809150509250929050565b6000808284036101a081121561548a57600080fd5b833561549581615221565b9250610180601f19820112156154aa57600080fd5b506020830190509250929050565b63ffffffff8116811461177357600080fd5b600080604083850312156154dd57600080fd5b82356154e881615221565b9150602083013561546a816154b8565b60006020828403121561550a57600080fd5b81356117318161542e565b6000806000806080858703121561552b57600080fd5b84359350602085013561553d81615221565b9250604085013561554d81615221565b9396929550929360600135925050565b81516001600160801b039081168252602080840151909116908201526040808301519082015260608101610c7e565b6020808252825182820181905260009190848201906040850190845b818110156155cd5783516001600160a01b0316835292840192918401916001016155a8565b50909695505050505050565b600080604083850312156155ec57600080fd5b82356155f781615221565b9150602083013561546a81615221565b60006020828403121561561957600080fd5b8135611731816154b8565b634e487b7160e01b600052601160045260246000fd5b6000821982111561564d5761564d615624565b500190565b60006020828403121561566457600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b60008282101561569357615693615624565b500390565b6000602082840312156156aa57600080fd5b81516117318161542e565b6000602082840312156156c757600080fd5b815161173181615221565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561571957634e487b7160e01b600052604160045260246000fd5b60405290565b6040516060810167ffffffffffffffff8111828210171561571957634e487b7160e01b600052604160045260246000fd5b80356001600160701b038116811461576757600080fd5b919050565b60006040828403121561577e57600080fd5b6040516040810181811067ffffffffffffffff821117156157af57634e487b7160e01b600052604160045260246000fd5b6040529050806157be83615750565b81526157cc60208401615750565b60208201525092915050565b80356001600160801b038116811461576757600080fd5b60006060828403121561580157600080fd5b6040516060810181811067ffffffffffffffff8211171561583257634e487b7160e01b600052604160045260246000fd5b604052905080615841836157d8565b815261584f602084016157d8565b6020820152604083013560408201525092915050565b600081830361018081121561587957600080fd5b6158816156e8565b833561588c81615221565b8152602084013561589c816154b8565b602082015260408401356158af8161542e565b604082015260608401356158c28161542e565b606082015260a0607f19830112156158d957600080fd5b6158e161571f565b915060808401356158f1816154b8565b82526159008560a0860161576c565b60208301526159128560e0860161576c565b604083015281608082015261592b8561012086016157ef565b60a0820152949350505050565b600081600019048311821515161561595257615952615624565b500290565b634e487b7160e01b600052603260045260246000fd5b60006001820161597f5761597f615624565b5060010190565b60006020828403121561599857600080fd5b8151611731816154b8565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826159de576159de6159b9565b500490565b600063ffffffff83811690831681811015615a0057615a00615624565b039392505050565b600063ffffffff808316818516808303821115615a2757615a27615624565b01949350505050565b600082615a3f57615a3f6159b9565b500690565b634e487b7160e01b600052603160045260246000fdfea164736f6c634300080d000a000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c00000000000000000000000083e1814ba31f7ea95d216204bb45fe75ce09b14f000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc37300000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca000000000000000000000000fd31662b3d54edde9b6bdd32c9c27c8e292cad570000000000000000000000009e912953db31fe933bda43374208e967058d9d5f00000000000000000000000097cec0f2d355bf073619a5093f989709cae4a19100000000000000000000000000000000000000000000000000000000000249f0
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80639049f9d21161013b578063bedf9525116100b8578063ee4808fe1161007c578063ee4808fe1461061c578063f2fde38b1461062f578063f525cb6814610642578063f6c578611461064a578063fba8cdee1461067857600080fd5b8063bedf95251461057d578063c2cf4252146105b0578063c5c51dca146105e3578063d3df2424146105f8578063d4ee1d901461060b57600080fd5b80639f5c734b116100ff5780639f5c734b146104bf5780639fc19231146104d2578063a135ef17146104e0578063b1dd61b614610563578063b7fafb7a1461056a57600080fd5b80639049f9d214610460578063915b9941146104735780639181d2e314610486578063921a929e146104995780639dad4613146104ac57600080fd5b8063541868c8116101c957806372d960e11161018d57806372d960e11461040e5780637516baec1461042157806379ba509714610434578063814175851461043c5780638da5cb5b1461044f57600080fd5b8063541868c81461036857806354fd4d501461037b57806356aca36f146103915780635768adcf146103a45780636161b626146103e857600080fd5b8063279105651161021057806327910565146102b657806330cdb308146102c957806334afba2b146103145780634ceea7531461033457806352c8f9901461035557600080fd5b8063136efb7a146102425780631510748b1461026b5780631c754cae146102805780632258cc6914610293575b600080fd5b610255610250366004615236565b61068b565b6040516102629190615253565b60405180910390f35b61027e610279366004615319565b61079f565b005b61027e61028e366004615345565b6107ff565b6102a66102a1366004615236565b610a77565b6040519015158152602001610262565b61027e6102c4366004615236565b610b4f565b6102ff6102d7366004615236565b6001600160a01b0316600090815260026020526040902054600160a01b900463ffffffff1690565b60405163ffffffff9091168152602001610262565b61032761032236600461537a565b610b76565b60405161026291906153bb565b610347610342366004615319565b610beb565b604051908152602001610262565b6103276103633660046153dc565b610c84565b610327610376366004615319565b610d38565b60065b60405161ffff9091168152602001610262565b61034761039f3660046153dc565b610ec8565b6103d06103b2366004615236565b6001600160a01b039081166000908152600260205260409020541690565b6040516001600160a01b039091168152602001610262565b7f00000000000000000000000000000000000000000000000000000000000249f06102ff565b61032761041c36600461537a565b611084565b600554640100000000900460ff166102a6565b61027e611100565b61027e61044a36600461543c565b611142565b6000546001600160a01b03166103d0565b61027e61046e366004615236565b6111c7565b61027e610481366004615475565b611500565b61027e6104943660046154ca565b6115b1565b6103476104a7366004615345565b611662565b61027e6104ba3660046154f8565b611738565b6103476104cd366004615515565b611776565b60055463ffffffff166102ff565b6105566104ee366004615236565b6040805160608082018352600080835260208084018290529284018190526001600160a01b0394909416845260028252928290208251938401835260048101546001600160801b038082168652600160801b9091041691840191909152600501549082015290565b604051610262919061555d565b600161037e565b6103276105783660046153dc565b611afa565b6102a661058b366004615236565b6001600160a01b0316600090815260026020526040902054600160c01b900460ff1690565b6102a66105be366004615236565b6001600160a01b0316600090815260026020526040902054600160c81b900460ff1690565b6105eb611ba6565b604051610262919061558c565b61027e6106063660046155d9565b611c56565b6001546001600160a01b03166103d0565b61034761062a366004615319565b611d11565b61027e61063d366004615236565b611da0565b610347611df9565b6102a6610658366004615236565b6001600160a01b0390811660009081526002602052604090205416151590565b61027e610686366004615607565b611e0a565b610693615051565b506001600160a01b03908116600090815260026020818152604092839020835160c0810185528154958616815263ffffffff600160a01b870481168285015260ff600160c01b88048116151583880152600160c81b9097049096161515606080830191909152855180820187526001840154909716875285518087018752948301546001600160701b038082168752600160701b9182900481168787015288860196909652865180880188526003850154808816825291909104909516858501528686019490945260808101959095528351928301845260048101546001600160801b038082168552600160801b9091041691830191909152600501549181019190915260a082015290565b7f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb6107c981611e25565b81156107fa5760006107da84611e4e565b9050828160040160010160008282546107f3919061563a565b9091555050505b505050565b610807611e8b565b604080518082019091528281526020810182905261082481611eb6565b600061082f85611e4e565b8054909150600160c01b900460ff161561085c57604051637952fbad60e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff1933606090811b8216602084015287901b166034820152604881018590526068810184905260009060880160405160208183030381529060405280519060200120905060007f00000000000000000000000083e1814ba31f7ea95d216204bb45fe75ce09b14f6001600160a01b03166387ba006a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109339190615652565b90506109428288858785611edc565b60048301546001600160801b03168111156109705760405163bb55fd2760e01b815260040160405180910390fd5b600061097b8561238c565b9050604051806060016040528061098f4390565b63ffffffff1681526020018281526020016109a9836123ec565b905280516001868101805463ffffffff191663ffffffff909316929092179091556020808301518051600289018054928401516001600160701b039283166001600160e01b031994851617600160701b918416820217909155604095860151805160038c0180549290960151908416919094161792909116021790558554600160c01b60ff60c01b19909116178655905181906001600160a01b038b16907f162ed187f3ed3879ae360c5df2a0a5dcaac7a208a9d762c2cbbfb1f5fad8b81d90600090a45050505050505050565b6001600160a01b038116600090815260026020818152604080842081516060808201845260048301546001600160801b038082168452600160801b909104168286015260058301548285015283519081018452600183015463ffffffff16815283518085018552838701546001600160701b038082168352600160701b918290048116838901528388019290925285518087018752600386015480841682529190910490911695810195909552928301939093529291610b3691612446565b6002811115610b4757610b4761566b565b149392505050565b610b57611e8b565b6000610b6282611e4e565b9050610b7260008383600161255e565b5050565b610b9a60405180606001604052806000815260200160008152602001600081525090565b81610ba481612582565b6000610bb681878787600019846125a3565b9050610bc1816127e1565b60408051606080820183528351825283015160208201526080909201519082015295945050505050565b6001600160a01b038083166000908152600260209081526040808320805482516318160ddd60e01b8152925194959194610c7a94889492909316926318160ddd92600480820193918290030181865afa158015610c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c709190615652565b600584015461290c565b9150505b92915050565b610ca860405180606001604052806000815260200160008152602001600081525090565b7f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb610cd281611e25565b83610cdc81612582565b83610ce681612582565b6000610cf78a8a8a8a8a60016125a3565b9050610d028161294f565b60405180606001604052808260200151815260200182606001518152602001826080015181525094505050505095945050505050565b610d5c60405180606001604052806000815260200160008152602001600081525090565b82610d6681612a8b565b82610d7081612582565b6001600160a01b03808616600090815260026020908152604080832081516060810183526004808301546001600160801b038082168452600160801b9091041682860152600583015482850152825484516318160ddd60e01b8152945193979296959216936318160ddd93818301939290918290030181865afa158015610dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190615652565b90506000610e328883856040015161290c565b90506000610e588a8a84878960000160149054906101000a900463ffffffff1688612ab2565b905060405180606001604052808260c001518360e00151610e799190615681565b815260200182604001518360000151610e92919061563a565b8152602001600560049054906101000a900460ff16610eb2576000610eb8565b82602001515b90529a9950505050505050505050565b60007f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb610ef481611e25565b85610efe81612a8b565b84610f0881612582565b84610f1281612582565b6000610f1d89611e4e565b604080516060810182526004808401546001600160801b038082168452600160801b90910416602080840191909152600585015483850152845484516318160ddd60e01b8152945195965092946000946001600160a01b03909416936318160ddd938181019392918290030181865afa158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc29190615652565b90506000610fd58b83856040015161290c565b9050808a1115610ff857604051633494a40d60e21b815260040160405180910390fd5b600061101c8d8d8d878960000160149054906101000a900463ffffffff1688612ab2565b905061102b8f8f8f8885612d0c565b8454600160c01b900460ff1615611071576040805180820190915260048601546001600160801b038082168352600160801b9091041660208201526110719086906134df565b519e9d5050505050505050505050505050565b6110a860405180606001604052806000815260200160008152602001600081525090565b816110b281612582565b60006110c3818787876001806125a3565b90506110ce816127e1565b604051806060016040528082602001518152602001826060015181526020018260800151815250925050509392505050565b6001546001600160a01b0316331461112b57604051634ca8886760e01b815260040160405180910390fd5b600154611140906001600160a01b031661360e565b565b61114a611e8b565b600061115583611e4e565b8054909150821515600160c81b90910460ff1615150361117457505050565b805460ff60c81b1916600160c81b8315159081029190911782556040516001600160a01b038516907fa606e6917bc476eb72d24f486596af7f564fb7b50f73135c81c0e8e0553430cd90600090a3505050565b7f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb6111f181611e25565b60405163b5af090f60e01b81526001600160a01b0383811660048301527f00000000000000000000000083e1814ba31f7ea95d216204bb45fe75ce09b14f169063b5af090f90602401602060405180830381865afa158015611257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127b9190615698565b61129857604051630b094f2760e31b815260040160405180910390fd5b604051632b625f2360e01b81526001600160a01b0383811660048301526000917f0000000000000000000000009e912953db31fe933bda43374208e967058d9d5f90911690632b625f23906024016020604051808303816000875af1158015611305573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132991906156b5565b9050806001600160a01b03166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b5050505060006040518060c00160405280836001600160a01b03168152602001600560009054906101000a900463ffffffff1663ffffffff1681526020016000151581526020016001151581526020016040518060600160405280600063ffffffff1681526020016113ea613668565b81526020016113f7613668565b9052815260408051606081018252600080825260208281018290529282015291015290506114258482613691565b60408082015190516000911515906001600160a01b038716907f162ed187f3ed3879ae360c5df2a0a5dcaac7a208a9d762c2cbbfb1f5fad8b81d908490a4836001600160a01b03167fa2d66c1e2cc4b2cc5daaabc06447542e989ed748a9fb22476b6c913dcc1c7f4b600083602001516040516114b592919063ffffffff92831681529116602082015260400190565b60405180910390a280606001511515846001600160a01b03167fa606e6917bc476eb72d24f486596af7f564fb7b50f73135c81c0e8e0553430cd60405160405180910390a350505050565b8161150a81612a8b565b7f00000000000000000000000097cec0f2d355bf073619a5093f989709cae4a19161153481611e25565b61154c8461154736869003860186615865565b613691565b6115596020840184615236565b6001600160a01b03166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561159357600080fd5b505af11580156115a7573d6000803e3d6000fd5b5050505050505050565b6115b9611e8b565b806115c3816137ea565b60006115ce84611e4e565b805490915063ffffffff600160a01b909104811690841681036115f2575050505050565b815463ffffffff60a01b1916600160a01b63ffffffff86811691820292909217845560408051928416835260208301919091526001600160a01b038716917fa2d66c1e2cc4b2cc5daaabc06447542e989ed748a9fb22476b6c913dcc1c7f4b910160405180910390a25050505050565b60008260000361167457506000611731565b6001600160a01b038085166000908152600260209081526040808320805482516318160ddd60e01b81529251919516926318160ddd92600480820193918290030181865afa1580156116ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ee9190615652565b905060006116fc8287615938565b905061172b818361170d8882615681565b600587015461171c9190615938565b611726908561563a565b613814565b93505050505b9392505050565b611740611e8b565b60055460ff64010000000090910416151581151514611773576005805464ff000000001916640100000000831515021790555b50565b60007f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb6117a281611e25565b846117ac81612a8b565b836117b681612582565b60006117c187611e4e565b8054909150600160c81b900460ff166117ed576040516303a5be3f60e31b815260040160405180910390fd5b604080516060810182526004808401546001600160801b038082168452600160801b909104166020808401919091526005850154838501819052855485516318160ddd60e01b81529551949591946000946001600160a01b03909216936318160ddd9380840193919291908290030181865afa158015611871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118959190615652565b9050801580156118a457508115155b156118ba57600091506118ba8c8b86600361255e565b60006118c78a83856138e3565b90506118d38a8461563a565b600586015584546040516340c10f1960e01b81526001600160a01b038e8116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561192557600080fd5b505af1158015611939573d6000803e3d6000fd5b50506040805180820190915260028801546001600160701b038082168352600160701b909104166020820152611a0192508f91508d90889061197a90613917565b7f00000000000000000000000083e1814ba31f7ea95d216204bb45fe75ce09b14f6001600160a01b03166387ba006a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fc9190615652565b611edc565b8454600160c01b900460ff1615611a47576040805180820190915260048601546001600160801b038082168352600160801b909104166020820152611a479086906134df565b8a6001600160a01b03168c6001600160a01b03168e7fecb7e4cd1580472adaeba712b36acf94439b2e1760af55fedb61960ca4422af38d85604051611a96929190918252602082015260400190565b60405180910390a4611aea8d8c611aad848661563a565b6040805160608101825260048b01546001600160801b038082168352600160801b90910416602082015260058b0154918101919091528890613953565b9c9b505050505050505050505050565b611b1e60405180606001604052806000815260200160008152602001600081525090565b7f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb611b4881611e25565b83611b5281612582565b83611b5c81612582565b6000611b6d8a8a8a8a8a60006125a3565b9050611b788161294f565b6040805160608082018352835182528301516020820152608090920151908201529998505050505050505050565b60606000611bb460036139eb565b905060008167ffffffffffffffff811115611bd157611bd16156d2565b604051908082528060200260200182016040528015611bfa578160200160208202803683370190505b50905060005b82811015611c4f57611c136003826139f5565b828281518110611c2557611c25615957565b6001600160a01b039092166020928302919091019091015280611c478161596d565b915050611c00565b5092915050565b80611c6081612a8b565b7f00000000000000000000000097cec0f2d355bf073619a5093f989709cae4a191611c8a81611e25565b6001600160a01b0380851660009081526002602052604090205416611cae85613a01565b60405163f2fde38b60e01b81526001600160a01b03858116600483015282169063f2fde38b906024015b600060405180830381600087803b158015611cf257600080fd5b505af1158015611d06573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038083166000908152600260209081526040808320805482516318160ddd60e01b8152925194959194610c7a94889492909316926318160ddd92600480820193918290030181865afa158015611d72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d969190615652565b60058401546138e3565b611da8611e8b565b6000546001600160a01b0390811690821603611dd757604051630a98f1f360e21b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000611e0560036139eb565b905090565b611e12611e8b565b80611e1c816137ea565b610b7282613a8b565b336001600160a01b0382161461177357604051634ca8886760e01b815260040160405180910390fd5b6001600160a01b03808216600090815260026020526040812080549192909116610c7e5760405163b0ce759160e01b815260040160405180910390fd5b6000546001600160a01b0316331461114057604051634ca8886760e01b815260040160405180910390fd5b611ebf81613afc565b61177357604051636a43f8d160e01b815260040160405180910390fd5b6000611f116001600160a01b0386167f000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc373613b19565b905080600003611f345760405163bb55fd2760e01b815260040160405180910390fd5b604080516060808201835260048701546001600160801b038082168452600160801b909104166020808401919091526005880154838501528351918201845260018089015463ffffffff1683528451808601865260028a01546001600160701b038082168352600160701b91829004811683860152858501929092528651808801885260038c01548084168252919091049091169281019290925293820152909190611fe1908390612446565b6002811115611ff257611ff261566b565b03611ffe575050612385565b61200784613afc565b61201f57612018878787600261255e565b5050612385565b604051638d0c782760e01b81526001600160a01b0387811660048301526000916120bc9185917f00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca90911690638d0c782790602401602060405180830381865afa158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b49190615652565b848888613bbd565b80519091506120cd57505050612385565b602081015115806120e057506040810151155b156120fa576120f2888888600261255e565b505050612385565b81600001516001600160801b0316816020015111156121cc577f00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca6001600160a01b03166371c0feb7898985600001516001600160801b031685602001516121619190615681565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301526044820152606401600060405180830381600087803b1580156121af57600080fd5b505af11580156121c3573d6000803e3d6000fd5b5050505061229a565b81600001516001600160801b03168160200151101561229a577f00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca6001600160a01b0316631ebda06d8989846020015186600001516001600160801b03166122339190615681565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301526044820152606401600060405180830381600087803b15801561228157600080fd5b505af1158015612295573d6000803e3d6000fd5b505050505b600060405180606001604052806122b48460200151613d86565b6001600160801b031681526020016122cf8460400151613d86565b6001600160801b0390811682526040808701516020938401528351848401518316600160801b029216919091176004808c01919091558382015160058c01558a5482516318160ddd60e01b81529251949550611d06948e948e946001600160a01b03909316936318160ddd938082019391908290030181865afa15801561235a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237e9190615652565b8685613953565b5050505050565b604080518082019091526000808252602082015260006123b3836001600160701b03613df7565b9050604051806040016040528082600001516001600160701b0316815260200182602001516001600160701b0316815250915050919050565b6040805180820190915260008082526020820152604080518082019091526020838101516001600160701b03908116835284511690820181905215155b610c7e57604051630d38a7e760e11b815260040160405180910390fd5b6040805180820190915282516001600160801b039081168252602080850151909116818301528201516000919061247c82613afc565b158061248e575061248c81613e86565b155b1561249e57600092505050610c7e565b60006124a983613eb5565b60408601519091506124ba82613afc565b15806124cc57506124ca81613e86565b155b156124de576000945050505050610c7e565b4363ffffffff16866000015163ffffffff161461250e576124ff8385613eea565b925061250b8183613eea565b90505b61252361251a84613917565b85612710613f5c565b801561253f575061253f61253682613917565b83612710613f5c565b15612551576002945050505050610c7e565b5060019695505050505050565b600482015461257c908590859085906001600160801b031685613ffe565b50505050565b8060000361177357604051637c946ed760e01b815260040160405180910390fd5b612624604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600015158152602001600015158152602001600063ffffffff168152602001600080191681525090565b6001600160a01b038681167f0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c821690811491871614818015612664575080155b156126865760016101208401526001600160a01b0387166101008401526126cc565b811580156126915750805b156126b35760006101208401526001600160a01b0388166101008401526126cc565b60405163b0ce759160e01b815260040160405180910390fd5b60006126dc846101000151611e4e565b8054909150600160c01b900460ff166127085760405163bcb8b8fb60e01b815260040160405180910390fd5b61018084018a9052841580156101408601526127265786845261272e565b602084018790525b60408481018790528154600160a01b900463ffffffff16610160860152805160608101825260048301546001600160801b038082168352600160801b909104166020820152600583015491810191909152610120850151156127ac5780516001600160801b0390811660a087015260208201511660c08601526127ca565b60208101516001600160801b0390811660a087015281511660c08601525b6040015160e0850152509198975050505050505050565b6040805180820190915260008082526020820152816101400151156128525761281d8260a001518360c001518461016001518560000151614165565b8051602084018190526040840151919250101561284d5760405163f31ee7a560e01b815260040160405180910390fd5b6128a5565b61286f8260a001518360c0015184610160015185602001516141f7565b80518084529091501580612887575060408201518251115b156128a55760405163681c2ccd60e11b815260040160405180910390fd5b60208101516060830152815160a0830180516128c290839061563a565b905250602082015160c0830180516128db908390615681565b905250610120820151156129035781606001518260e0018181516128ff919061563a565b9052505b610b7282614293565b60008260000361293c57811561293557604051636a9c61e160e01b815260040160405180910390fd5b5082611731565b612947848385613814565b949350505050565b6101008101516001600160a01b0316600090815260026020908152604091829020825160608101845260048201546001600160801b038082168352600160801b90910481168285019081526005840154838701528551808701909652825182168652511692840192909252916129c69083906134df565b6129cf836127e1565b600060405180606001604052806129fd8661012001516129f3578660c00151613d86565b8660a00151613d86565b6001600160801b03168152602001612a2c866101200151612a22578660a00151613d86565b8660c00151613d86565b6001600160801b031681526020018560e001518152509050612a5a8461018001518561010001518484614393565b805160208201516001600160801b03908116600160801b029116176004840155604001516005909201919091555050565b6001600160a01b0381166117735760405163e6c4247b60e01b815260040160405180910390fd5b612aba6150a9565b60208401516000906001600160801b0316612afe6001600160a01b038a167f000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc373613b19565b612b089190615681565b90506000612c0286600001516001600160801b031687602001516001600160801b0316848960400151612b6d7f000000000000000000000000fd31662b3d54edde9b6bdd32c9c27c8e292cad578f6001600160a01b0316613b1990919063ffffffff16565b8a63ffffffff167f00000000000000000000000083e1814ba31f7ea95d216204bb45fe75ce09b14f6001600160a01b0316632aac012c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf69190615986565b63ffffffff168e6144b7565b905060405180610180016040528082606001518152602001826080015181526020018260a0015181526020018260400151815260200182600001518152602001826020015181526020018260c001518152602001888152602001898152602001858152602001826040015160200151612c98576040830151516020890151612c9391906001600160801b031661563a565b612cb6565b6040830151516020890151612cb691906001600160801b0316615681565b8152602001826000015160200151612ce5578251518851612ce091906001600160801b031661563a565b612cfd565b8251518851612cfd91906001600160801b0316615681565b90529998505050505050505050565b60408051606080820183526004850180546001600160801b038082168552600160801b909104166020808501919091526005870154848601528451928301855260018088015463ffffffff1684528551808701875260028901546001600160701b038082168352600160701b91829004811683860152868501929092528751808901895260038b0154808416825291909104909116928101929092529483015292612db78383612446565b6002811115612dc857612dc861566b565b03612de6576040516301a6272960e41b815260040160405180910390fd5b8454610100850151604051630852cd8d60e31b81526001600160a01b03909216916342966c6891612e1d9160040190815260200190565b600060405180830381600087803b158015612e3757600080fd5b505af1158015612e4b573d6000803e3d6000fd5b505050506000846101000151856101200151612e679190615681565b9050612e7d846001015482876101200151613814565b6001850155610140850151612e9190613d86565b84546001600160801b03918216600160801b029116178455610160850151612eb890613d86565b84546fffffffffffffffffffffffffffffffff19166001600160801b039190911617845560a08501515115612f94578460a0015160200151612efc57612efc6159a3565b60a085015151604051631ebda06d60e01b8152600481018b90526001600160a01b03898116602483015260448201929092527f00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca90911690631ebda06d906064015b600060405180830381600087803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b505050506130ba565b608085015151156130ba578460800151602001511561300157608085015151604051631538c64b60e31b815260048101919091527f00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca6001600160a01b03169063a9c6325890602401612f5d565b6080850151516040516340c10f1960e01b81526001600160a01b037f00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca16916340c10f1991613087917f000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc373916004016001600160a01b03929092168252602082015260400190565b600060405180830381600087803b1580156130a157600080fd5b505af11580156130b5573d6000803e3d6000fd5b505050505b600554602086015164010000000090910460ff1690158015906130da5750805b1561316a5760208601516040516340c10f1960e01b81526001600160a01b038b8116600483015260248201929092527f00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca909116906340c10f1990604401600060405180830381600087803b15801561315157600080fd5b505af1158015613165573d6000803e3d6000fd5b505050505b604086015115613240576040868101519051631c20fadd60e01b81526001600160a01b038a811660048301527f000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc3738116602483015260448201929092527f000000000000000000000000fd31662b3d54edde9b6bdd32c9c27c8e292cad5790911690631c20fadd90606401600060405180830381600087803b15801561320e57600080fd5b505af1158015613222573d6000803e3d6000fd5b5050505085604001518660000181815161323c919061563a565b9052505b8551156132d7578551604051631c20fadd60e01b81526001600160a01b038a811660048301528b8116602483015260448201929092527f000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc37390911690631c20fadd90606401600060405180830381600087803b1580156132be57600080fd5b505af11580156132d2573d6000803e3d6000fd5b505050505b856101400151600003613363576132ec613668565b80516002890180546020909301516001600160701b03908116600160701b026001600160e01b031990941692169190911791909117905561332b613668565b80516003890180546020909301516001600160701b03908116600160701b026001600160e01b03199094169216919091179190911790555b7f00000000000000000000000083e1814ba31f7ea95d216204bb45fe75ce09b14f6001600160a01b03166387ba006a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e59190615652565b8661016001511015613404576134048a89898961016001516002613ffe565b876001600160a01b0316896001600160a01b03168b7feab8ac9e9478a4b3c37a794ecef629b8a8bbcd96f9eaeac8ed26054d144da52d89600001518a61010001518b604001518761345657600061345c565b8c602001515b60c08e0151604080519586526020860194909452928401919091526060830152608082015260a00160405180910390a46040805160608101825260048901546001600160801b038082168352600160801b9091041660208201526005890154918101919091526134d3908b908a9085908890613953565b50505050505050505050565b6001820154439063ffffffff8083169116146107fa576040805160608101825263ffffffff83168152815180830190925260028501546001600160701b038082168452600160701b909104166020838101919091529091908201906135449085613eea565b81526040805180820190915260038601546001600160701b038082168352600160701b909104166020828101919091529091019061358a9061358586613eb5565b613eea565b9052805160018501805463ffffffff191663ffffffff9092169190911790556020808201518051600287018054928401516001600160701b039283166001600160e01b031994851617600160701b91841682021790915560409094015180516003909801805491909401519782169216919091179516909102939093179092555050565b600080546001600160a01b038381166001600160a01b031980841682178555600180549091169055604051919092169283917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a9190a35050565b604080518082018252600080825260209182018190528251808401909352825260019082015290565b61369c600383614739565b6136b95760405163119b4fd360e11b815260040160405180910390fd5b6001600160a01b039182166000908152600260208181526040928390208451815486840151878701516060890151939099166001600160c01b031990921691909117600160a01b63ffffffff928316021761ffff60c01b1916600160c01b9815159890980260ff60c81b191697909717600160c81b911515919091021781556080850151805160018301805463ffffffff191691909816179096558582015180519382018054918401516001600160701b039586166001600160e01b031993841617600160701b91871682021790915596850151805160038401805492860151918716929093169190911794169096029290921790945560a0909201518051938101516001600160801b03948516600160801b95909116949094029390931760048301559190910151600590910155565b620f424063ffffffff82161115611773576040516358d620b360e01b815260040160405180910390fd5b600080613821858561474e565b80519091506000036138455782816020015161383d91906159cf565b915050611731565b8051831161386657604051631a93c68960e11b815260040160405180910390fd5b60006138738686866147d5565b9050600061388183836147f0565b80519091506000036138a75784816020015161389d91906159cf565b9350505050611731565b60008581038616906138b98383614875565b905060006138cf6138ca848a6159cf565b6148ac565b90508181025b9a9950505050505050505050565b60008260000361390c57811561293557604051636a9c61e160e01b815260040160405180910390fd5b6129478484846148d7565b6040805180820182526000808252602091820152815180830190925282516001600160701b039081168352928101519092169181019190915290565b61395f85858484614393565b8160400151816040015114612385576001600160a01b038416857f67c4863f17da9847c57c9fa043e63a0ddf4f5a86fd63a6f71ea69057a11c411a6139c4837f000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc373613b19565b60408086015181519283526020830152810187905260600160405180910390a35050505050565b6000610c7e825490565b60006117318383614927565b613a0c600382614951565b613a295760405163b0ce759160e01b815260040160405180910390fd5b6001600160a01b03166000908152600260208190526040822080546001600160d01b031916815560018101805463ffffffff1916905590810180546001600160e01b031990811690915560038201805490911690556004810182905560050155565b60055463ffffffff9081169082168103613aa3575050565b6005805463ffffffff191663ffffffff84811691821790925560408051928416835260208301919091527fb804b0ec3f0ea43004870df377170ce44cb789adca16d23286e337605558117f910160405180910390a15050565b6000613b0b8260200151151590565b8015610c7e57505051151590565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03841603613b5057506001600160a01b03811631610c7e565b826040516370a0823160e01b81526001600160a01b03848116600483015291909116906370a0823190602401602060405180830381865afa158015613b99573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190615652565b613be3604051806060016040528060001515815260200160008152602001600081525090565b600084602001516001600160801b031687613bfe9190615681565b90506000613c1e613c188387600001518860200151613814565b88614966565b905060008187600001516001600160801b0316613c3b919061563a565b905084811015613c6f5760405180606001604052806001151581526020016000815260200160008152509350505050613d7d565b86516001600160801b0316600003613cca576000613c8e600287615938565b905081811115613cc3576040518060600160405280600015158152602001600081526020016000815250945050505050613d7d565b9050613d01565b86516001600160801b03168110613d0157613cfe81600289600001516001600160801b0316613cf99190615938565b614966565b90505b8651600090613d19906001600160801b031683615681565b905060008115613d3b57613d368289602001518a60000151613814565b613d3e565b60005b90506040518060600160405280600115158152602001848152602001828b602001516001600160801b0316613d73919061563a565b9052955050505050505b95945050505050565b60006001600160801b03821115613df35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b606482015260840160405180910390fd5b5090565b60408051808201909152600080825260208201526000613e28613e228560000151866020015161497c565b8461498c565b905060006040518060400160405280838760000151613e4791906159cf565b8152602001838760200151613e5c91906159cf565b81525090508060200151600003610c7a57604051630d38a7e760e11b815260040160405180910390fd5b6000613e9e82602001516001600160701b0316151590565b8015610c7e575050516001600160701b0316151590565b604080518082019091526000808252602082015260408051808201909152602083810151825283519082018190521515612429565b604080518082019091526000808252602082015282516020830151613f18916001600160701b031690615938565b60208401518351613f32916001600160701b031690615938565b03613f3e575081610c7e565b611731613f57613f4d85613917565b84600460016149be565b61238c565b82516000908190613f8e90613f7485620f42406159e3565b63ffffffff168660200151613f899190615938565b61474e565b90506000613fb38660200151620f424063ffffffff168760000151613f899190615938565b8651909150600090613fe190613fcc87620f4240615a08565b63ffffffff168860200151613f899190615938565b9050613fed8383614a5a565b801561172b575061172b8282614a5a565b600060048401819055604080516060810190915290815260208101614021613668565b815260200161402e613668565b9052805160018501805463ffffffff191663ffffffff9092169190911790556020808201518051600287018054928401516001600160701b039283166001600160e01b031994851617600160701b91841682021790915560409094015180516003890180549290950151908316919093161791169092029190911790558254600160c01b900460ff161561410357825460ff60c01b1916835560405160ff8216906000906001600160a01b038716907f162ed187f3ed3879ae360c5df2a0a5dcaac7a208a9d762c2cbbfb1f5fad8b81d908390a45b811561238557604051631ebda06d60e01b8152600481018690526001600160a01b038581166024830152604482018490527f00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca1690631ebda06d90606401611cd8565b6040805180820190915260008082526020820152841580614184575083155b156141a25760405163bb55fd2760e01b815260040160405180910390fd5b60006141b38584611726818a61563a565b905060006141cb8263ffffffff8716620f4240613814565b9050604051806040016040528082846141e49190615681565b8152602001919091529695505050505050565b60408051808201909152600080825260208201528460000361422c5760405163bb55fd2760e01b815260040160405180910390fd5b60006142518363ffffffff861661424687620f42406159e3565b63ffffffff16613814565b9050600061425f828561563a565b905060006142728883611726818b615681565b60408051808201909152908152602081019390935250909695505050505050565b7f00000000000000000000000000000000000000000000000000000000000249f063ffffffff166000036142c45750565b600061430482606001517f00000000000000000000000000000000000000000000000000000000000249f063ffffffff16620f424063ffffffff16613814565b9050808260c0018181516143189190615681565b90525061012082015161432d57608090910152565b6143428260c001518360a00151600084614165565b51608083015260c08201805182919061435c90839061563a565b905250608082015160a083018051614375908390615681565b90525060e08201805182919061438c908390615681565b9052505050565b815181516001600160801b039081169116146144255781518151604080516001600160801b0393841681529290911660208301526001600160a01b037f0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c8116929086169187917f6e96dc5343d067ec486a9920e0304c3610ed05c65e45cc029d9b9fe7ecfa7620910160405180910390a45b81602001516001600160801b031681602001516001600160801b03161461257c57826001600160a01b0316836001600160a01b0316857f6e96dc5343d067ec486a9920e0304c3610ed05c65e45cc029d9b9fe7ecfa7620856020015185602001516040516144a99291906001600160801b0392831681529116602082015260400190565b60405180910390a450505050565b6144bf615161565b6001600160801b038911806144da57506001600160801b0388115b806144eb57506001600160801b0387115b806144fc57506001600160801b0386115b8061450d57506001600160801b0385115b8061451a5750620f424084115b806145275750620f424083115b8061453157508582115b1561454f576040516318b103bd60e21b815260040160405180910390fd5b6000620f424061455f8582615681565b6145699085615938565b61457391906159cf565b905061457f888a61563a565b620f424061458d8682615681565b614597908a615938565b6145a191906159cf565b11156146a25760006145b3898b61563a565b620f42406145c18782615681565b6145cb908b615938565b6145d591906159cf565b6145df9190615681565b905060006145ed8a8c61563a565b6145f7908a615681565b90506146058b8b8b88614a6e565b801561461b575061461b8b8a84848b8b8b614a98565b156146365761462f8c8c8b858b8a89614afa565b935061469b565b8b15614668576146498c8c8c8c87614bd3565b93506146598c8c8b84878d614c54565b60a0860152608085015261469b565b886146738b85615938565b61467d91906159cf565b60608501526146908c8c8b84878d614c54565b60a086015260808501525b505061471d565b60006146b76146b18a8c61563a565b89614cc9565b90506000811180156146d057506146d08a8a8a87614a6e565b80156146e557506146e58a8983898989614ce3565b15614701576146fa8b8b8a848a8a8a89614d6d565b925061471b565b8a15614713576146fa8b8b8b85614e1b565b606083018290525b505b6147278184615681565b60c08301525098975050505050505050565b6000611731836001600160a01b038416614e8c565b6040805180820190915260008082526020820152600061476e8484614edb565b90508383028082106147a357604051806040016040528082846147919190615681565b81526020018281525092505050610c7e565b604051806040016040528060016147ba8585900390565b6147c49190615681565b815260200191909152949350505050565b600081806147e5576147e56159b9565b838509949350505050565b60408051808201909152600080825260208201528183602001511061483d576040518060400160405280846000015181526020018385602001516148349190615681565b90529050610c7e565b6040518060400160405280600185600001516148599190615681565b815260200161486c856020015185900390565b90529392505050565b60008061488d614887848084036159cf565b60010190565b905082846020015161489f91906159cf565b8451820217949350505050565b60006001815b6008811015611c4f5783820260020382029150806148cf8161596d565b9150506148b2565b6000806148e5858585613814565b905060006148f48686866147d5565b111561294757600019811061491c57604051631a93c68960e11b815260040160405180910390fd5b61383d81600161563a565b600082600001828154811061493e5761493e615957565b9060005260206000200154905092915050565b6000611731836001600160a01b038416614eea565b60008183106149755781611731565b5090919050565b6000818310156149755781611731565b60006149988284615a30565b156149a45760016149a7565b60005b60ff166149b483856159cf565b611731919061563a565b6040805180820190915260008082526020820152604051806040016040528083866000015188602001516149f29190615938565b6149fc9190615938565b602087015188518791614a0e91615938565b614a189190615938565b614a22919061563a565b8152602001614a31848661563a565b86602001518860200151614a459190615938565b614a4f9190615938565b905295945050505050565b6000614a668383614fdd565b159392505050565b6000614a7a8284615681565b614a849085615938565b614a8e8387615938565b1095945050505050565b600080614ac6614aa8898b615938565b614ab2868b615938565b614abc888b615938565b613f89919061563a565b90506000614aee614ad7858a615938565b614ae488620f4240615681565b613f89908a615938565b90506138d58282614fdd565b614b02615161565b6000614b1185620f4240615681565b614b1b9087615938565b90506000614b3989614b30620f42408b615938565b87856001615005565b9050614b7e614b52614b4b878d615938565b8484613814565b604080518082019091526000808252602082015250604080518082019091529081526000602082015290565b8352614bba614b8e86898b613814565b604080518082019091526000808252602082015250604080518082019091529081526001602082015290565b6040840152505060608101919091529695505050505050565b614bdb615161565b6000614c03614bea8785615938565b614bf48587615681565b614bfe9088615938565b614cc9565b9050614c17614b8e8883611726888b615938565b8083526020830152614c2c614b8e85836159cf565b6040830152614c4583614c3f878961563a565b86613814565b60608301525095945050505050565b60008080614c628686615938565b90506000614c708886615938565b905080821115614cab5760008a11614c89576000614ca1565b614ca18a614c978385615681565b6117268b8d615938565b9350849250614cbc565b60009350614cb988836159cf565b92505b5050965096945050505050565b6000818311614cd9576000611731565b6117318284615681565b600080614d1f614cf3888a615938565b620f4240614d01878b615938565b614d0b898b615938565b614d15919061563a565b613f899190615938565b90506000614d54614d308589615938565b614d3d88620f4240615681565b614d47888c615938565b614d0b620f42408c615938565b9050614d608282614fdd565b9998505050505050505050565b614d75615161565b6000614d818589615938565b614d8e620f424089615938565b614d98919061563a565b90506000614dd88a614dad89620f4240615681565b614db7908c615938565b87614dc58b620f4240615681565b614dcf9087615938565b620f4240615030565b9050614dea614b8e614b4b878e615938565b8352614e01614b528684611726620f42408e615938565b604084015250506060810191909152979650505050505050565b614e23615161565b6000614e2f8385614cc9565b9050614e3f614b8e878388613814565b8083526020830152614e7781604080518082019091526000808252602082015250604080518082019091529081526001602082015290565b60408301525060608101919091529392505050565b6000818152600183016020526040812054614ed357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c7e565b506000610c7e565b60006000198284099392505050565b60008181526001830160205260408120548015614fd3576000614f0e600183615681565b8554909150600090614f2290600190615681565b9050818114614f87576000866000018281548110614f4257614f42615957565b9060005260206000200154905080876000018481548110614f6557614f65615957565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614f9857614f98615a44565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c7e565b6000915050610c7e565b8051825160009110806117315750815183511480156117315750506020908101519101511190565b6000615012848484613814565b61501c8688615938565b6150269190615681565b9695505050505050565b600061503d848484613814565b6150478688615938565b615026919061563a565b6040805160c0810182526000808252602082018190529181018290526060810191909152608081016150816151d0565b815260408051606081018252600080825260208281018290529282015291015290565b905290565b6040518061018001604052806000815260200160008152602001600081526020016150e96040518060400160405280600081526020016000151581525090565b815260200161510d6040518060400160405280600081526020016000151581525090565b81526020016151316040518060400160405280600081526020016000151581525090565b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805161012081018252600060e082018181526101008301829052825282518084018452818152602080820183905280840191909152835180850185528281529081019190915290918201908152602001600081526020016000815260200160008152602001600081525090565b6040518060600160405280600063ffffffff168152602001615202604080518082019091526000808252602082015290565b81526020016150a4604080518082019091526000808252602082015290565b6001600160a01b038116811461177357600080fd5b60006020828403121561524857600080fd5b813561173181615221565b81516001600160a01b0316815260208083015163ffffffff908116828401526040808501511515908401526060808501511515908401526080808501518051909216908401528082015180516001600160701b0390811660a08601529281015190921660c0840152610180830191506040015180516001600160701b0390811660e08501526020820151166101008401525060a083015180516001600160801b039081166101208501526020820151166101408401526040810151610160840152611c4f565b6000806040838503121561532c57600080fd5b823561533781615221565b946020939093013593505050565b60008060006060848603121561535a57600080fd5b833561536581615221565b95602085013595506040909401359392505050565b60008060006060848603121561538f57600080fd5b833561539a81615221565b925060208401356153aa81615221565b929592945050506040919091013590565b81518152602080830151908201526040808301519082015260608101610c7e565b600080600080600060a086880312156153f457600080fd5b85359450602086013561540681615221565b9350604086013561541681615221565b94979396509394606081013594506080013592915050565b801515811461177357600080fd5b6000806040838503121561544f57600080fd5b823561545a81615221565b9150602083013561546a8161542e565b809150509250929050565b6000808284036101a081121561548a57600080fd5b833561549581615221565b9250610180601f19820112156154aa57600080fd5b506020830190509250929050565b63ffffffff8116811461177357600080fd5b600080604083850312156154dd57600080fd5b82356154e881615221565b9150602083013561546a816154b8565b60006020828403121561550a57600080fd5b81356117318161542e565b6000806000806080858703121561552b57600080fd5b84359350602085013561553d81615221565b9250604085013561554d81615221565b9396929550929360600135925050565b81516001600160801b039081168252602080840151909116908201526040808301519082015260608101610c7e565b6020808252825182820181905260009190848201906040850190845b818110156155cd5783516001600160a01b0316835292840192918401916001016155a8565b50909695505050505050565b600080604083850312156155ec57600080fd5b82356155f781615221565b9150602083013561546a81615221565b60006020828403121561561957600080fd5b8135611731816154b8565b634e487b7160e01b600052601160045260246000fd5b6000821982111561564d5761564d615624565b500190565b60006020828403121561566457600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b60008282101561569357615693615624565b500390565b6000602082840312156156aa57600080fd5b81516117318161542e565b6000602082840312156156c757600080fd5b815161173181615221565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561571957634e487b7160e01b600052604160045260246000fd5b60405290565b6040516060810167ffffffffffffffff8111828210171561571957634e487b7160e01b600052604160045260246000fd5b80356001600160701b038116811461576757600080fd5b919050565b60006040828403121561577e57600080fd5b6040516040810181811067ffffffffffffffff821117156157af57634e487b7160e01b600052604160045260246000fd5b6040529050806157be83615750565b81526157cc60208401615750565b60208201525092915050565b80356001600160801b038116811461576757600080fd5b60006060828403121561580157600080fd5b6040516060810181811067ffffffffffffffff8211171561583257634e487b7160e01b600052604160045260246000fd5b604052905080615841836157d8565b815261584f602084016157d8565b6020820152604083013560408201525092915050565b600081830361018081121561587957600080fd5b6158816156e8565b833561588c81615221565b8152602084013561589c816154b8565b602082015260408401356158af8161542e565b604082015260608401356158c28161542e565b606082015260a0607f19830112156158d957600080fd5b6158e161571f565b915060808401356158f1816154b8565b82526159008560a0860161576c565b60208301526159128560e0860161576c565b604083015281608082015261592b8561012086016157ef565b60a0820152949350505050565b600081600019048311821515161561595257615952615624565b500290565b634e487b7160e01b600052603260045260246000fd5b60006001820161597f5761597f615624565b5060010190565b60006020828403121561599857600080fd5b8151611731816154b8565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826159de576159de6159b9565b500490565b600063ffffffff83811690831681811015615a0057615a00615624565b039392505050565b600063ffffffff808316818516808303821115615a2757615a27615624565b01949350505050565b600082615a3f57615a3f6159b9565b500690565b634e487b7160e01b600052603160045260246000fdfea164736f6c634300080d000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c00000000000000000000000083e1814ba31f7ea95d216204bb45fe75ce09b14f000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc37300000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca000000000000000000000000fd31662b3d54edde9b6bdd32c9c27c8e292cad570000000000000000000000009e912953db31fe933bda43374208e967058d9d5f00000000000000000000000097cec0f2d355bf073619a5093f989709cae4a19100000000000000000000000000000000000000000000000000000000000249f0
-----Decoded View---------------
Arg [0] : initNetwork (address): 0xeEF417e1D5CC832e619ae18D2F140De2999dD4fB
Arg [1] : initBNT (address): 0x1F573D6Fb3F13d689FF844B4cE37794d79a7FF1C
Arg [2] : initNetworkSettings (address): 0x83E1814ba31F7ea95D216204BB45FE75Ce09b14F
Arg [3] : initMasterVault (address): 0x649765821D9f64198c905eC0B2B037a4a52Bc373
Arg [4] : initBNTPool (address): 0x02651E355D26f3506C1E644bA393FDD9Ac95EaCa
Arg [5] : initExternalProtectionVault (address): 0xFd31662b3d54eddE9B6Bdd32c9c27C8E292cAD57
Arg [6] : initPoolTokenFactory (address): 0x9E912953DB31fE933BDa43374208E967058D9d5F
Arg [7] : initPoolMigrator (address): 0x97CeC0F2D355BF073619A5093F989709caE4a191
Arg [8] : initNetworkFeePPM (uint32): 150000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb
Arg [1] : 0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c
Arg [2] : 00000000000000000000000083e1814ba31f7ea95d216204bb45fe75ce09b14f
Arg [3] : 000000000000000000000000649765821d9f64198c905ec0b2b037a4a52bc373
Arg [4] : 00000000000000000000000002651e355d26f3506c1e644ba393fdd9ac95eaca
Arg [5] : 000000000000000000000000fd31662b3d54edde9b6bdd32c9c27c8e292cad57
Arg [6] : 0000000000000000000000009e912953db31fe933bda43374208e967058d9d5f
Arg [7] : 00000000000000000000000097cec0f2d355bf073619a5093f989709cae4a191
Arg [8] : 00000000000000000000000000000000000000000000000000000000000249f0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.