Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SmartTreasuryBootstrap
Compiler Version
v0.6.8+commit.0bbfe453
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-01-28
*/
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: @openzeppelin/contracts/utils/EnumerableSet.sol
pragma solidity >=0.6.0 <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;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(value)));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint256(_at(set._inner, index)));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity >=0.6.0 <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 GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// File: contracts/interfaces/ISmartTreasuryBootstrap.sol
pragma solidity >=0.6.0 <=0.7.5;
interface ISmartTreasuryBootstrap {
function swap(uint256[] calldata minBalances) external; // Exchange fees + IDLE if required for ETH
function initialise() external;
function bootstrap() external; // Create smart treasury pool, using parameters from spec and call begin updating weights
function renounce() external; // transfer ownership to governance.
}
// File: contracts/interfaces/BalancerInterface.sol
pragma solidity = 0.6.8;
pragma experimental ABIEncoderV2;
interface BPool {
event LOG_SWAP(
address indexed caller,
address indexed tokenIn,
address indexed tokenOut,
uint256 tokenAmountIn,
uint256 tokenAmountOut
);
event LOG_JOIN(
address indexed caller,
address indexed tokenIn,
uint256 tokenAmountIn
);
event LOG_EXIT(
address indexed caller,
address indexed tokenOut,
uint256 tokenAmountOut
);
event LOG_CALL(
bytes4 indexed sig,
address indexed caller,
bytes data
) anonymous;
function isPublicSwap() external view returns (bool);
function isFinalized() external view returns (bool);
function isBound(address t) external view returns (bool);
function getNumTokens() external view returns (uint);
function getCurrentTokens() external view returns (address[] memory tokens);
function getFinalTokens() external view returns (address[] memory tokens);
function getDenormalizedWeight(address token) external view returns (uint);
function getTotalDenormalizedWeight() external view returns (uint);
function getNormalizedWeight(address token) external view returns (uint);
function getBalance(address token) external view returns (uint);
function getSwapFee() external view returns (uint);
function getController() external view returns (address);
function setSwapFee(uint swapFee) external;
function setController(address manager) external;
function setPublicSwap(bool public_) external;
function finalize() external;
function bind(address token, uint balance, uint denorm) external;
function unbind(address token) external;
function gulp(address token) external;
function getSpotPrice(address tokenIn, address tokenOut) external view returns (uint spotPrice);
function getSpotPriceSansFee(address tokenIn, address tokenOut) external view returns (uint spotPrice);
function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external;
function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external;
function swapExactAmountIn(
address tokenIn,
uint tokenAmountIn,
address tokenOut,
uint minAmountOut,
uint maxPrice
) external returns (uint tokenAmountOut, uint spotPriceAfter);
function swapExactAmountOut(
address tokenIn,
uint maxAmountIn,
address tokenOut,
uint tokenAmountOut,
uint maxPrice
) external returns (uint tokenAmountIn, uint spotPriceAfter);
function joinswapExternAmountIn(
address tokenIn,
uint tokenAmountIn,
uint minPoolAmountOut
) external returns (uint poolAmountOut);
function joinswapPoolAmountOut(
address tokenIn,
uint poolAmountOut,
uint maxAmountIn
) external returns (uint tokenAmountIn);
function exitswapPoolAmountIn(
address tokenOut,
uint poolAmountIn,
uint minAmountOut
) external returns (uint tokenAmountOut);
function exitswapExternAmountOut(
address tokenOut,
uint tokenAmountOut,
uint maxPoolAmountIn
) external returns (uint poolAmountIn);
function totalSupply() external view returns (uint);
function balanceOf(address whom) external view returns (uint);
function allowance(address src, address dst) external view returns (uint);
function approve(address dst, uint amt) external returns (bool);
function transfer(address dst, uint amt) external returns (bool);
function transferFrom(
address src, address dst, uint amt
) external returns (bool);
}
interface ConfigurableRightsPool {
event LogCall(
bytes4 indexed sig,
address indexed caller,
bytes data
) anonymous;
event LogJoin(
address indexed caller,
address indexed tokenIn,
uint tokenAmountIn
);
event LogExit(
address indexed caller,
address indexed tokenOut,
uint tokenAmountOut
);
event CapChanged(
address indexed caller,
uint oldCap,
uint newCap
);
event NewTokenCommitted(
address indexed token,
address indexed pool,
address indexed caller
);
function createPool(
uint initialSupply
// uint minimumWeightChangeBlockPeriodParam,
// uint addTokenTimeLockInBlocksParam
) external;
function createPool(
uint initialSupply,
uint minimumWeightChangeBlockPeriodParam,
uint addTokenTimeLockInBlocksParam
) external;
function updateWeightsGradually(
uint[] calldata newWeights,
uint startBlock,
uint endBlock
) external;
function joinswapExternAmountIn(
address tokenIn,
uint tokenAmountIn,
uint minPoolAmountOut
) external;
function whitelistLiquidityProvider(address provider) external;
function removeWhitelistedLiquidityProvider(address provider) external;
function canProvideLiquidity(address provider) external returns (bool);
function getController() external view returns (address);
function setController(address newOwner) external;
function transfer(address recipient, uint amount) external returns (bool);
function balanceOf(address account) external returns (uint);
function totalSupply() external returns (uint);
function bPool() external view returns (BPool);
function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external;
}
interface IBFactory {
event LOG_NEW_POOL(
address indexed caller,
address indexed pool
);
event LOG_BLABS(
address indexed caller,
address indexed blabs
);
function isBPool(address b) external view returns (bool);
function newBPool() external returns (BPool);
}
interface ICRPFactory {
event LogNewCrp(
address indexed caller,
address indexed pool
);
struct PoolParams {
// Balancer Pool Token (representing shares of the pool)
string poolTokenSymbol;
string poolTokenName;
// Tokens inside the Pool
address[] constituentTokens;
uint[] tokenBalances;
uint[] tokenWeights;
uint swapFee;
}
struct Rights {
bool canPauseSwapping;
bool canChangeSwapFee;
bool canChangeWeights;
bool canAddRemoveTokens;
bool canWhitelistLPs;
bool canChangeCap;
}
function newCrp(
address factoryAddress,
PoolParams calldata poolParams,
Rights calldata rights
) external returns (ConfigurableRightsPool);
}
// File: contracts/libraries/BalancerConstants.sol
pragma solidity = 0.6.8;
/**
* @author Balancer Labs
* @title Put all the constants in one place
*/
library BalancerConstants {
// State variables (must be constant in a library)
// B "ONE" - all math is in the "realm" of 10 ** 18;
// where numeric 1 = 10 ** 18
uint public constant BONE = 10**18;
uint public constant MIN_WEIGHT = BONE;
uint public constant MAX_WEIGHT = BONE * 50;
uint public constant MAX_TOTAL_WEIGHT = BONE * 50;
uint public constant MIN_BALANCE = BONE / 10**6;
uint public constant MAX_BALANCE = BONE * 10**12;
uint public constant MIN_POOL_SUPPLY = BONE * 100;
uint public constant MAX_POOL_SUPPLY = BONE * 10**9;
uint public constant MIN_FEE = BONE / 10**6;
uint public constant MAX_FEE = BONE / 10;
// EXIT_FEE must always be zero, or ConfigurableRightsPool._pushUnderlying will fail
uint public constant EXIT_FEE = 0;
uint public constant MAX_IN_RATIO = BONE / 2;
uint public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei;
// Must match BConst.MIN_BOUND_TOKENS and BConst.MAX_BOUND_TOKENS
uint public constant MIN_ASSET_LIMIT = 2;
uint public constant MAX_ASSET_LIMIT = 8;
uint public constant MAX_UINT = uint(-1);
}
// File: contracts/SmartTreasuryBootstrap.sol
pragma solidity = 0.6.8;
/**
@author Asaf Silman
@notice Smart contract for initialising the idle smart treasury
*/
contract SmartTreasuryBootstrap is ISmartTreasuryBootstrap, Ownable {
using EnumerableSet for EnumerableSet.AddressSet;
using SafeERC20 for IERC20;
using SafeMath for uint256;
address public immutable timelock;
address public immutable feeCollectorAddress;
address private crpaddress;
uint256 private idlePerWeth; // internal price oracle for IDLE
enum ContractState { DEPLOYED, SWAPPED, INITIALISED, BOOTSTRAPPED, RENOUNCED }
ContractState private contractState;
IBFactory private immutable balancer_bfactory;
ICRPFactory private immutable balancer_crpfactory;
// hardcoded as this value is the same across all networks
// https://uniswap.org/docs/v2/smart-contracts/router02
IUniswapV2Router02 private constant uniswapRouterV2 = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
IERC20 private immutable idle;
IERC20 private immutable weth;
EnumerableSet.AddressSet private depositTokens;
/**
@author Asaf Silman
@notice Initialises the bootstrap contract.
@dev Configures balancer factories
@dev Configures uniswap router
@dev Configures IDLE and WETH token
@param _balancerBFactory Balancer core factory
@param _balancerBFactory Balancer configurable rights pool (CRP) factory
@param _idle IDLE governance token address
@param _weth WETH token address
@param _timelock address of IDLE timelock
@param _feeCollectorAddress address of IDLE fee collector
@param _multisig The multisig account to transfer ownership to after contract initialised
@param _initialDepositTokens The initial tokens to register with the fee deposit
*/
constructor (
address _balancerBFactory,
address _balancerCRPFactory,
address _idle,
address _weth,
address _timelock,
address _feeCollectorAddress,
address _multisig,
address[] memory _initialDepositTokens
) public {
require(_balancerBFactory != address(0), "BFactory cannot be the 0 address");
require(_balancerCRPFactory != address(0), "CRPFactory cannot be the 0 address");
require(_idle != address(0), "IDLE cannot be the 0 address");
require(_weth != address(0), "WETH cannot be the 0 address");
require(_timelock != address(0), "Timelock cannot be the 0 address");
require(_feeCollectorAddress != address(0), "FeeCollector cannot be the 0 address");
require(_multisig != address(0), "Multisig cannot be 0 address");
// initialise balancer factories
balancer_bfactory = IBFactory(_balancerBFactory);
balancer_crpfactory = ICRPFactory(_balancerCRPFactory);
// configure tokens
idle = IERC20(_idle);
weth = IERC20(_weth);
// configure network addresses
timelock = _timelock;
feeCollectorAddress = _feeCollectorAddress;
address _depositToken;
for (uint256 index = 0; index < _initialDepositTokens.length; index++) {
_depositToken = _initialDepositTokens[index];
require(_depositToken != address(_weth), "WETH fees are not supported"); // There is no WETH -> WETH pool in uniswap
require(_depositToken != address(_idle), "IDLE fees are not supported"); // Dont swap IDLE to WETH
IERC20(_depositToken).safeIncreaseAllowance(address(uniswapRouterV2), type(uint256).max); // max approval
depositTokens.add(_depositToken);
}
transferOwnership(_multisig);
contractState = ContractState.DEPLOYED;
}
/**
@author Asaf Silman
@notice Converts all tokens in depositToken enumerable set to WETH.
@dev Can be called after deployment as many times an necissary.
@dev Converts tokens using uniswap simple path. E.g. token -> WETH.
@dev This should be called after the governance proposal has transfered funds to bootstrapping address
@dev After this has been called, `swap()` should be called.
@param minTokenOut Array of minimum tokens to recieve from swap
*/
function swap(uint256[] calldata minTokenOut) external override onlyOwner {
require(contractState==ContractState.DEPLOYED || contractState==ContractState.SWAPPED, "Invalid state");
uint256 counter = depositTokens.length();
require(minTokenOut.length == counter, "Invalid length");
address[] memory path = new address[](2);
path[1] = address(weth);
address _tokenAddress;
IERC20 _tokenInterface;
uint256 _currentBalance;
for (uint256 index = 0; index < counter; index++) {
_tokenAddress = depositTokens.at(index);
_tokenInterface = IERC20(_tokenAddress);
_currentBalance = _tokenInterface.balanceOf(address(this));
path[0] = _tokenAddress;
uniswapRouterV2.swapExactTokensForTokensSupportingFeeOnTransferTokens(
_currentBalance,
minTokenOut[index],
path,
address(this),
block.timestamp.add(1800)
);
}
contractState = ContractState.SWAPPED;
}
/**
@author Asaf Silman
@notice Initialises the smart treasury with bootstrapping parameters
@notice Calculated initial weights based on total value of IDLE and WETH.
@dev This function should be called after all fees have been swapped, by calling `swap()`
@dev After this has been called, `bootstrap()` should be called.
*/
function initialise() external override onlyOwner {
require(contractState == ContractState.SWAPPED, "Invalid State");
require(crpaddress==address(0), "Cannot initialise if CRP already exists");
require(idlePerWeth!=0, "IDLE price not set");
uint256 idleBalance = idle.balanceOf(address(this));
uint256 wethBalance = weth.balanceOf(address(this));
// hard-coded minimums of atleast 100 IDLE and 1 WETH
require(idleBalance > uint256(100).mul(10**18), "Cannot initialise without idle in contract");
require(wethBalance > uint256(1).mul(10**18), "Cannot initialise without weth in contract");
address[] memory tokens = new address[](2);
tokens[0] = address(idle);
tokens[1] = address(weth);
uint256[] memory balances = new uint256[](2);
balances[0] = idleBalance;
balances[1] = wethBalance;
uint256 idleValueInWeth = balances[0].mul(10**18).div(idlePerWeth);
uint256 wethValue = balances[1];
uint256 totalValueInPool = idleValueInWeth.add(wethValue); // expressed in WETH
uint256[] memory weights = new uint256[](2);
weights[0] = idleValueInWeth.mul(BalancerConstants.BONE * 25).div(totalValueInPool); // IDLE value / total value
weights[1] = wethValue.mul(BalancerConstants.BONE * 25).div(totalValueInPool); // WETH value / total value
require(weights[0] >= BalancerConstants.BONE && weights[0] <= BalancerConstants.BONE.mul(24), "Invalid weights");
ICRPFactory.PoolParams memory params = ICRPFactory.PoolParams({
poolTokenSymbol: "ISTT",
poolTokenName: "Idle Smart Treasury Token",
constituentTokens: tokens,
tokenBalances: balances,
tokenWeights: weights,
swapFee: 5 * 10**15 // .5% fee = 5000000000000000
});
ICRPFactory.Rights memory rights = ICRPFactory.Rights({
canPauseSwapping: true,
canChangeSwapFee: true,
canChangeWeights: true,
canAddRemoveTokens: true,
canWhitelistLPs: true,
canChangeCap: false
});
/**** DEPLOY POOL ****/
ConfigurableRightsPool crp = balancer_crpfactory.newCrp(
address(balancer_bfactory),
params,
rights
);
// A balancer pool with canWhitelistLPs does not initially whitelist the controller
// This must be manually set
crp.whitelistLiquidityProvider(address(this));
crp.whitelistLiquidityProvider(timelock);
crp.whitelistLiquidityProvider(feeCollectorAddress);
crpaddress = address(crp);
idle.safeIncreaseAllowance(crpaddress, balances[0]); // approve transfer of idle
weth.safeIncreaseAllowance(crpaddress, balances[1]); // approve transfer of idle
contractState = ContractState.INITIALISED;
}
/**
@author Asaf Silman
@notice Creates the smart treasury, pulls underlying funds, and mints 1000 liquidity tokens
@notice calls updateWeightsGradually to being updating the token weights to the desired initial distribution.
@dev Can only be called after initialise has been called
*/
function bootstrap() external override onlyOwner {
require(contractState == ContractState.INITIALISED, "Invalid State");
require(crpaddress!=address(0), "Cannot bootstrap if CRP does not exist");
ConfigurableRightsPool crp = ConfigurableRightsPool(crpaddress);
/**** CREATE POOL ****/
crp.createPool(
1000 * 10 ** 18, // mint 1000 shares
3 days, // minimumWeightChangeBlockPeriodParam
3 days // addTokenTimeLockInBlocksParam
);
uint256[] memory finalWeights = new uint256[](2);
finalWeights[0] = BalancerConstants.BONE.mul(225).div(10); // 90 %
finalWeights[1] = BalancerConstants.BONE.mul(25).div(10); // 10 %
/**** CALL GRADUAL POOL WEIGHT UPDATE ****/
crp.updateWeightsGradually(
finalWeights,
block.timestamp,
block.timestamp.add(30 days) // ~ 1 months
);
contractState = ContractState.BOOTSTRAPPED;
}
/**
@author Asaf Silman
@notice Renounces ownership of the smart treasury from this contract to idle governance
@notice Transfers balancer liquidity tokens to fee collector
*/
function renounce() external override onlyOwner {
require(contractState == ContractState.BOOTSTRAPPED, "Invalid State");
require(crpaddress != address(0), "Cannot renounce if CRP does not exist");
ConfigurableRightsPool crp = ConfigurableRightsPool(crpaddress);
require(address(crp.bPool()) != address(0), "Cannot renounce if bPool does not exist");
crp.removeWhitelistedLiquidityProvider(address(this));
crp.setController(timelock);
// transfer using safe transfer
IERC20(crpaddress).safeTransfer(feeCollectorAddress, crp.balanceOf(address(this)));
contractState = ContractState.RENOUNCED;
}
/**
@author Asaf Silman
@notice Withdraws a arbitrarty ERC20 token from this contract to an arbitrary address.
@param _token The ERC20 token address.
@param _toAddress The destination address.
@param _amount The amount to transfer.
*/
function withdraw(address _token, address _toAddress, uint256 _amount) external {
require((msg.sender == owner() && contractState == ContractState.RENOUNCED) || msg.sender == timelock, "Only admin");
IERC20 token = IERC20(_token);
token.safeTransfer(_toAddress, _amount);
}
/**
@author Asaf Silman
@notice Set idle price per weth. Used for setting initial weights of smart treasury
@dev expressed in Wei
@param _idlePerWeth idle price per weth expressed in Wei
*/
function setIDLEPrice(uint256 _idlePerWeth) external onlyOwner {
idlePerWeth = _idlePerWeth;
}
/**
@author Asaf Silman
@notice Registers a fee token to depositTokens for swapping to WETH
@dev All fee tokens from fee treasury should be added in this manor
@param _tokenAddress Token address to register with bootstrap contract
*/
function registerTokenToDepositList(address _tokenAddress) public onlyOwner {
require(_tokenAddress != address(weth), "WETH fees are not supported"); // There is no WETH -> WETH pool in uniswap
require(_tokenAddress != address(idle), "IDLE fees are not supported"); // Dont swap IDLE to WETH
IERC20(_tokenAddress).safeIncreaseAllowance(address(uniswapRouterV2), type(uint256).max); // max approval
depositTokens.add(_tokenAddress);
}
/**
@author Asaf Silman
@notice Removes a fee token depositTokens
@param _tokenAddress Token address to remove
*/
function removeTokenFromDepositList(address _tokenAddress) external onlyOwner {
IERC20(_tokenAddress).safeApprove(address(uniswapRouterV2), 0); // 0 approval for uniswap
depositTokens.remove(_tokenAddress);
}
function getState() external view returns (ContractState) {return contractState; }
function getIDLEperWETH() external view returns (uint256) {return idlePerWeth; }
function getCRPAddress() external view returns (address) { return crpaddress; }
function getCRPBPoolAddress() external view returns (address) {
require(crpaddress!=address(0), "CRP is not configured yet");
return address(ConfigurableRightsPool(crpaddress).bPool());
}
function tokenInDepositList(address _tokenAddress) external view returns (bool) {return depositTokens.contains(_tokenAddress);}
function getDepositTokens() external view returns (address[] memory) {
uint256 numTokens = depositTokens.length();
address[] memory depositTokenList = new address[](numTokens);
for (uint256 index = 0; index < numTokens; index++) {
depositTokenList[index] = depositTokens.at(index);
}
return (depositTokenList);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_balancerBFactory","type":"address"},{"internalType":"address","name":"_balancerCRPFactory","type":"address"},{"internalType":"address","name":"_idle","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_feeCollectorAddress","type":"address"},{"internalType":"address","name":"_multisig","type":"address"},{"internalType":"address[]","name":"_initialDepositTokens","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"bootstrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCollectorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCRPAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCRPBPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDepositTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIDLEperWETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"internalType":"enum SmartTreasuryBootstrap.ContractState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"registerTokenToDepositList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"removeTokenFromDepositList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_idlePerWeth","type":"uint256"}],"name":"setIDLEPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"minTokenOut","type":"uint256[]"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"tokenInDepositList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101406040523480156200001257600080fd5b506040516200371a3803806200371a833981016040819052620000359162000785565b60006200004a6001600160e01b036200030516565b600080546001600160a01b0319166001600160a01b038316908117825560405192935091600080516020620036fa833981519152908290a3506001600160a01b038816620000b55760405162461bcd60e51b8152600401620000ac9062000baa565b60405180910390fd5b6001600160a01b038716620000de5760405162461bcd60e51b8152600401620000ac9062000a48565b6001600160a01b038616620001075760405162461bcd60e51b8152600401620000ac9062000ac1565b6001600160a01b038516620001305760405162461bcd60e51b8152600401620000ac9062000cce565b6001600160a01b038416620001595760405162461bcd60e51b8152600401620000ac90620009cd565b6001600160a01b038316620001825760405162461bcd60e51b8152600401620000ac9062000989565b6001600160a01b038216620001ab5760405162461bcd60e51b8152600401620000ac9062000b3e565b6001600160601b0319606089811b821660c05288811b821660e05287811b82166101005286811b82166101205285811b821660805284901b1660a0526000805b8251811015620002d6578281815181106200020257fe5b60200260200101519150866001600160a01b0316826001600160a01b03161415620002415760405162461bcd60e51b8152600401620000ac9062000c4d565b876001600160a01b0316826001600160a01b03161415620002765760405162461bcd60e51b8152600401620000ac9062000c16565b620002b1737a250d5630b4cf539739df2c5dacb4c659f2488d600019846001600160a01b03166200030960201b62001828179092919060201c565b620002cc8260046200040b60201b620019101790919060201c565b50600101620001eb565b50620002eb836001600160e01b036200043416565b50506003805460ff191690555062000d5b95505050505050565b3390565b6000620003a882856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b81526004016200034092919062000921565b60206040518083038186803b1580156200035957600080fd5b505afa1580156200036e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003949190620008ea565b620004ea60201b6200192c1790919060201c565b9050620004058463095ea7b360e01b8584604051602401620003cc9291906200093b565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200051216565b50505050565b60006200042b836001600160a01b0384166001600160e01b03620005b316565b90505b92915050565b620004476001600160e01b036200030516565b6000546001600160a01b03908116911614620004775760405162461bcd60e51b8152600401620000ac9062000b75565b6001600160a01b038116620004a05760405162461bcd60e51b8152600401620000ac9062000a02565b600080546040516001600160a01b0380851693921691600080516020620036fa83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000828201838110156200042b5760405162461bcd60e51b8152600401620000ac9062000a8a565b60606200056e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200060b60201b62001951179092919060201c565b805190915015620005ae57808060200190518101906200058f9190620008c8565b620005ae5760405162461bcd60e51b8152600401620000ac9062000c84565b505050565b6000620005ca83836001600160e01b036200062f16565b62000602575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200042e565b5060006200042e565b60606200062584846000856001600160e01b036200064716565b90505b9392505050565b60009081526001919091016020526040902054151590565b6060824710156200066c5760405162461bcd60e51b8152600401620000ac9062000af8565b62000680856001600160e01b036200072916565b6200069f5760405162461bcd60e51b8152600401620000ac9062000bdf565b60006060866001600160a01b03168587604051620006be919062000903565b60006040518083038185875af1925050503d8060008114620006fd576040519150601f19603f3d011682016040523d82523d6000602084013e62000702565b606091505b5090925090506200071e8282866001600160e01b036200072f16565b979650505050505050565b3b151590565b606083156200074057508162000628565b825115620007515782518084602001fd5b8160405162461bcd60e51b8152600401620000ac919062000954565b80516001600160a01b03811681146200042e57600080fd5b600080600080600080600080610100898b031215620007a2578384fd5b620007ae8a8a6200076d565b9750620007bf8a60208b016200076d565b9650620007d08a60408b016200076d565b9550620007e18a60608b016200076d565b9450620007f28a60808b016200076d565b9350620008038a60a08b016200076d565b9250620008148a60c08b016200076d565b60e08a01519092506001600160401b038082111562000831578283fd5b818b018c601f82011262000843578384fd5b805192508183111562000854578384fd5b6200086460208085020162000d05565b83815260208082019350828101908086028401018f101562000884578586fd5b8592505b84831015620008b3576200089d8f826200076d565b8452602093840193600193909301920162000888565b50809450505050509295985092959890939650565b600060208284031215620008da578081fd5b815180151581146200042b578182fd5b600060208284031215620008fc578081fd5b5051919050565b600082516200091781846020870162000d2c565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b60006020825282518060208401526200097581604085016020870162000d2c565b601f01601f19169190910160400192915050565b60208082526024908201527f466565436f6c6c6563746f722063616e6e6f74206265207468652030206164646040820152637265737360e01b606082015260800190565b6020808252818101527f54696d656c6f636b2063616e6e6f742062652074686520302061646472657373604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f435250466163746f72792063616e6e6f74206265207468652030206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601c908201527f49444c452063616e6e6f74206265207468652030206164647265737300000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601c908201527f4d756c74697369672063616e6e6f742062652030206164647265737300000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f42466163746f72792063616e6e6f742062652074686520302061646472657373604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601b908201527f49444c45206665657320617265206e6f7420737570706f727465640000000000604082015260600190565b6020808252601b908201527f57455448206665657320617265206e6f7420737570706f727465640000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f574554482063616e6e6f74206265207468652030206164647265737300000000604082015260600190565b6040518181016001600160401b038111828210171562000d2457600080fd5b604052919050565b60005b8381101562000d4957818101518382015260200162000d2f565b83811115620004055750506000910152565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c61290762000df360003980610351528061066a52806107e45280610d765280610f1a5250806105df52806107965280610d155280610f6c525080610ace525080610afb525080610c7c52806112135280611497525080610bfe52806111b452806112db528061138052506129076000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063ad556cd9116100ad578063ef5f6e1611610071578063ef5f6e1614610217578063f108e2251461021f578063f2fde38b14610227578063fb01600d1461023a578063fb969b0a1461024f57610121565b8063ad556cd9146101ce578063b15be2f5146101e1578063d33219b4146101e9578063d76c0ca7146101f1578063d9caed121461020457610121565b8063715018a6116100f4578063715018a614610181578063846b130b146101895780638da5cb5b1461019c5780639dacc61f146101b1578063ab72b4ea146101c657610121565b80630bb7f490146101265780631865c57d1461014f57806348bf630b14610164578063592e6f5914610179575b600080fd5b610139610134366004611eb2565b610257565b604051610146919061226d565b60405180910390f35b610157610270565b6040516101469190612278565b610177610172366004611f0e565b610279565b005b610177610518565b610177610dc7565b610177610197366004611eb2565b610e46565b6101a4610ebf565b60405161014691906120f7565b6101b9610ece565b6040516101469190612848565b6101a4610ed4565b6101776101dc366004611eb2565b610ee3565b610177610ffd565b6101a46112d9565b6101776101ff366004611fb6565b6112fd565b610177610212366004611ece565b611337565b6101a46113df565b6101a4611495565b610177610235366004611eb2565b6114b9565b61024261156f565b6040516101469190612235565b610177611614565b600061026a60048363ffffffff61196816565b92915050565b60035460ff1690565b61028161197d565b6000546001600160a01b039081169116146102b75760405162461bcd60e51b81526004016102ae906125fa565b60405180910390fd5b600060035460ff1660048111156102ca57fe5b14806102e65750600160035460ff1660048111156102e457fe5b145b6103025760405162461bcd60e51b81526004016102ae906125d3565b600061030e6004611981565b905081811461032f5760405162461bcd60e51b81526004016102ae906122f7565b60408051600280825260608083018452926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160018151811061037d57fe5b6001600160a01b039092166020928302919091019091015260008080805b85811015610501576103b460048263ffffffff61198c16565b6040516370a0823160e01b81529094508493506001600160a01b038416906370a08231906103e69030906004016120f7565b60206040518083038186803b1580156103fe57600080fd5b505afa158015610412573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104369190611fce565b9150838560008151811061044657fe5b6001600160a01b0390921660209283029190910190910152737a250d5630b4cf539739df2c5dacb4c659f2488d635c11d795838a8a8581811061048557fe5b9050602002013588306104a36107084261192c90919063ffffffff16565b6040518663ffffffff1660e01b81526004016104c3959493929190612851565b600060405180830381600087803b1580156104dd57600080fd5b505af11580156104f1573d6000803e3d6000fd5b50506001909201915061039b9050565b50506003805460ff19166001179055505050505050565b61052061197d565b6000546001600160a01b0390811691161461054d5760405162461bcd60e51b81526004016102ae906125fa565b600160035460ff16600481111561056057fe5b1461057d5760405162461bcd60e51b81526004016102ae906127cb565b6001546001600160a01b0316156105a65760405162461bcd60e51b81526004016102ae906124bc565b6002546105c55760405162461bcd60e51b81526004016102ae90612755565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906106149030906004016120f7565b60206040518083038186803b15801561062c57600080fd5b505afa158015610640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106649190611fce565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016106b491906120f7565b60206040518083038186803b1580156106cc57600080fd5b505afa1580156106e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107049190611fce565b905061071f6064670de0b6b3a764000063ffffffff61199816565b821161073d5760405162461bcd60e51b81526004016102ae90612548565b6107566001670de0b6b3a764000063ffffffff61199816565b81116107745760405162461bcd60e51b81526004016102ae9061262f565b60408051600280825260608083018452926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106107c257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061081057fe5b6001600160a01b0392909216602092830291909101909101526040805160028082526060828101909352816020016020820280368337019050509050838160008151811061085a57fe5b602002602001018181525050828160018151811061087457fe5b60200260200101818152505060006108c36002546108b7670de0b6b3a7640000856000815181106108a157fe5b602002602001015161199890919063ffffffff16565b9063ffffffff6119d216565b90506000826001815181106108d457fe5b6020026020010151905060006108f3828461192c90919063ffffffff16565b604080516002808252606080830184529394509091602083019080368337019050509050610934826108b78668015af1d78b58c4000063ffffffff61199816565b8160008151811061094157fe5b6020908102919091010152610969826108b78568015af1d78b58c4000063ffffffff61199816565b8160018151811061097657fe5b602002602001018181525050670de0b6b3a76400008160008151811061099857fe5b6020026020010151101580156109da57506109c2670de0b6b3a7640000601863ffffffff61199816565b816000815181106109cf57fe5b602002602001015111155b6109f65760405162461bcd60e51b81526004016102ae90612493565b6109fe611e47565b506040805161010081018252600460c08201908152631254d51560e21b60e0830152815281518083018352601981527f49646c6520536d61727420547265617375727920546f6b656e0000000000000060208281019190915282015290810187905260608101869052608081018290526611c37937e0800060a0820152610a83611e7d565b506040805160c081018252600180825260208201819052818301819052606082018190526080820152600060a082018190529151634420002b60e01b81529091906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634420002b90610b27907f00000000000000000000000000000000000000000000000000000000000000009087908790600401612125565b602060405180830381600087803b158015610b4157600080fd5b505af1158015610b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b799190611f9a565b60405163c83a1c2d60e01b81529091506001600160a01b0382169063c83a1c2d90610ba89030906004016120f7565b600060405180830381600087803b158015610bc257600080fd5b505af1158015610bd6573d6000803e3d6000fd5b505060405163c83a1c2d60e01b81526001600160a01b038416925063c83a1c2d9150610c26907f0000000000000000000000000000000000000000000000000000000000000000906004016120f7565b600060405180830381600087803b158015610c4057600080fd5b505af1158015610c54573d6000803e3d6000fd5b505060405163c83a1c2d60e01b81526001600160a01b038416925063c83a1c2d9150610ca4907f0000000000000000000000000000000000000000000000000000000000000000906004016120f7565b600060405180830381600087803b158015610cbe57600080fd5b505af1158015610cd2573d6000803e3d6000fd5b5050600180546001600160a01b0319166001600160a01b0385811691909117918290558b51610d4c9450911691508a90600090610d0b57fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166118289092919063ffffffff16565b600180548951610dad926001600160a01b03909216918b918110610d6c57fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166118289092919063ffffffff16565b50506003805460ff19166002179055505050505050505050565b610dcf61197d565b6000546001600160a01b03908116911614610dfc5760405162461bcd60e51b81526004016102ae906125fa565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610e4e61197d565b6000546001600160a01b03908116911614610e7b5760405162461bcd60e51b81526004016102ae906125fa565b610eaa6001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d600063ffffffff611a1416565b610ebb60048263ffffffff611adc16565b5050565b6000546001600160a01b031690565b60025490565b6001546001600160a01b031690565b610eeb61197d565b6000546001600160a01b03908116911614610f185760405162461bcd60e51b81526004016102ae906125fa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415610f6a5760405162461bcd60e51b81526004016102ae9061271e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415610fbc5760405162461bcd60e51b81526004016102ae906126e7565b610fec6001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d60001963ffffffff61182816565b610ebb60048263ffffffff61191016565b61100561197d565b6000546001600160a01b039081169116146110325760405162461bcd60e51b81526004016102ae906125fa565b6003805460ff16600481111561104457fe5b146110615760405162461bcd60e51b81526004016102ae906127cb565b6001546001600160a01b03166110895760405162461bcd60e51b81526004016102ae90612503565b6001546040805163b64ef17b60e01b815290516001600160a01b0390921691600091839163b64ef17b91600480820192602092909190829003018186803b1580156110d357600080fd5b505afa1580156110e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110b9190611f9a565b6001600160a01b031614156111325760405162461bcd60e51b81526004016102ae906123e2565b60405163e2762d4b60e01b81526001600160a01b0382169063e2762d4b9061115e9030906004016120f7565b600060405180830381600087803b15801561117857600080fd5b505af115801561118c573d6000803e3d6000fd5b50506040516392eefe9b60e01b81526001600160a01b03841692506392eefe9b91506111dc907f0000000000000000000000000000000000000000000000000000000000000000906004016120f7565b600060405180830381600087803b1580156111f657600080fd5b505af115801561120a573d6000803e3d6000fd5b505050506112c97f0000000000000000000000000000000000000000000000000000000000000000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161125e91906120f7565b602060405180830381600087803b15801561127857600080fd5b505af115801561128c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b09190611fce565b6001546001600160a01b0316919063ffffffff611af116565b506003805460ff19166004179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b61130561197d565b6000546001600160a01b039081169116146113325760405162461bcd60e51b81526004016102ae906125fa565b600255565b61133f610ebf565b6001600160a01b0316336001600160a01b031614801561136f5750600460035460ff16600481111561136d57fe5b145b806113a25750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113be5760405162461bcd60e51b81526004016102ae90612429565b826113d96001600160a01b038216848463ffffffff611af116565b50505050565b6001546000906001600160a01b031661140a5760405162461bcd60e51b81526004016102ae906126b0565b600160009054906101000a90046001600160a01b03166001600160a01b031663b64ef17b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561145857600080fd5b505afa15801561146c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114909190611f9a565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6114c161197d565b6000546001600160a01b039081169116146114ee5760405162461bcd60e51b81526004016102ae906125fa565b6001600160a01b0381166115145760405162461bcd60e51b81526004016102ae9061231f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061157d6004611981565b905060608167ffffffffffffffff8111801561159857600080fd5b506040519080825280602002602001820160405280156115c2578160200160208202803683370190505b50905060005b8281101561160d576115e160048263ffffffff61198c16565b8282815181106115ed57fe5b6001600160a01b03909216602092830291909101909101526001016115c8565b5091505090565b61161c61197d565b6000546001600160a01b039081169116146116495760405162461bcd60e51b81526004016102ae906125fa565b600260035460ff16600481111561165c57fe5b146116795760405162461bcd60e51b81526004016102ae906127cb565b6001546001600160a01b03166116a15760405162461bcd60e51b81526004016102ae9061239c565b60015460405163c3391d2760e01b81526001600160a01b0390911690819063c3391d27906116e390683635c9adc5dea00000906203f48090819060040161228c565b600060405180830381600087803b1580156116fd57600080fd5b505af1158015611711573d6000803e3d6000fd5b505060408051600280825260608083018452945090925090602083019080368337019050509050611756600a6108b7670de0b6b3a764000060e163ffffffff61199816565b8160008151811061176357fe5b602090810291909101015261178c600a6108b7670de0b6b3a7640000601963ffffffff61199816565b8160018151811061179957fe5b60209081029190910101526001600160a01b03821663246bc19b82426117c88162278d0063ffffffff61192c16565b6040518463ffffffff1660e01b81526004016117e693929190612248565b600060405180830381600087803b15801561180057600080fd5b505af1158015611814573d6000803e3d6000fd5b50506003805460ff19168117905550505050565b60006118b882856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b815260040161185c92919061210b565b60206040518083038186803b15801561187457600080fd5b505afa158015611888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ac9190611fce565b9063ffffffff61192c16565b90506113d98463095ea7b360e01b85846040516024016118d992919061221c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b10565b6000611925836001600160a01b038416611b9f565b9392505050565b6000828201838110156119255760405162461bcd60e51b81526004016102ae90612365565b60606119608484600085611be9565b949350505050565b6000611925836001600160a01b038416611caa565b3390565b600061026a82611cc2565b60006119258383611cc6565b6000826119a75750600061026a565b828202828482816119b457fe5b04146119255760405162461bcd60e51b81526004016102ae90612592565b600061192583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611d0b565b801580611a9c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611a4a903090869060040161210b565b60206040518083038186803b158015611a6257600080fd5b505afa158015611a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9a9190611fce565b155b611ab85760405162461bcd60e51b81526004016102ae906127f2565b611ad78363095ea7b360e01b84846040516024016118d992919061221c565b505050565b6000611925836001600160a01b038416611d42565b611ad78363a9059cbb60e01b84846040516024016118d992919061221c565b6060611b65826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119519092919063ffffffff16565b805190915015611ad75780806020019051810190611b839190611f7a565b611ad75760405162461bcd60e51b81526004016102ae90612781565b6000611bab8383611caa565b611be15750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561026a565b50600061026a565b606082471015611c0b5760405162461bcd60e51b81526004016102ae9061244d565b611c1485611e08565b611c305760405162461bcd60e51b81526004016102ae90612679565b60006060866001600160a01b03168587604051611c4d91906120db565b60006040518083038185875af1925050503d8060008114611c8a576040519150601f19603f3d011682016040523d82523d6000602084013e611c8f565b606091505b5091509150611c9f828286611e0e565b979650505050505050565b60009081526001919091016020526040902054151590565b5490565b81546000908210611ce95760405162461bcd60e51b81526004016102ae906122b5565b826000018281548110611cf857fe5b9060005260206000200154905092915050565b60008183611d2c5760405162461bcd60e51b81526004016102ae91906122a2565b506000838581611d3857fe5b0495945050505050565b60008181526001830160205260408120548015611dfe5783546000198083019190810190600090879083908110611d7557fe5b9060005260206000200154905080876000018481548110611d9257fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611dc257fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061026a565b600091505061026a565b3b151590565b60608315611e1d575081611925565b825115611e2d5782518084602001fd5b8160405162461bcd60e51b81526004016102ae91906122a2565b6040518060c001604052806060815260200160608152602001606081526020016060815260200160608152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b600060208284031215611ec3578081fd5b8135611925816128b9565b600080600060608486031215611ee2578182fd5b8335611eed816128b9565b92506020840135611efd816128b9565b929592945050506040919091013590565b60008060208385031215611f20578182fd5b823567ffffffffffffffff80821115611f37578384fd5b81850186601f820112611f48578485fd5b8035925081831115611f58578485fd5b8660208085028301011115611f6b578485fd5b60200196919550909350505050565b600060208284031215611f8b578081fd5b81518015158114611925578182fd5b600060208284031215611fab578081fd5b8151611925816128b9565b600060208284031215611fc7578081fd5b5035919050565b600060208284031215611fdf578081fd5b5051919050565b6001600160a01b0316815260200190565b6000815180845260208085019450808401835b8381101561202f5781516001600160a01b03168752958201959082019060010161200a565b509495945050505050565b6000815180845260208085019450808401835b8381101561202f5781518752958201959082019060010161204d565b6000815180845261208181602086016020860161288d565b601f01601f19169290920160200192915050565b80511515825260208101511515602083015260408101511515604083015260608101511515606083015260808101511515608083015260a0810151151560a08301525050565b600082516120ed81846020870161288d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b600061010060018060a01b038616835260208181850152855160c0838601526121526101c0860182612069565b9250508086015160ff1980868503016101208701526121718483612069565b60408901519450818782030161014088015280925084516121928183612848565b8796909450850191505b808610156121c1576121af848351611fe6565b9350848201915060018601955061219c565b50506060880151935080868303016101608701526121df828561203a565b925060808801519350808684030161018087015250506121ff818361203a565b60a08701516101a086015292506119609150506040830184612095565b6001600160a01b03929092168252602082015260400190565b6000602082526119256020830184611ff7565b60006060825261225b606083018661203a565b60208301949094525060400152919050565b901515815260200190565b602081016005831061228657fe5b91905290565b9283526020830191909152604082015260600190565b6000602082526119256020830184612069565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252600e908201526d092dcecc2d8d2c840d8cadccee8d60931b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526026908201527f43616e6e6f7420626f6f7473747261702069662043525020646f6573206e6f7460408201526508195e1a5cdd60d21b606082015260800190565b60208082526027908201527f43616e6e6f742072656e6f756e63652069662062506f6f6c20646f6573206e6f6040820152661d08195e1a5cdd60ca1b606082015260800190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600f908201526e496e76616c6964207765696768747360881b604082015260600190565b60208082526027908201527f43616e6e6f7420696e697469616c6973652069662043525020616c72656164796040820152662065786973747360c81b606082015260800190565b60208082526025908201527f43616e6e6f742072656e6f756e63652069662043525020646f6573206e6f7420604082015264195e1a5cdd60da1b606082015260800190565b6020808252602a908201527f43616e6e6f7420696e697469616c69736520776974686f75742069646c6520696040820152691b8818dbdb9d1c9858dd60b21b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600d908201526c496e76616c696420737461746560981b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f43616e6e6f7420696e697469616c69736520776974686f7574207765746820696040820152691b8818dbdb9d1c9858dd60b21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526019908201527f435250206973206e6f7420636f6e666967757265642079657400000000000000604082015260600190565b6020808252601b908201527f49444c45206665657320617265206e6f7420737570706f727465640000000000604082015260600190565b6020808252601b908201527f57455448206665657320617265206e6f7420737570706f727465640000000000604082015260600190565b60208082526012908201527112511311481c1c9a58d9481b9bdd081cd95d60721b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600d908201526c496e76616c696420537461746560981b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b600086825285602083015260a0604083015261287060a0830186611ff7565b6001600160a01b0394909416606083015250608001529392505050565b60005b838110156128a8578181015183820152602001612890565b838111156113d95750506000910152565b6001600160a01b03811681146128ce57600080fd5b5056fea2646970667358221220c4a910178cd49074b44daf6d33d9aac1d8a302f95780688e0299e64e2b8ba01164736f6c634300060800338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00000000000000000000000009424b1412450d0f8fc2255faf6046b98213b76bd000000000000000000000000ed52d8e202401645edad1c0aa21e872498ce47d0000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d6dabbc2b275114a2366555d6c481ef08fdc2556000000000000000000000000becc659bfc6edca552fa1a67451cc6b38a0108e4000000000000000000000000e8ea8bae250028a8709a3841e0ae1a44820d677b000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000070000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000000000000000085d4780b73119b644ae5ecd22b37600000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f510000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063ad556cd9116100ad578063ef5f6e1611610071578063ef5f6e1614610217578063f108e2251461021f578063f2fde38b14610227578063fb01600d1461023a578063fb969b0a1461024f57610121565b8063ad556cd9146101ce578063b15be2f5146101e1578063d33219b4146101e9578063d76c0ca7146101f1578063d9caed121461020457610121565b8063715018a6116100f4578063715018a614610181578063846b130b146101895780638da5cb5b1461019c5780639dacc61f146101b1578063ab72b4ea146101c657610121565b80630bb7f490146101265780631865c57d1461014f57806348bf630b14610164578063592e6f5914610179575b600080fd5b610139610134366004611eb2565b610257565b604051610146919061226d565b60405180910390f35b610157610270565b6040516101469190612278565b610177610172366004611f0e565b610279565b005b610177610518565b610177610dc7565b610177610197366004611eb2565b610e46565b6101a4610ebf565b60405161014691906120f7565b6101b9610ece565b6040516101469190612848565b6101a4610ed4565b6101776101dc366004611eb2565b610ee3565b610177610ffd565b6101a46112d9565b6101776101ff366004611fb6565b6112fd565b610177610212366004611ece565b611337565b6101a46113df565b6101a4611495565b610177610235366004611eb2565b6114b9565b61024261156f565b6040516101469190612235565b610177611614565b600061026a60048363ffffffff61196816565b92915050565b60035460ff1690565b61028161197d565b6000546001600160a01b039081169116146102b75760405162461bcd60e51b81526004016102ae906125fa565b60405180910390fd5b600060035460ff1660048111156102ca57fe5b14806102e65750600160035460ff1660048111156102e457fe5b145b6103025760405162461bcd60e51b81526004016102ae906125d3565b600061030e6004611981565b905081811461032f5760405162461bcd60e51b81526004016102ae906122f7565b60408051600280825260608083018452926020830190803683370190505090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061037d57fe5b6001600160a01b039092166020928302919091019091015260008080805b85811015610501576103b460048263ffffffff61198c16565b6040516370a0823160e01b81529094508493506001600160a01b038416906370a08231906103e69030906004016120f7565b60206040518083038186803b1580156103fe57600080fd5b505afa158015610412573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104369190611fce565b9150838560008151811061044657fe5b6001600160a01b0390921660209283029190910190910152737a250d5630b4cf539739df2c5dacb4c659f2488d635c11d795838a8a8581811061048557fe5b9050602002013588306104a36107084261192c90919063ffffffff16565b6040518663ffffffff1660e01b81526004016104c3959493929190612851565b600060405180830381600087803b1580156104dd57600080fd5b505af11580156104f1573d6000803e3d6000fd5b50506001909201915061039b9050565b50506003805460ff19166001179055505050505050565b61052061197d565b6000546001600160a01b0390811691161461054d5760405162461bcd60e51b81526004016102ae906125fa565b600160035460ff16600481111561056057fe5b1461057d5760405162461bcd60e51b81526004016102ae906127cb565b6001546001600160a01b0316156105a65760405162461bcd60e51b81526004016102ae906124bc565b6002546105c55760405162461bcd60e51b81526004016102ae90612755565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e16906370a08231906106149030906004016120f7565b60206040518083038186803b15801561062c57600080fd5b505afa158015610640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106649190611fce565b905060007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016106b491906120f7565b60206040518083038186803b1580156106cc57600080fd5b505afa1580156106e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107049190611fce565b905061071f6064670de0b6b3a764000063ffffffff61199816565b821161073d5760405162461bcd60e51b81526004016102ae90612548565b6107566001670de0b6b3a764000063ffffffff61199816565b81116107745760405162461bcd60e51b81526004016102ae9061262f565b60408051600280825260608083018452926020830190803683370190505090507f000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e816000815181106107c257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061081057fe5b6001600160a01b0392909216602092830291909101909101526040805160028082526060828101909352816020016020820280368337019050509050838160008151811061085a57fe5b602002602001018181525050828160018151811061087457fe5b60200260200101818152505060006108c36002546108b7670de0b6b3a7640000856000815181106108a157fe5b602002602001015161199890919063ffffffff16565b9063ffffffff6119d216565b90506000826001815181106108d457fe5b6020026020010151905060006108f3828461192c90919063ffffffff16565b604080516002808252606080830184529394509091602083019080368337019050509050610934826108b78668015af1d78b58c4000063ffffffff61199816565b8160008151811061094157fe5b6020908102919091010152610969826108b78568015af1d78b58c4000063ffffffff61199816565b8160018151811061097657fe5b602002602001018181525050670de0b6b3a76400008160008151811061099857fe5b6020026020010151101580156109da57506109c2670de0b6b3a7640000601863ffffffff61199816565b816000815181106109cf57fe5b602002602001015111155b6109f65760405162461bcd60e51b81526004016102ae90612493565b6109fe611e47565b506040805161010081018252600460c08201908152631254d51560e21b60e0830152815281518083018352601981527f49646c6520536d61727420547265617375727920546f6b656e0000000000000060208281019190915282015290810187905260608101869052608081018290526611c37937e0800060a0820152610a83611e7d565b506040805160c081018252600180825260208201819052818301819052606082018190526080820152600060a082018190529151634420002b60e01b81529091906001600160a01b037f000000000000000000000000ed52d8e202401645edad1c0aa21e872498ce47d01690634420002b90610b27907f0000000000000000000000009424b1412450d0f8fc2255faf6046b98213b76bd9087908790600401612125565b602060405180830381600087803b158015610b4157600080fd5b505af1158015610b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b799190611f9a565b60405163c83a1c2d60e01b81529091506001600160a01b0382169063c83a1c2d90610ba89030906004016120f7565b600060405180830381600087803b158015610bc257600080fd5b505af1158015610bd6573d6000803e3d6000fd5b505060405163c83a1c2d60e01b81526001600160a01b038416925063c83a1c2d9150610c26907f000000000000000000000000d6dabbc2b275114a2366555d6c481ef08fdc2556906004016120f7565b600060405180830381600087803b158015610c4057600080fd5b505af1158015610c54573d6000803e3d6000fd5b505060405163c83a1c2d60e01b81526001600160a01b038416925063c83a1c2d9150610ca4907f000000000000000000000000becc659bfc6edca552fa1a67451cc6b38a0108e4906004016120f7565b600060405180830381600087803b158015610cbe57600080fd5b505af1158015610cd2573d6000803e3d6000fd5b5050600180546001600160a01b0319166001600160a01b0385811691909117918290558b51610d4c9450911691508a90600090610d0b57fe5b60200260200101517f000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e6001600160a01b03166118289092919063ffffffff16565b600180548951610dad926001600160a01b03909216918b918110610d6c57fe5b60200260200101517f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03166118289092919063ffffffff16565b50506003805460ff19166002179055505050505050505050565b610dcf61197d565b6000546001600160a01b03908116911614610dfc5760405162461bcd60e51b81526004016102ae906125fa565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610e4e61197d565b6000546001600160a01b03908116911614610e7b5760405162461bcd60e51b81526004016102ae906125fa565b610eaa6001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d600063ffffffff611a1416565b610ebb60048263ffffffff611adc16565b5050565b6000546001600160a01b031690565b60025490565b6001546001600160a01b031690565b610eeb61197d565b6000546001600160a01b03908116911614610f185760405162461bcd60e51b81526004016102ae906125fa565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316816001600160a01b03161415610f6a5760405162461bcd60e51b81526004016102ae9061271e565b7f000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e6001600160a01b0316816001600160a01b03161415610fbc5760405162461bcd60e51b81526004016102ae906126e7565b610fec6001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d60001963ffffffff61182816565b610ebb60048263ffffffff61191016565b61100561197d565b6000546001600160a01b039081169116146110325760405162461bcd60e51b81526004016102ae906125fa565b6003805460ff16600481111561104457fe5b146110615760405162461bcd60e51b81526004016102ae906127cb565b6001546001600160a01b03166110895760405162461bcd60e51b81526004016102ae90612503565b6001546040805163b64ef17b60e01b815290516001600160a01b0390921691600091839163b64ef17b91600480820192602092909190829003018186803b1580156110d357600080fd5b505afa1580156110e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110b9190611f9a565b6001600160a01b031614156111325760405162461bcd60e51b81526004016102ae906123e2565b60405163e2762d4b60e01b81526001600160a01b0382169063e2762d4b9061115e9030906004016120f7565b600060405180830381600087803b15801561117857600080fd5b505af115801561118c573d6000803e3d6000fd5b50506040516392eefe9b60e01b81526001600160a01b03841692506392eefe9b91506111dc907f000000000000000000000000d6dabbc2b275114a2366555d6c481ef08fdc2556906004016120f7565b600060405180830381600087803b1580156111f657600080fd5b505af115801561120a573d6000803e3d6000fd5b505050506112c97f000000000000000000000000becc659bfc6edca552fa1a67451cc6b38a0108e4826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161125e91906120f7565b602060405180830381600087803b15801561127857600080fd5b505af115801561128c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b09190611fce565b6001546001600160a01b0316919063ffffffff611af116565b506003805460ff19166004179055565b7f000000000000000000000000d6dabbc2b275114a2366555d6c481ef08fdc255681565b61130561197d565b6000546001600160a01b039081169116146113325760405162461bcd60e51b81526004016102ae906125fa565b600255565b61133f610ebf565b6001600160a01b0316336001600160a01b031614801561136f5750600460035460ff16600481111561136d57fe5b145b806113a25750336001600160a01b037f000000000000000000000000d6dabbc2b275114a2366555d6c481ef08fdc255616145b6113be5760405162461bcd60e51b81526004016102ae90612429565b826113d96001600160a01b038216848463ffffffff611af116565b50505050565b6001546000906001600160a01b031661140a5760405162461bcd60e51b81526004016102ae906126b0565b600160009054906101000a90046001600160a01b03166001600160a01b031663b64ef17b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561145857600080fd5b505afa15801561146c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114909190611f9a565b905090565b7f000000000000000000000000becc659bfc6edca552fa1a67451cc6b38a0108e481565b6114c161197d565b6000546001600160a01b039081169116146114ee5760405162461bcd60e51b81526004016102ae906125fa565b6001600160a01b0381166115145760405162461bcd60e51b81526004016102ae9061231f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061157d6004611981565b905060608167ffffffffffffffff8111801561159857600080fd5b506040519080825280602002602001820160405280156115c2578160200160208202803683370190505b50905060005b8281101561160d576115e160048263ffffffff61198c16565b8282815181106115ed57fe5b6001600160a01b03909216602092830291909101909101526001016115c8565b5091505090565b61161c61197d565b6000546001600160a01b039081169116146116495760405162461bcd60e51b81526004016102ae906125fa565b600260035460ff16600481111561165c57fe5b146116795760405162461bcd60e51b81526004016102ae906127cb565b6001546001600160a01b03166116a15760405162461bcd60e51b81526004016102ae9061239c565b60015460405163c3391d2760e01b81526001600160a01b0390911690819063c3391d27906116e390683635c9adc5dea00000906203f48090819060040161228c565b600060405180830381600087803b1580156116fd57600080fd5b505af1158015611711573d6000803e3d6000fd5b505060408051600280825260608083018452945090925090602083019080368337019050509050611756600a6108b7670de0b6b3a764000060e163ffffffff61199816565b8160008151811061176357fe5b602090810291909101015261178c600a6108b7670de0b6b3a7640000601963ffffffff61199816565b8160018151811061179957fe5b60209081029190910101526001600160a01b03821663246bc19b82426117c88162278d0063ffffffff61192c16565b6040518463ffffffff1660e01b81526004016117e693929190612248565b600060405180830381600087803b15801561180057600080fd5b505af1158015611814573d6000803e3d6000fd5b50506003805460ff19168117905550505050565b60006118b882856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b815260040161185c92919061210b565b60206040518083038186803b15801561187457600080fd5b505afa158015611888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ac9190611fce565b9063ffffffff61192c16565b90506113d98463095ea7b360e01b85846040516024016118d992919061221c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b10565b6000611925836001600160a01b038416611b9f565b9392505050565b6000828201838110156119255760405162461bcd60e51b81526004016102ae90612365565b60606119608484600085611be9565b949350505050565b6000611925836001600160a01b038416611caa565b3390565b600061026a82611cc2565b60006119258383611cc6565b6000826119a75750600061026a565b828202828482816119b457fe5b04146119255760405162461bcd60e51b81526004016102ae90612592565b600061192583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611d0b565b801580611a9c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611a4a903090869060040161210b565b60206040518083038186803b158015611a6257600080fd5b505afa158015611a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9a9190611fce565b155b611ab85760405162461bcd60e51b81526004016102ae906127f2565b611ad78363095ea7b360e01b84846040516024016118d992919061221c565b505050565b6000611925836001600160a01b038416611d42565b611ad78363a9059cbb60e01b84846040516024016118d992919061221c565b6060611b65826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119519092919063ffffffff16565b805190915015611ad75780806020019051810190611b839190611f7a565b611ad75760405162461bcd60e51b81526004016102ae90612781565b6000611bab8383611caa565b611be15750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561026a565b50600061026a565b606082471015611c0b5760405162461bcd60e51b81526004016102ae9061244d565b611c1485611e08565b611c305760405162461bcd60e51b81526004016102ae90612679565b60006060866001600160a01b03168587604051611c4d91906120db565b60006040518083038185875af1925050503d8060008114611c8a576040519150601f19603f3d011682016040523d82523d6000602084013e611c8f565b606091505b5091509150611c9f828286611e0e565b979650505050505050565b60009081526001919091016020526040902054151590565b5490565b81546000908210611ce95760405162461bcd60e51b81526004016102ae906122b5565b826000018281548110611cf857fe5b9060005260206000200154905092915050565b60008183611d2c5760405162461bcd60e51b81526004016102ae91906122a2565b506000838581611d3857fe5b0495945050505050565b60008181526001830160205260408120548015611dfe5783546000198083019190810190600090879083908110611d7557fe5b9060005260206000200154905080876000018481548110611d9257fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611dc257fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061026a565b600091505061026a565b3b151590565b60608315611e1d575081611925565b825115611e2d5782518084602001fd5b8160405162461bcd60e51b81526004016102ae91906122a2565b6040518060c001604052806060815260200160608152602001606081526020016060815260200160608152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b600060208284031215611ec3578081fd5b8135611925816128b9565b600080600060608486031215611ee2578182fd5b8335611eed816128b9565b92506020840135611efd816128b9565b929592945050506040919091013590565b60008060208385031215611f20578182fd5b823567ffffffffffffffff80821115611f37578384fd5b81850186601f820112611f48578485fd5b8035925081831115611f58578485fd5b8660208085028301011115611f6b578485fd5b60200196919550909350505050565b600060208284031215611f8b578081fd5b81518015158114611925578182fd5b600060208284031215611fab578081fd5b8151611925816128b9565b600060208284031215611fc7578081fd5b5035919050565b600060208284031215611fdf578081fd5b5051919050565b6001600160a01b0316815260200190565b6000815180845260208085019450808401835b8381101561202f5781516001600160a01b03168752958201959082019060010161200a565b509495945050505050565b6000815180845260208085019450808401835b8381101561202f5781518752958201959082019060010161204d565b6000815180845261208181602086016020860161288d565b601f01601f19169290920160200192915050565b80511515825260208101511515602083015260408101511515604083015260608101511515606083015260808101511515608083015260a0810151151560a08301525050565b600082516120ed81846020870161288d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b600061010060018060a01b038616835260208181850152855160c0838601526121526101c0860182612069565b9250508086015160ff1980868503016101208701526121718483612069565b60408901519450818782030161014088015280925084516121928183612848565b8796909450850191505b808610156121c1576121af848351611fe6565b9350848201915060018601955061219c565b50506060880151935080868303016101608701526121df828561203a565b925060808801519350808684030161018087015250506121ff818361203a565b60a08701516101a086015292506119609150506040830184612095565b6001600160a01b03929092168252602082015260400190565b6000602082526119256020830184611ff7565b60006060825261225b606083018661203a565b60208301949094525060400152919050565b901515815260200190565b602081016005831061228657fe5b91905290565b9283526020830191909152604082015260600190565b6000602082526119256020830184612069565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252600e908201526d092dcecc2d8d2c840d8cadccee8d60931b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526026908201527f43616e6e6f7420626f6f7473747261702069662043525020646f6573206e6f7460408201526508195e1a5cdd60d21b606082015260800190565b60208082526027908201527f43616e6e6f742072656e6f756e63652069662062506f6f6c20646f6573206e6f6040820152661d08195e1a5cdd60ca1b606082015260800190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600f908201526e496e76616c6964207765696768747360881b604082015260600190565b60208082526027908201527f43616e6e6f7420696e697469616c6973652069662043525020616c72656164796040820152662065786973747360c81b606082015260800190565b60208082526025908201527f43616e6e6f742072656e6f756e63652069662043525020646f6573206e6f7420604082015264195e1a5cdd60da1b606082015260800190565b6020808252602a908201527f43616e6e6f7420696e697469616c69736520776974686f75742069646c6520696040820152691b8818dbdb9d1c9858dd60b21b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252600d908201526c496e76616c696420737461746560981b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f43616e6e6f7420696e697469616c69736520776974686f7574207765746820696040820152691b8818dbdb9d1c9858dd60b21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526019908201527f435250206973206e6f7420636f6e666967757265642079657400000000000000604082015260600190565b6020808252601b908201527f49444c45206665657320617265206e6f7420737570706f727465640000000000604082015260600190565b6020808252601b908201527f57455448206665657320617265206e6f7420737570706f727465640000000000604082015260600190565b60208082526012908201527112511311481c1c9a58d9481b9bdd081cd95d60721b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600d908201526c496e76616c696420537461746560981b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b600086825285602083015260a0604083015261287060a0830186611ff7565b6001600160a01b0394909416606083015250608001529392505050565b60005b838110156128a8578181015183820152602001612890565b838111156113d95750506000910152565b6001600160a01b03811681146128ce57600080fd5b5056fea2646970667358221220c4a910178cd49074b44daf6d33d9aac1d8a302f95780688e0299e64e2b8ba01164736f6c63430006080033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009424b1412450d0f8fc2255faf6046b98213b76bd000000000000000000000000ed52d8e202401645edad1c0aa21e872498ce47d0000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d6dabbc2b275114a2366555d6c481ef08fdc2556000000000000000000000000becc659bfc6edca552fa1a67451cc6b38a0108e4000000000000000000000000e8ea8bae250028a8709a3841e0ae1a44820d677b000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000070000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000000000000000085d4780b73119b644ae5ecd22b37600000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f510000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
-----Decoded View---------------
Arg [0] : _balancerBFactory (address): 0x9424B1412450D0f8Fc2255FAf6046b98213B76Bd
Arg [1] : _balancerCRPFactory (address): 0xed52D8E202401645eDAD1c0AA21e872498ce47D0
Arg [2] : _idle (address): 0x875773784Af8135eA0ef43b5a374AaD105c5D39e
Arg [3] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [4] : _timelock (address): 0xD6dABBc2b275114a2366555d6C481EF08FDC2556
Arg [5] : _feeCollectorAddress (address): 0xBecC659Bfc6EDcA552fa1A67451cC6b38a0108E4
Arg [6] : _multisig (address): 0xe8eA8bAE250028a8709A3841E0Ae1a44820d677b
Arg [7] : _initialDepositTokens (address[]): 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,0x0000000000085d4780B73119b644AE5ecd22b376,0x57Ab1ec28D129707052df4dF418D58a2D46d5f51,0x6B175474E89094C44Da98b954EedeAC495271d0F,0xdAC17F958D2ee523a2206206994597C13D831ec7,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xc00e94Cb662C3520282E6f5717214004A7f26888
-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000009424b1412450d0f8fc2255faf6046b98213b76bd
Arg [1] : 000000000000000000000000ed52d8e202401645edad1c0aa21e872498ce47d0
Arg [2] : 000000000000000000000000875773784af8135ea0ef43b5a374aad105c5d39e
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 000000000000000000000000d6dabbc2b275114a2366555d6c481ef08fdc2556
Arg [5] : 000000000000000000000000becc659bfc6edca552fa1a67451cc6b38a0108e4
Arg [6] : 000000000000000000000000e8ea8bae250028a8709a3841e0ae1a44820d677b
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [9] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [10] : 0000000000000000000000000000000000085d4780b73119b644ae5ecd22b376
Arg [11] : 00000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51
Arg [12] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [13] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [14] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [15] : 000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
Deployed Bytecode Sourcemap
45579:13074:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45579:13074:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;58170:127:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;57713:82;;;:::i;:::-;;;;;;;;49521:1006;;;;;;;;;:::i;:::-;;50880:2780;;;:::i;31412:148::-;;;:::i;57486:221::-;;;;;;;;;:::i;30770:79::-;;;:::i;:::-;;;;;;;;57799:80;;;:::i;:::-;;;;;;;;57883:79;;;:::i;56892:458::-;;;;;;;;;:::i;55102:658::-;;;:::i;45769:33::-;;;:::i;56531:102::-;;;;;;;;;:::i;56023:293::-;;;;;;;;;:::i;57966:200::-;;;:::i;45807:44::-;;;:::i;31715:244::-;;;;;;;;;:::i;58301:349::-;;;:::i;:::-;;;;;;;;53971:933;;;:::i;58170:127::-;58244:4;58258:37;:13;58281;58258:37;:22;:37;:::i;:::-;58251:44;58170:127;-1:-1:-1;;58170:127:0:o;57713:82::-;57779:13;;;;57713:82;:::o;49521:1006::-;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;;;;;;;;;49625:22:::1;49610:13;::::0;::::1;;:37;::::0;::::1;;;;;;;:77;;;-1:-1:-1::0;49666:21:0::1;49651:13;::::0;::::1;;:36;::::0;::::1;;;;;;;49610:77;49602:103;;;;-1:-1:-1::0;;;49602:103:0::1;;;;;;;;;49712:15;49730:22;:13;:20;:22::i;:::-;49712:40:::0;-1:-1:-1;49769:29:0;;::::1;49761:56;;;;-1:-1:-1::0;;;49761:56:0::1;;;;;;;;;49850:16;::::0;;49864:1:::1;49850:16:::0;;;49826:21:::1;49850:16:::0;;::::1;::::0;;49826:21;49850:16:::1;::::0;::::1;::::0;;109:14:-1::1;49850:16:0::0;88:42:-1::1;144:17;::::0;-1:-1;49850:16:0::1;49826:40;;49891:4;49873;49878:1;49873:7;;;;;;;;-1:-1:-1::0;;;;;49873:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:23;49905:21:::1;::::0;;;49994:482:::1;50026:7;50018:5;:15;49994:482;;;50069:23;:13;50086:5:::0;50069:23:::1;:16;:23;:::i;:::-;50169:40;::::0;-1:-1:-1;;;50169:40:0;;50053:39;;-1:-1:-1;50053:39:0;;-1:-1:-1;;;;;;50169:25:0;::::1;::::0;::::1;::::0;:40:::1;::::0;50203:4:::1;::::0;50169:40:::1;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;50169:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;50169:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50169:40:0;;;;;;;;;50151:58;;50230:13;50220:4;50225:1;50220:7;;;;;;;;-1:-1:-1::0;;;;;50220:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:23;46383:42:::1;50260:69;50340:15:::0;50366:11;;50378:5;50366:18;;::::1;;;;;;;;;;;50395:4;50418;50434:25;50454:4;50434:15;:19;;:25;;;;:::i;:::-;50260:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;50260:208:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;50035:7:0::1;::::0;;::::1;::::0;-1:-1:-1;49994:482:0::1;::::0;-1:-1:-1;49994:482:0::1;;-1:-1:-1::0;;50484:13:0::1;:37:::0;;-1:-1:-1;;50484:37:0::1;50500:21;50484:37;::::0;;-1:-1:-1;;;;;;49521:1006:0:o;50880:2780::-;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;50962:21:::1;50945:13;::::0;::::1;;:38;::::0;::::1;;;;;;;50937:64;;;;-1:-1:-1::0;;;50937:64:0::1;;;;;;;;;51016:10;::::0;-1:-1:-1;;;;;51016:10:0::1;:22:::0;51008:74:::1;;;;-1:-1:-1::0;;;51008:74:0::1;;;;;;;;;51097:11;::::0;51089:45:::1;;;;-1:-1:-1::0;;;51089:45:0::1;;;;;;;;;51169:29;::::0;-1:-1:-1;;;51169:29:0;;51147:19:::1;::::0;-1:-1:-1;;;;;51169:4:0::1;:14;::::0;::::1;::::0;:29:::1;::::0;51192:4:::1;::::0;51169:29:::1;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;51169:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;51169:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51169:29:0;;;;;;;;;51147:51;;51205:19;51227:4;-1:-1:-1::0;;;;;51227:14:0::1;;51250:4;51227:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;51227:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;51227:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51227:29:0;;;;;;;;;51205:51:::0;-1:-1:-1;51346:24:0::1;51354:3;51363:6;51346:24;:16;:24;:::i;:::-;51332:11;:38;51324:93;;;;-1:-1:-1::0;;;51324:93:0::1;;;;;;;;;51446:22;51454:1;51461:6;51446:22;:14;:22;:::i;:::-;51432:11;:36;51424:91;;;;-1:-1:-1::0;;;51424:91:0::1;;;;;;;;;51550:16;::::0;;51564:1:::1;51550:16:::0;;;51524:23:::1;51550:16:::0;;::::1;::::0;;51524:23;51550:16:::1;::::0;::::1;::::0;;109:14:-1::1;51550:16:0::0;88:42:-1::1;144:17;::::0;-1:-1;51550:16:0::1;51524:42;;51593:4;51573:6;51580:1;51573:9;;;;;;;;;;;;;:25;-1:-1:-1::0;;;;;51573:25:0::1;;;-1:-1:-1::0;;;;;51573:25:0::1;;;::::0;::::1;51625:4;51605:6;51612:1;51605:9;;;;;;;;-1:-1:-1::0;;;;;51605:25:0;;;::::1;:9;::::0;;::::1;::::0;;;;;;;:25;51667:16:::1;::::0;;51681:1:::1;51667:16:::0;;;51639:25:::1;51667:16:::0;;::::1;::::0;;;::::1;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;::::0;-1:-1;51667:16:0::1;51639:44;;51704:11;51690:8;51699:1;51690:11;;;;;;;;;;;;;:25;;;::::0;::::1;51736:11;51722:8;51731:1;51722:11;;;;;;;;;;;;;:25;;;::::0;::::1;51762:23;51788:40;51816:11;;51788:23;51804:6;51788:8;51797:1;51788:11;;;;;;;;;;;;;;:15;;:23;;;;:::i;:::-;:27:::0;:40:::1;:27;:40;:::i;:::-;51762:66;;51835:17;51855:8;51864:1;51855:11;;;;;;;;;;;;;;51835:31;;51875:24;51902:30;51922:9;51902:15;:19;;:30;;;;:::i;:::-;51989:16;::::0;;52003:1:::1;51989:16:::0;;;51962:24:::1;51989:16:::0;;::::1;::::0;;51875:57;;-1:-1:-1;51989:16:0;;::::1;::::0;::::1;::::0;;109:14:-1::1;51989:16:0::0;88:42:-1::1;144:17;::::0;-1:-1;;51962:43:0;-1:-1:-1;52025:70:0::1;52078:16:::0;52025:48:::1;:15:::0;52045:27;52025:48:::1;:19;:48;:::i;:70::-;52012:7;52020:1;52012:10;;;;;;;;;::::0;;::::1;::::0;;;;;:83;52143:64:::1;52190:16:::0;52143:42:::1;:9:::0;52157:27;52143:42:::1;:13;:42;:::i;:64::-;52130:7;52138:1;52130:10;;;;;;;;;;;;;:77;;;::::0;::::1;44450:6;52252:7;52260:1;52252:10;;;;;;;;;;;;;;:36;;:85;;;;-1:-1:-1::0;52307:30:0::1;44450:6;52334:2;52307:30;:26;:30;:::i;:::-;52293:7;52301:1;52293:10;;;;;;;;;;;;;;:44;;52252:85;52244:113;;;;-1:-1:-1::0;;;52244:113:0::1;;;;;;;;;52366:36;;:::i;:::-;-1:-1:-1::0;52405:268:0::1;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;-1:-1:-1;;;52405:268:0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;;;52405:268:0;;;52625:10:::1;-1:-1:-1::0;;;52405:268:0;52682:32:::1;;:::i;:::-;-1:-1:-1::0;52717:226:0::1;::::0;;::::1;::::0;::::1;::::0;;52765:4:::1;52717:226:::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;-1:-1:-1;52717:226:0;;;;;;53016:98;;-1:-1:-1;;;53016:98:0;;52717:226;;-1:-1:-1;;;;;;53016:19:0::1;:26;::::0;::::1;::::0;:98:::1;::::0;53059:17:::1;::::0;53086:6;;52717:226;;53016:98:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;53016:98:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;53016:98:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53016:98:0;;;;;;;;;53246:45;::::0;-1:-1:-1;;;53246:45:0;;52987:127;;-1:-1:-1;;;;;;53246:30:0;::::1;::::0;::::1;::::0;:45:::1;::::0;53285:4:::1;::::0;53246:45:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;53246:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;53298:40:0::1;::::0;-1:-1:-1;;;53298:40:0;;-1:-1:-1;;;;;53298:30:0;::::1;::::0;-1:-1:-1;53298:30:0::1;::::0;-1:-1:-1;53298:40:0::1;::::0;53329:8:::1;::::0;53298:40:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;53298:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;53345:51:0::1;::::0;-1:-1:-1;;;53345:51:0;;-1:-1:-1;;;;;53345:30:0;::::1;::::0;-1:-1:-1;53345:30:0::1;::::0;-1:-1:-1;53345:51:0::1;::::0;53376:19:::1;::::0;53345:51:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;53345:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;53405:10:0::1;:25:::0;;-1:-1:-1;;;;;;53405:25:0::1;-1:-1:-1::0;;;;;53405:25:0;;::::1;::::0;;;::::1;::::0;;;;53478:11;;53439:51:::1;::::0;-1:-1:-1;53466:10:0;::::1;::::0;-1:-1:-1;53478:11:0;;-1:-1:-1;;53478:11:0::1;;;;;;;;;;53439:4;-1:-1:-1::0;;;;;53439:26:0::1;;;:51;;;;;:::i;:::-;53552:10;::::0;;53564:11;;53525:51:::1;::::0;-1:-1:-1;;;;;53552:10:0;;::::1;::::0;53564:8;;:11;::::1;;;;;;;;;;;53525:4;-1:-1:-1::0;;;;;53525:26:0::1;;;:51;;;;;:::i;:::-;-1:-1:-1::0;;53613:13:0::1;:41:::0;;-1:-1:-1;;53613:41:0::1;53629:25;53613:41;::::0;;-1:-1:-1;;;;;;;;;50880:2780:0:o;31412:148::-;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;31519:1:::1;31503:6:::0;;31482:40:::1;::::0;-1:-1:-1;;;;;31503:6:0;;::::1;::::0;31482:40:::1;::::0;31519:1;;31482:40:::1;31550:1;31533:19:::0;;-1:-1:-1;;;;;;31533:19:0::1;::::0;;31412:148::o;57486:221::-;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;57571:62:::1;-1:-1:-1::0;;;;;57571:33:0;::::1;46383:42;57631:1;57571:62;:33;:62;:::i;:::-;57666:35;:13;57687::::0;57666:35:::1;:20;:35;:::i;:::-;;57486:221:::0;:::o;30770:79::-;30808:7;30835:6;-1:-1:-1;;;;;30835:6:0;30770:79;:::o;57799:80::-;57865:11;;57799:80;:::o;57883:79::-;57949:10;;-1:-1:-1;;;;;57949:10:0;57883:79;:::o;56892:458::-;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;57008:4:::1;-1:-1:-1::0;;;;;56983:30:0::1;:13;-1:-1:-1::0;;;;;56983:30:0::1;;;56975:70;;;;-1:-1:-1::0;;;56975:70:0::1;;;;;;;;;57129:4;-1:-1:-1::0;;;;;57104:30:0::1;:13;-1:-1:-1::0;;;;;57104:30:0::1;;;57096:70;;;;-1:-1:-1::0;;;57096:70:0::1;;;;;;;;;57201:88;-1:-1:-1::0;;;;;57201:43:0;::::1;46383:42;-1:-1:-1::0;;57201:88:0::1;:43;:88;:::i;:::-;57312:32;:13;57330::::0;57312:32:::1;:17;:32;:::i;55102:658::-:0;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;55182:26:::1;55165:13:::0;;::::1;;:43;::::0;::::1;;;;;;;55157:69;;;;-1:-1:-1::0;;;55157:69:0::1;;;;;;;;;55241:10;::::0;-1:-1:-1;;;;;55241:10:0::1;55233:74;;;;-1:-1:-1::0;;;55233:74:0::1;;;;;;;;;55368:10;::::0;55408:11:::1;::::0;;-1:-1:-1;;;55408:11:0;;;;-1:-1:-1;;;;;55368:10:0;;::::1;::::0;55316:26:::1;::::0;55368:10;;55408:9:::1;::::0;:11:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;55368:10;55408:11;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;55408:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;55408:11:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;55408:11:0;;;;;;;;;-1:-1:-1::0;;;;;55400:34:0::1;;;55392:86;;;;-1:-1:-1::0;;;55392:86:0::1;;;;;;;;;55487:53;::::0;-1:-1:-1;;;55487:53:0;;-1:-1:-1;;;;;55487:38:0;::::1;::::0;::::1;::::0;:53:::1;::::0;55534:4:::1;::::0;55487:53:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;55487:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;55547:27:0::1;::::0;-1:-1:-1;;;55547:27:0;;-1:-1:-1;;;;;55547:17:0;::::1;::::0;-1:-1:-1;55547:17:0::1;::::0;-1:-1:-1;55547:27:0::1;::::0;55565:8:::1;::::0;55547:27:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;55547:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;55547:27:0;;;;55620:82;55652:19;55673:3;-1:-1:-1::0;;;;;55673:13:0::1;;55695:4;55673:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;55673:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;55673:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;55673:28:0;;;;;;;;;55627:10;::::0;-1:-1:-1;;;;;55627:10:0::1;::::0;55620:82;::::1;:31;:82;:::i;:::-;-1:-1:-1::0;55715:13:0::1;:39:::0;;-1:-1:-1;;55715:39:0::1;55731:23;55715:39;::::0;;55102:658::o;45769:33::-;;;:::o;56531:102::-;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;56601:11:::1;:26:::0;56531:102::o;56023:293::-;56133:7;:5;:7::i;:::-;-1:-1:-1;;;;;56119:21:0;:10;-1:-1:-1;;;;;56119:21:0;;:65;;;;-1:-1:-1;56161:23:0;56144:13;;;;:40;;;;;;;;;56119:65;56118:93;;;-1:-1:-1;56189:10:0;-1:-1:-1;;;;;56203:8:0;56189:22;;56118:93;56110:116;;;;-1:-1:-1;;;56110:116:0;;;;;;;;;56257:6;56271:39;-1:-1:-1;;;;;56271:18:0;;56290:10;56302:7;56271:39;:18;:39;:::i;:::-;56023:293;;;;:::o;57966:200::-;58043:10;;58019:7;;-1:-1:-1;;;;;58043:10:0;58035:60;;;;-1:-1:-1;;;58035:60:0;;;;;;;;;58140:10;;;;;;;;;-1:-1:-1;;;;;58140:10:0;-1:-1:-1;;;;;58117:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58117:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58117:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;58117:42:0;;;;;;;;;58102:58;;57966:200;:::o;45807:44::-;;;:::o;31715:244::-;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;-1:-1:-1;;;;;31804:22:0;::::1;31796:73;;;;-1:-1:-1::0;;;31796:73:0::1;;;;;;;;;31906:6;::::0;;31885:38:::1;::::0;-1:-1:-1;;;;;31885:38:0;;::::1;::::0;31906:6;::::1;::::0;31885:38:::1;::::0;::::1;31934:6;:17:::0;;-1:-1:-1;;;;;;31934:17:0::1;-1:-1:-1::0;;;;;31934:17:0;;;::::1;::::0;;;::::1;::::0;;31715:244::o;58301:349::-;58352:16;58377:17;58397:22;:13;:20;:22::i;:::-;58377:42;;58428:33;58478:9;58464:24;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58464:24:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;58464:24:0;-1:-1:-1;58428:60:0;-1:-1:-1;58500:13:0;58495:118;58527:9;58519:5;:17;58495:118;;;58582:23;:13;58599:5;58582:23;:16;:23;:::i;:::-;58556:16;58573:5;58556:23;;;;;;;;-1:-1:-1;;;;;58556:49:0;;;:23;;;;;;;;;;;:49;58538:7;;58495:118;;;-1:-1:-1;58627:16:0;-1:-1:-1;;58301:349:0;:::o;53971:933::-;30992:12;:10;:12::i;:::-;30982:6;;-1:-1:-1;;;;;30982:6:0;;;:22;;;30974:67;;;;-1:-1:-1;;;30974:67:0;;;;;;;;;54052:25:::1;54035:13;::::0;::::1;;:42;::::0;::::1;;;;;;;54027:68;;;;-1:-1:-1::0;;;54027:68:0::1;;;;;;;;;54110:10;::::0;-1:-1:-1;;;;;54110:10:0::1;54102:73;;;;-1:-1:-1::0;;;54102:73:0::1;;;;;;;;;54240:10;::::0;54289:168:::1;::::0;-1:-1:-1;;;54289:168:0;;-1:-1:-1;;;;;54240:10:0;;::::1;::::0;;;54289:14:::1;::::0;:168:::1;::::0;54312:15:::1;::::0;54356:6:::1;::::0;;;54289:168:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;54289:168:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;54498:16:0::1;::::0;;54512:1:::1;54498:16:::0;;;54466:29:::1;54498:16:::0;;::::1;::::0;;54466:29;-1:-1:-1;54498:16:0;;-1:-1:-1;54512:1:0;54498:16:::1;::::0;::::1;::::0;;109:14:-1::1;54498:16:0::0;88:42:-1::1;144:17;::::0;-1:-1;;54466:48:0;-1:-1:-1;54539:39:0::1;54575:2;54539:31;44450:6;54566:3;54539:31;:26;:31;:::i;:39::-;54521:12;54534:1;54521:15;;;;;;;;;::::0;;::::1;::::0;;;;;:57;54611:38:::1;54646:2;54611:30;44450:6;54638:2;54611:30;:26;:30;:::i;:38::-;54593:12;54606:1;54593:15;;;;;;;;;::::0;;::::1;::::0;;;;;:56;-1:-1:-1;;;;;54717:26:0;::::1;;54752:12:::0;54773:15:::1;54797:28;54773:15:::0;54817:7:::1;54797:28;:19;:28;:::i;:::-;54717:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;54717:130:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;54872:26:0::1;54856:42:::0;;-1:-1:-1;;54856:42:0::1;::::0;::::1;::::0;;-1:-1:-1;;;;53971:933:0:o;17213:286::-;17310:20;17333:50;17377:5;17333;-1:-1:-1;;;;;17333:15:0;;17357:4;17364:7;17333:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17333:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17333:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17333:39:0;;;;;;;;;:43;:50;:43;:50;:::i;:::-;17310:73;;17394:97;17414:5;17444:22;;;17468:7;17477:12;17421:69;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;17421:69:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17421:69:0;;;179:29:-1;;;;160:49;;;17394:19:0;:97::i;25653:143::-;25723:4;25747:41;25752:3;-1:-1:-1;;;;;25772:14:0;;25747:4;:41::i;:::-;25740:48;25653:143;-1:-1:-1;;;25653:143:0:o;3773:181::-;3831:7;3863:5;;;3887:6;;;;3879:46;;;;-1:-1:-1;;;3879:46:0;;;;;;;;11923:195;12026:12;12058:52;12080:6;12088:4;12094:1;12097:12;12058:21;:52::i;:::-;12051:59;11923:195;-1:-1:-1;;;;11923:195:0:o;26207:158::-;26287:4;26311:46;26321:3;-1:-1:-1;;;;;26341:14:0;;26311:9;:46::i;29307:106::-;29395:10;29307:106;:::o;26451:117::-;26514:7;26541:19;26549:3;26541:7;:19::i;26912:149::-;26986:7;27029:22;27033:3;27045:5;27029:3;:22::i;5127:471::-;5185:7;5430:6;5426:47;;-1:-1:-1;5460:1:0;5453:8;;5426:47;5497:5;;;5501:1;5497;:5;:1;5521:5;;;;;:10;5513:56;;;;-1:-1:-1;;;5513:56:0;;;;;;;;6074:132;6132:7;6159:39;6163:1;6166;6159:39;;;;;;;;;;;;;;;;;:3;:39::i;16583:622::-;16953:10;;;16952:62;;-1:-1:-1;16969:39:0;;-1:-1:-1;;;16969:39:0;;-1:-1:-1;;;;;16969:15:0;;;;;:39;;16993:4;;17000:7;;16969:39;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16969:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16969:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16969:39:0;;;;;;;;;:44;16952:62;16944:152;;;;-1:-1:-1;;;16944:152:0;;;;;;;;;17107:90;17127:5;17157:22;;;17181:7;17190:5;17134:62;;;;;;;;;;17107:90;16583:622;;;:::o;25972:149::-;26045:4;26069:44;26077:3;-1:-1:-1;;;;;26097:14:0;;26069:7;:44::i;15924:177::-;16007:86;16027:5;16057:23;;;16082:2;16086:5;16034:58;;;;;;;;;;18229:761;18653:23;18679:69;18707:4;18679:69;;;;;;;;;;;;;;;;;18687:5;-1:-1:-1;;;;;18679:27:0;;;:69;;;;;:::i;:::-;18763:17;;18653:95;;-1:-1:-1;18763:21:0;18759:224;;18905:10;18894:30;;;;;;;;;;;;;;18886:85;;;;-1:-1:-1;;;18886:85:0;;;;;;;;20717:414;20780:4;20802:21;20812:3;20817:5;20802:9;:21::i;:::-;20797:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;20840:11:0;:23;;;;;;;;;;;;;21023:18;;21001:19;;;:12;;;:19;;;;;;:40;;;;21056:11;;20797:327;-1:-1:-1;21107:5:0;21100:12;;12975:530;13102:12;13160:5;13135:21;:30;;13127:81;;;;-1:-1:-1;;;13127:81:0;;;;;;;;;13227:18;13238:6;13227:10;:18::i;:::-;13219:60;;;;-1:-1:-1;;;13219:60:0;;;;;;;;;13353:12;13367:23;13394:6;-1:-1:-1;;;;;13394:11:0;13414:5;13422:4;13394:33;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;13352:75:0;;;;13445:52;13463:7;13472:10;13484:12;13445:17;:52::i;:::-;13438:59;12975:530;-1:-1:-1;;;;;;;12975:530:0:o;22937:129::-;23010:4;23034:19;;;:12;;;;;:19;;;;;;:24;;;22937:129::o;23152:109::-;23235:18;;23152:109::o;23605:204::-;23700:18;;23672:7;;23700:26;-1:-1:-1;23692:73:0;;;;-1:-1:-1;;;23692:73:0;;;;;;;;;23783:3;:11;;23795:5;23783:18;;;;;;;;;;;;;;;;23776:25;;23605:204;;;;:::o;6702:278::-;6788:7;6823:12;6816:5;6808:28;;;;-1:-1:-1;;;6808:28:0;;;;;;;;;;;6847:9;6863:1;6859;:5;;;;;;;6702:278;-1:-1:-1;;;;;6702:278:0:o;21307:1544::-;21373:4;21512:19;;;:12;;;:19;;;;;;21548:15;;21544:1300;;21983:18;;-1:-1:-1;;21934:14:0;;;;21983:22;;;;21910:21;;21983:3;;:22;;22270;;;;;;;;;;;;;;22250:42;;22416:9;22387:3;:11;;22399:13;22387:26;;;;;;;;;;;;;;;;;;;:38;;;;22493:23;;;22535:1;22493:12;;;:23;;;;;;22519:17;;;22493:43;;22645:17;;22493:3;;22645:17;;;;;;;;;;;;;;;;;;;;;;22740:3;:12;;:19;22753:5;22740:19;;;;;;;;;;;22733:26;;;22783:4;22776:11;;;;;;;;21544:1300;22827:5;22820:12;;;;;9005:422;9372:20;9411:8;;;9005:422::o;14511:742::-;14626:12;14655:7;14651:595;;;-1:-1:-1;14686:10:0;14679:17;;14651:595;14800:17;;:21;14796:439;;15063:10;15057:17;15124:15;15111:10;15107:2;15103:19;15096:44;15011:148;15206:12;15199:20;;-1:-1:-1;;;15199:20:0;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1305:241::-;;1409:2;1397:9;1388:7;1384:23;1380:32;1377:2;;;-1:-1;;1415:12;1377:2;85:6;72:20;97:33;124:5;97:33;;1553:491;;;;1691:2;1679:9;1670:7;1666:23;1662:32;1659:2;;;-1:-1;;1697:12;1659:2;85:6;72:20;97:33;124:5;97:33;;;1749:63;-1:-1;1849:2;1888:22;;72:20;97:33;72:20;97:33;;;1653:391;;1857:63;;-1:-1;;;1957:2;1996:22;;;;1094:20;;1653:391;2051:397;;;2190:2;2178:9;2169:7;2165:23;2161:32;2158:2;;;-1:-1;;2196:12;2158:2;2254:17;2241:31;2292:18;;2284:6;2281:30;2278:2;;;-1:-1;;2314:12;2278:2;2415:6;2404:9;2400:22;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;341:6;328:20;318:30;;2292:18;360:6;357:30;354:2;;;-1:-1;;390:12;354:2;485:3;2190:2;;469:6;465:17;426:6;451:32;;448:41;445:2;;;-1:-1;;492:12;445:2;2190;422:17;;2342:90;;-1:-1;2152:296;;-1:-1;;;;2152:296;2455:257;;2567:2;2555:9;2546:7;2542:23;2538:32;2535:2;;;-1:-1;;2573:12;2535:2;601:6;595:13;40486:5;38739:13;38732:21;40464:5;40461:32;40451:2;;-1:-1;;40497:12;2719:291;;2848:2;2836:9;2827:7;2823:23;2819:32;2816:2;;;-1:-1;;2854:12;2816:2;753:6;747:13;765:47;806:5;765:47;;3349:241;;3453:2;3441:9;3432:7;3428:23;3424:32;3421:2;;;-1:-1;;3459:12;3421:2;-1:-1;1094:20;;3415:175;-1:-1;3415:175;3597:263;;3712:2;3700:9;3691:7;3687:23;3683:32;3680:2;;;-1:-1;;3718:12;3680:2;-1:-1;1242:13;;3674:186;-1:-1;3674:186;3868:173;-1:-1;;;;;39217:54;4292:37;;4030:4;4021:14;;3948:93;5201:690;;5394:5;36688:12;37481:6;37476:3;37469:19;37518:4;;37513:3;37509:14;5406:93;;37518:4;5570:5;36384:14;-1:-1;5609:260;5634:6;5631:1;5628:13;5609:260;;;5695:13;;-1:-1;;;;;39217:54;4292:37;;4021:14;;;;37219;;;;2292:18;5649:9;5609:260;;;-1:-1;5875:10;;5325:566;-1:-1;;;;;5325:566;5930:670;;6113:5;36688:12;37481:6;37476:3;37469:19;37518:4;;37513:3;37509:14;6125:83;;37518:4;6279:5;36384:14;-1:-1;6318:260;6343:6;6340:1;6337:13;6318:260;;;6404:13;;20669:37;;4203:14;;;;37219;;;;6365:1;6358:9;6318:260;;8427:327;;8562:5;36688:12;37481:6;37476:3;37469:19;8646:52;8691:6;37518:4;37513:3;37509:14;37518:4;8672:5;8668:16;8646:52;;;40144:7;40128:14;-1:-1;;40124:28;8710:39;;;;37518:4;8710:39;;8509:245;-1:-1;;8509:245;19478:1123;19703:16;19697:23;38739:13;38732:21;7399:3;7392:34;19874:4;19867:5;19863:16;19857:23;38739:13;38732:21;19874:4;19932:3;19928:14;7392:34;20034:4;20027:5;20023:16;20017:23;38739:13;38732:21;20034:4;20092:3;20088:14;7392:34;20196:4;20189:5;20185:16;20179:23;38739:13;38732:21;20196:4;20254:3;20250:14;7392:34;20355:4;20348:5;20344:16;20338:23;38739:13;38732:21;20355:4;20413:3;20409:14;7392:34;20511:4;20504:5;20500:16;20494:23;38739:13;38732:21;20511:4;20569:3;20565:14;7392:34;19592:1009;;;20838:271;;7709:5;36688:12;7820:52;7865:6;7860:3;7853:4;7846:5;7842:16;7820:52;;;7884:16;;;;;20972:137;-1:-1;;20972:137;21116:222;-1:-1;;;;;39217:54;;;;4292:37;;21243:2;21228:18;;21214:124;21345:333;-1:-1;;;;;39217:54;;;4292:37;;39217:54;;21664:2;21649:18;;4292:37;21500:2;21485:18;;21471:207;21685:701;;21972:3;2292:18;;39228:42;;;39221:5;39217:54;4299:3;4292:37;22091:2;21972:3;22091:2;22080:9;22076:18;22069:48;18010:16;18004:23;17927:4;21972:3;21961:9;21957:19;18040:38;18093:73;17918:14;21961:9;17918:14;18147:12;18093:73;;;18085:81;;;22091:2;18253:5;18249:16;18243:23;18302:14;;;21961:9;18306:4;18302:14;;18286;21961:9;18286:14;18279:38;18332:73;18400:4;18386:12;18332:73;;;18503:4;18496:5;18492:16;18486:23;18466:43;;18302:14;21961:9;18549:4;18545:14;;18529;21961:9;18529:14;18522:38;18575:103;;;4675:5;36688:12;4694:76;4763:6;4758:3;4694:76;;;-1:-1;;4687:83;;-1:-1;36384:14;;;-1:-1;4880:260;4905:6;4902:1;4899:13;4880:260;;;4993:63;5052:3;4972:6;4966:13;4993:63;;;4986:70;;22091:2;5126:6;37219:14;5063:70;;4927:1;4924;4920:9;4915:14;;4880:260;;;4884:14;;18772:4;18765:5;18761:16;18755:23;18735:43;;18302:14;21961:9;18818:4;18814:14;;18798;21961:9;18798:14;18791:38;18844:103;18942:4;18928:12;18844:103;;;18836:111;;19040:4;19033:5;19029:16;19023:23;19003:43;;18302:14;21961:9;19086:4;19082:14;;19066;21961:9;19066:14;19059:38;;;19112:103;19210:4;19196:12;19112:103;;;19303:4;19292:16;;19286:23;19363:14;;;20669:37;22123:122;-1:-1;22256:120;;-1:-1;;18503:4;22357:18;;22348:6;22256:120;;22393:333;-1:-1;;;;;39217:54;;;;4292:37;;22712:2;22697:18;;20669:37;22548:2;22533:18;;22519:207;22733:370;;22910:2;22931:17;22924:47;22985:108;22910:2;22899:9;22895:18;23079:6;22985:108;;23110:592;;23343:2;23364:17;23357:47;23418:108;23343:2;23332:9;23328:18;23512:6;23418:108;;;23605:2;23590:18;;20669:37;;;;-1:-1;23688:2;23673:18;20669:37;23410:116;23314:388;-1:-1;23314:388;23709:210;38739:13;;38732:21;7392:34;;23830:2;23815:18;;23801:118;23926:254;24069:2;24054:18;;40252:1;40242:12;;40232:2;;40258:9;40232:2;7999:66;;;24040:140;;24187:554;8177:79;;;24631:2;24616:18;;8177:79;;;;24727:2;24712:18;;8177:79;24425:2;24410:18;;24396:345;24748:310;;24895:2;24916:17;24909:47;24970:78;24895:2;24884:9;24880:18;25034:6;24970:78;;25065:416;25265:2;25279:47;;;9340:2;25250:18;;;37469:19;9376:34;37509:14;;;9356:55;-1:-1;;;9431:12;;;9424:26;9469:12;;;25236:245;25488:416;25688:2;25702:47;;;9720:2;25673:18;;;37469:19;-1:-1;;;37509:14;;;9736:37;9792:12;;;25659:245;25911:416;26111:2;26125:47;;;10043:2;26096:18;;;37469:19;10079:34;37509:14;;;10059:55;-1:-1;;;10134:12;;;10127:30;10176:12;;;26082:245;26334:416;26534:2;26548:47;;;10427:2;26519:18;;;37469:19;10463:29;37509:14;;;10443:50;10512:12;;;26505:245;26757:416;26957:2;26971:47;;;10763:2;26942:18;;;37469:19;10799:34;37509:14;;;10779:55;-1:-1;;;10854:12;;;10847:30;10896:12;;;26928:245;27180:416;27380:2;27394:47;;;11147:2;27365:18;;;37469:19;11183:34;37509:14;;;11163:55;-1:-1;;;11238:12;;;11231:31;11281:12;;;27351:245;27603:416;27803:2;27817:47;;;11532:2;27788:18;;;37469:19;-1:-1;;;37509:14;;;11548:33;11600:12;;;27774:245;28026:416;28226:2;28240:47;;;11851:2;28211:18;;;37469:19;11887:34;37509:14;;;11867:55;-1:-1;;;11942:12;;;11935:30;11984:12;;;28197:245;28449:416;28649:2;28663:47;;;12235:2;28634:18;;;37469:19;-1:-1;;;37509:14;;;12251:38;12308:12;;;28620:245;28872:416;29072:2;29086:47;;;12559:2;29057:18;;;37469:19;12595:34;37509:14;;;12575:55;-1:-1;;;12650:12;;;12643:31;12693:12;;;29043:245;29295:416;29495:2;29509:47;;;12944:2;29480:18;;;37469:19;12980:34;37509:14;;;12960:55;-1:-1;;;13035:12;;;13028:29;13076:12;;;29466:245;29718:416;29918:2;29932:47;;;13327:2;29903:18;;;37469:19;13363:34;37509:14;;;13343:55;-1:-1;;;13418:12;;;13411:34;13464:12;;;29889:245;30141:416;30341:2;30355:47;;;13715:2;30326:18;;;37469:19;13751:34;37509:14;;;13731:55;-1:-1;;;13806:12;;;13799:25;13843:12;;;30312:245;30564:416;30764:2;30778:47;;;14094:2;30749:18;;;37469:19;-1:-1;;;37509:14;;;14110:36;14165:12;;;30735:245;30987:416;31187:2;31201:47;;;31172:18;;;37469:19;14452:34;37509:14;;;14432:55;14506:12;;;31158:245;31410:416;31610:2;31624:47;;;14757:2;31595:18;;;37469:19;14793:34;37509:14;;;14773:55;-1:-1;;;14848:12;;;14841:34;14894:12;;;31581:245;31833:416;32033:2;32047:47;;;15145:2;32018:18;;;37469:19;15181:31;37509:14;;;15161:52;15232:12;;;32004:245;32256:416;32456:2;32470:47;;;15483:2;32441:18;;;37469:19;15519:27;37509:14;;;15499:48;15566:12;;;32427:245;32679:416;32879:2;32893:47;;;15817:2;32864:18;;;37469:19;15853:29;37509:14;;;15833:50;15902:12;;;32850:245;33102:416;33302:2;33316:47;;;16153:2;33287:18;;;37469:19;16189:29;37509:14;;;16169:50;16238:12;;;33273:245;33525:416;33725:2;33739:47;;;16489:2;33710:18;;;37469:19;-1:-1;;;37509:14;;;16505:41;16565:12;;;33696:245;33948:416;34148:2;34162:47;;;16816:2;34133:18;;;37469:19;16852:34;37509:14;;;16832:55;-1:-1;;;16907:12;;;16900:34;16953:12;;;34119:245;34371:416;34571:2;34585:47;;;17204:2;34556:18;;;37469:19;-1:-1;;;37509:14;;;17220:36;17275:12;;;34542:245;34794:416;34994:2;35008:47;;;17526:2;34979:18;;;37469:19;17562:34;37509:14;;;17542:55;-1:-1;;;17617:12;;;17610:46;17675:12;;;34965:245;35217:222;20669:37;;;35344:2;35329:18;;35315:124;35446:816;;20699:5;20676:3;20669:37;20699:5;35900:2;35889:9;35885:18;20669:37;35735:3;35937:2;35926:9;35922:18;35915:48;35977:108;35735:3;35724:9;35720:19;36071:6;35977:108;;;-1:-1;;;;;39217:54;;;;36164:2;36149:18;;4292:37;-1:-1;36247:3;36232:19;20669:37;35969:116;35706:556;-1:-1;;;35706:556;39784:268;39849:1;39856:101;39870:6;39867:1;39864:13;39856:101;;;39937:11;;;39931:18;39918:11;;;39911:39;39892:2;39885:10;39856:101;;;39972:6;39969:1;39966:13;39963:2;;;-1:-1;;39849:1;40019:16;;40012:27;39833:219;40281:117;-1:-1;;;;;39217:54;;40340:35;;40330:2;;40389:1;;40379:12;40330:2;40324:74;
Swarm Source
ipfs://c4a910178cd49074b44daf6d33d9aac1d8a302f95780688e0299e64e2b8ba011
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.