ETH Price: $2,190.94 (+1.92%)

Contract

0x05E29F07B9710368A1D5658750e9B4B478c15bB8
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
Age
From
To
Transfer Ownersh...149928152022-06-19 20:52:23993 days ago1655671943IN
0x05E29F07...478c15bB8
0 ETH0.0028809462.25041251

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

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 38 : PoolCollection.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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-ignore
import {
Utils,
AlreadyExists,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 38 : IAccessControlEnumerableUpgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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);
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 38 : IAccessControlUpgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 38 : ERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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}.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 38 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 38 : IERC20Metadata.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 38 : draft-IERC20Permit.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 38 : SafeERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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));
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 38 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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
* ====
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 38 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 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;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 38 : Math.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 38 : SafeCast.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 38 : EnumerableSet.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 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;
* }
* ```
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 38 : IBancorNetwork.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 38 : INetworkSettings.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 event
uint256 burnRewardMaxAmount;
}
/**
* @dev Network Settings interface
*/
interface INetworkSettings is IUpgradeable {
/**
* @dev returns the protected tokens whitelist
*/
function protectedTokenWhitelist() external view returns (Token[] memory);
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 38 : PoolCollectionWithdrawal.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 38 : IBNTPool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 tokens
bytes32 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 BNT
bytes32 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 vault
bytes32 constant ROLE_VAULT_MANAGER = keccak256("ROLE_VAULT_MANAGER");
// the funding manager role is required to request or renounce funding from the BNT pool
bytes32 constant ROLE_FUNDING_MANAGER = keccak256("ROLE_FUNDING_MANAGER");
/**
* @dev BNT Pool interface
*/
interface IBNTPool is IVault {
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 38 : IPoolCollection.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 liquidity
uint128 baseTokenTradingLiquidity; // the base token trading liquidity
uint256 stakedBalance; // the staked balance
}
struct AverageRates {
uint32 blockNumber;
Fraction112 rate;
Fraction112 invRate;
}
struct Pool {
IPoolToken poolToken; // the pool token of the pool
uint32 tradingFeePPM; // the trading fee (in units of PPM)
bool tradingEnabled; // whether trading is enabled
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 19 of 38 : IPoolMigrator.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 20 of 38 : IPoolToken.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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:
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 38 : IPoolTokenFactory.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 38 : SafeERC20Ex.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 38 : Token.sol
1
2
3
4
5
6
7
8
9
10
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 {
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 38 : TokenLibrary.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 reserve
address private constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
// the symbol that represents the native token
string private constant NATIVE_TOKEN_SYMBOL = "ETH";
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 38 : IERC20Burnable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 26 of 38 : BlockNumber.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 27 of 38 : Constants.sol
1
2
3
4
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity 0.8.13;
uint32 constant PPM_RESOLUTION = 1_000_000;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 28 of 38 : Fraction.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity 0.8.13;
struct Fraction {
uint256 n;
uint256 d;
}
struct Fraction112 {
uint112 n;
uint112 d;
}
error InvalidFraction();
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 29 of 38 : FractionLibrary.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity 0.8.13;
import { Fraction, Fraction112, InvalidFraction } from "./Fraction.sol";
import { MathEx } from "./MathEx.sol";
// solhint-disable-next-line func-visibility
function zeroFraction() pure returns (Fraction memory) {
return Fraction({ n: 0, d: 1 });
}
// solhint-disable-next-line func-visibility
function 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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 30 of 38 : MathEx.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 bits
uint256 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();
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 38 : Owned.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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() {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 38 : Utils.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 only
modifier only(address caller) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 33 of 38 : IOwned.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 34 of 38 : IUpgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 {
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 35 of 38 : IVersioned.sol
1
2
3
4
5
6
7
8
9
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity 0.8.13;
/**
* @dev an interface for a versioned contract
*/
interface IVersioned {
function version() external view returns (uint16);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 36 of 38 : IExternalProtectionVault.sol
1
2
3
4
5
6
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity 0.8.13;
import { IVault } from "./IVault.sol";
interface IExternalProtectionVault is IVault {}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 37 of 38 : IMasterVault.sol
1
2
3
4
5
6
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity 0.8.13;
import { IVault } from "./IVault.sol";
interface IMasterVault is IVault {}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 38 of 38 : IVault.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma 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 funds
bytes32 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

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"}]

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


Block Age Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Age Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Age Amount
View All Withdrawals

Transaction Hash Block Age Value Eth2 PubKey Valid
View All Deposits
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.