Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 31 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Depreciated | 11239663 | 1936 days ago | IN | 0 ETH | 0.00056606 | ||||
| Execute Strategy | 11239516 | 1936 days ago | IN | 0 ETH | 0.02503485 | ||||
| Add New Strategy | 11239463 | 1936 days ago | IN | 0 ETH | 0.01088627 | ||||
| Execute Strategy | 11238725 | 1936 days ago | IN | 0 ETH | 0.01192556 | ||||
| Execute Strategy | 11238419 | 1936 days ago | IN | 0 ETH | 0.02930272 | ||||
| Execute Strategy | 11238387 | 1936 days ago | IN | 0 ETH | 0.03913604 | ||||
| Execute Strategy | 11238361 | 1936 days ago | IN | 0 ETH | 0.0068639 | ||||
| Execute Strategy | 11238355 | 1936 days ago | IN | 0 ETH | 0.02910065 | ||||
| Add New Strategy | 11238308 | 1936 days ago | IN | 0 ETH | 0.0139158 | ||||
| Add New Strategy | 11238277 | 1936 days ago | IN | 0 ETH | 0.0142029 | ||||
| Add New Strategy | 11238277 | 1936 days ago | IN | 0 ETH | 0.00433767 | ||||
| Add New Strategy | 11238190 | 1936 days ago | IN | 0 ETH | 0.00677446 | ||||
| Add New Strategy | 11238082 | 1936 days ago | IN | 0 ETH | 0.00539016 | ||||
| Execute Strategy | 11237515 | 1936 days ago | IN | 0 ETH | 0.04833576 | ||||
| Execute Strategy | 11237431 | 1936 days ago | IN | 0 ETH | 0.00874162 | ||||
| Execute Strategy | 11237431 | 1936 days ago | IN | 0 ETH | 0.0597605 | ||||
| Execute Strategy | 11237225 | 1936 days ago | IN | 0 ETH | 0.01645542 | ||||
| Execute Strategy | 11237169 | 1936 days ago | IN | 0 ETH | 0.01357279 | ||||
| Execute Strategy | 11237080 | 1936 days ago | IN | 0 ETH | 0.0239042 | ||||
| Execute Strategy | 11236788 | 1937 days ago | IN | 0 ETH | 0.03877942 | ||||
| Execute Strategy | 11236746 | 1937 days ago | IN | 0 ETH | 0.03231618 | ||||
| Execute Strategy | 11236631 | 1937 days ago | IN | 0 ETH | 0.02937835 | ||||
| Execute Strategy | 11236507 | 1937 days ago | IN | 0 ETH | 0.04301797 | ||||
| Execute Strategy | 11236499 | 1937 days ago | IN | 0 ETH | 0.0060287 | ||||
| Execute Strategy | 11236473 | 1937 days ago | IN | 0 ETH | 0.00452152 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FlashArbitrageController
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-11-11
*/
// Sources flattened with hardhat v2.0.1 https://hardhat.org
// File @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol@v1.0.1
pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// File @uniswap/lib/contracts/libraries/AddressStringUtil.sol@v1.1.4
pragma solidity >=0.5.0;
library AddressStringUtil {
// converts an address to the uppercase hex string, extracting only len bytes (up to 20, multiple of 2)
function toAsciiString(address addr, uint len) pure internal returns (string memory) {
require(len % 2 == 0 && len > 0 && len <= 40, "AddressStringUtil: INVALID_LEN");
bytes memory s = new bytes(len);
uint addrNum = uint(addr);
for (uint i = 0; i < len / 2; i++) {
// shift right and truncate all but the least significant byte to extract the byte at position 19-i
uint8 b = uint8(addrNum >> (8 * (19 - i)));
// first hex character is the most significant 4 bits
uint8 hi = b >> 4;
// second hex character is the least significant 4 bits
uint8 lo = b - (hi << 4);
s[2 * i] = char(hi);
s[2 * i + 1] = char(lo);
}
return string(s);
}
// hi and lo are only 4 bits and between 0 and 16
// this method converts those values to the unicode/ascii code point for the hex representation
// uses upper case for the characters
function char(uint8 b) pure private returns (byte c) {
if (b < 10) {
return byte(b + 0x30);
} else {
return byte(b + 0x37);
}
}
}
// File @uniswap/lib/contracts/libraries/SafeERC20Namer.sol@v1.1.4
pragma solidity >=0.5.0;
// produces token descriptors from inconsistent or absent ERC20 symbol implementations that can return string or bytes32
// this library will always produce a string symbol to represent the token
library SafeERC20Namer {
function bytes32ToString(bytes32 x) pure private returns (string memory) {
bytes memory bytesString = new bytes(32);
uint charCount = 0;
for (uint j = 0; j < 32; j++) {
byte char = x[j];
if (char != 0) {
bytesString[charCount] = char;
charCount++;
}
}
bytes memory bytesStringTrimmed = new bytes(charCount);
for (uint j = 0; j < charCount; j++) {
bytesStringTrimmed[j] = bytesString[j];
}
return string(bytesStringTrimmed);
}
// assumes the data is in position 2
function parseStringData(bytes memory b) pure private returns (string memory) {
uint charCount = 0;
// first parse the charCount out of the data
for (uint i = 32; i < 64; i++) {
charCount <<= 8;
charCount += uint8(b[i]);
}
bytes memory bytesStringTrimmed = new bytes(charCount);
for (uint i = 0; i < charCount; i++) {
bytesStringTrimmed[i] = b[i + 64];
}
return string(bytesStringTrimmed);
}
// uses a heuristic to produce a token name from the address
// the heuristic returns the full hex of the address string in upper case
function addressToName(address token) pure private returns (string memory) {
return AddressStringUtil.toAsciiString(token, 40);
}
// uses a heuristic to produce a token symbol from the address
// the heuristic returns the first 6 hex of the address string in upper case
function addressToSymbol(address token) pure private returns (string memory) {
return AddressStringUtil.toAsciiString(token, 6);
}
// calls an external view token contract method that returns a symbol or name, and parses the output into a string
function callAndParseStringReturn(address token, bytes4 selector) view private returns (string memory) {
(bool success, bytes memory data) = token.staticcall(abi.encodeWithSelector(selector));
// if not implemented, or returns empty data, return empty string
if (!success || data.length == 0) {
return "";
}
// bytes32 data always has length 32
if (data.length == 32) {
bytes32 decoded = abi.decode(data, (bytes32));
return bytes32ToString(decoded);
} else if (data.length > 64) {
return abi.decode(data, (string));
}
return "";
}
// attempts to extract the token symbol. if it does not implement symbol, returns a symbol derived from the address
function tokenSymbol(address token) internal view returns (string memory) {
// 0x95d89b41 = bytes4(keccak256("symbol()"))
string memory symbol = callAndParseStringReturn(token, 0x95d89b41);
if (bytes(symbol).length == 0) {
// fallback to 6 uppercase hex of address
return addressToSymbol(token);
}
return symbol;
}
// attempts to extract the token name. if it does not implement name, returns a name derived from the address
function tokenName(address token) internal view returns (string memory) {
// 0x06fdde03 = bytes4(keccak256("name()"))
string memory name = callAndParseStringReturn(token, 0x06fdde03);
if (bytes(name).length == 0) {
// fallback to full hex of address
return addressToName(token);
}
return name;
}
}
// File @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol@v3.0.0
pragma solidity ^0.6.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-ethereum-package/contracts/math/SafeMath.sol@v3.0.0
pragma solidity ^0.6.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) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File @openzeppelin/contracts/GSN/Context.sol@v3.2.0
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.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@v3.2.0
pragma solidity ^0.6.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.
*/
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 contracts/v612/FlashArbitrageController.sol
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;
// import "hardhat/console.sol";
// _________ ________ _____________________
// \_ ___ \ \_____ \\______ \_ _____/
// / \ \/ / | \| _/| __)_
// \ \____/ | \ | \| \
// \______ /\_______ /____|_ /_______ /
// \/ \/ \/ \/
// ___________.____ _____ _________ ___ ___
// \_ _____/| | / _ \ / _____// | \
// | __) | | / /_\ \ \_____ \/ ~ \
// | \ | |___/ | \/ \ Y /
// \___ / |_______ \____|__ /_______ /\___|_ /
// \/ \/ \/ \/ \/
// _____ ____________________.________________________ _____ ___________________
// / _ \\______ \______ \ \__ ___/\______ \ / _ \ / _____/\_ _____/
// / /_\ \| _/| | _/ | | | | _/ / /_\ \/ \ ___ | __)_
// / | \ | \| | \ | | | | | \/ | \ \_\ \| \
// \____|__ /____|_ /|______ /___| |____| |____|_ /\____|__ /\______ /_______ /
// \/ \/ \/ \/ \/ \/ \/
// Controller
//
// This contract checks for opportunities to gain profit for all of DEXs out there
// But especially the CORE ecosystem because this contract can tell another contrac to turn feeOff for the duration of its trades
// By arbitraging all existing pools, and transfering profits to FeeSplitter
// That will add rewards to specific pools to keep them at X% APY
// And add liquidity and subsequently burn the liquidity tokens after all pools reach this threashold
//
// .edee... ..... .eeec. ..eee..
// .d*" """"*e..d*"""""**e..e*"" "*c.d"" ""*e.
// z" "$ $"" *F **e.
// z" "c d" *. "$.
// .F " " 'F
// d J%
// 3 . e"
// 4r e" . d"
// $ .d" . .F z ..zeeeeed"
// "*beeeP" P d e. $**"" "
// "*b. Jbc. z*%e.. .$**eeeeP"
// "*beee* "$$eeed" ^$$$"" "
// '$$. .$$$c
// "$$. e$$*$$c
// "$$..$$P" '$$r
// "$$$$" "$$. .d
// z. .$$$" "$$. .dP"
// ^*e e$$" "$$. .e$"
// *b. .$$P" "$$. z$"
// "$c e$$" "$$.z$*"
// ^*e$$P" "$$$"
// *$$ "$$r
// '$$F .$$P
// $$$ z$$"
// 4$$ d$$b.
// .$$% .$$*"*$$e.
// e$$$*" z$$" "*$$e.
// 4$$" d$P" "*$$e.
// $P .d$$$c "*$$e..
// d$" z$$" *$b. "*$L
// 4$" e$P" "*$c ^$$
// $" .d$" "$$. ^$r
// dP z$$" ^*$e. "b
// 4$ e$P "$$ "
// J$F $$
// $$ .$F
// 4$" $P"
// $" dP kjRWG0tKD4A
//
// I'll have you know...
interface IFlashArbitrageExecutor {
function getStrategyProfitInReturnToken(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out) external view returns (uint256);
function executeStrategy(uint256) external;
// Strategy that self calculates best input but costs gas
function executeStrategy(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external;
// strategy that does not calculate the best input meant for miners
function executeStrategy(uint256 borrowAmt, address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external;
function getOptimalInput(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out) external view returns (uint256);
}
contract FlashArbitrageController is Ownable {
using SafeMath for uint256;
event StrategyAdded(string indexed name, uint256 indexed id, address[] pairs, bool feeOff, address indexed originator);
struct Strategy {
string strategyName;
bool[] token0Out; // An array saying if token 0 should be out in this step
address[] pairs; // Array of pair addresses
uint256[] feeOnTransfers; //Array of fee on transfers 1% = 10
bool cBTCSupport; // Should the algorithm check for cBTC and wrap/unwrap it
// Note not checking saves gas
bool feeOff; // Allows for adding CORE strategies - where there is no fee on the executor
}
uint256 public revenueSplitFeeOffStrategy;
uint256 public revenueSplitFeeOnStrategy;
uint8 MAX_STEPS_LEN; // This variable is responsible to minimsing risk of gas limit strategies being added
// Which would always have 0 gas cost because they could never complete
address public distributor;
IFlashArbitrageExecutor public executor;
address public cBTC = 0x7b5982dcAB054C377517759d0D2a3a5D02615AB8;
address public CORE = 0x62359Ed7505Efc61FF1D56fEF82158CcaffA23D7;
address public wBTC = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599;
bool depreciated; // This contract can be upgraded to a new one
// But we don't want people to add new strategies if its depreciated
Strategy[] public strategies;
constructor (address _executor, address _distributor) public {
distributor = _distributor; // we dont hard set it because its not live yet
// So can't easily mock it in tests
executor = IFlashArbitrageExecutor(_executor);
revenueSplitFeeOffStrategy = 100; // 10%
revenueSplitFeeOnStrategy = 650; // 65%
MAX_STEPS_LEN = 20;
}
/////////////////
//// ADMIN SETTERS
//////////////////
//In case executor needs to be updated
function setExecutor(address _executor) onlyOwner public {
executor = IFlashArbitrageExecutor(_executor);
}
//In case executor needs to be updated
function setDistributor(address _distributor) onlyOwner public {
distributor = _distributor;
}
function setMaxStrategySteps(uint8 _maxSteps) onlyOwner public {
MAX_STEPS_LEN = _maxSteps;
}
function setDepreciated(bool _depreciated) onlyOwner public {
depreciated = _depreciated;
}
function setFeeSplit(uint256 _revenueSplitFeeOffStrategy, uint256 _revenueSplitFeeOnStrategy) onlyOwner public {
// We cap both fee splits to 20% max and 95% max
// This means people calling feeOff strategies get max 20% revenue
// And people calling feeOn strategies get max 95%
require(revenueSplitFeeOffStrategy <= 200, "FA : 20% max fee for feeOff revenue split");
require(revenueSplitFeeOnStrategy <= 950, "FA : 95% max fee for feeOff revenue split");
revenueSplitFeeOffStrategy = _revenueSplitFeeOffStrategy;
revenueSplitFeeOnStrategy = _revenueSplitFeeOnStrategy;
}
/////////////////
//// Views for strategies
//////////////////
function getOptimalInput(uint256 strategyPID) public view returns (uint256) {
Strategy memory currentStrategy = strategies[strategyPID];
return executor.getOptimalInput(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out);
}
// Returns the current profit of strateg if it was executed
// In return token - this means if you borrow CORE from CORe/cBTC pair
// This profit would be denominated in cBTC
// Since thats what you have to return
function strategyProfitInReturnToken(uint256 strategyID) public view returns (uint256 profit) {
Strategy memory currentStrategy = strategies[strategyID];
return executor.getStrategyProfitInReturnToken(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out);
}
// Returns information about the strategy
function strategyInfo(uint256 strategyPID) public view returns (Strategy memory){
return strategies[strategyPID];
}
function numberOfStrategies() public view returns (uint256) {
return strategies.length;
}
///////////////////
//// Strategy execution
//// And profit assurances
//////////////////
// Public function that executes a strategy
// since its all a flash swap
// the strategies can't lose money only gain
// so its appropriate that they are public here
// I don't think its possible that one of the strategies that is less profitable
// takes away money from the more profitable one
// Otherwise people would be able to do it anyway with their own contracts
function executeStrategy(uint256 strategyPID) public {
// function executeStrategy(address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport) external;
require(!depreciated, "This Contract is depreciated");
Strategy memory currentStrategy = strategies[strategyPID];
executor.executeStrategy(currentStrategy.pairs, currentStrategy.feeOnTransfers, currentStrategy.token0Out, currentStrategy.cBTCSupport);
// console.log("Executed Strategy");
// Eg. Token 0 was out so profit token is token 1
address profitToken = currentStrategy.token0Out[0] ?
IUniswapV2Pair(currentStrategy.pairs[0]).token1()
:
IUniswapV2Pair(currentStrategy.pairs[0]).token0();
// console.log("Profit token", profitToken);
uint256 profit = IERC20(profitToken).balanceOf(address(this));
// console.log("Profit ", profit);
// We split the profit based on the strategy
if(currentStrategy.feeOff) {
safeTransfer(profitToken, msg.sender, profit.mul(revenueSplitFeeOffStrategy).div(1000));
}
else {
safeTransfer(profitToken, msg.sender, profit.mul(revenueSplitFeeOnStrategy).div(1000));
}
// console.log("Send revenue split now have ", IERC20(profitToken).balanceOf(address(this)) );
safeTransfer(profitToken, distributor, IERC20(profitToken).balanceOf(address(this)));
}
///////////////////
//// Adding strategies
//////////////////
// Normal add without Fee Ontrasnfer being specified
function addNewStrategy(bool borrowToken0, address[] memory pairs) public returns (uint256 strategyID) {
uint256[] memory feeOnTransfers = new uint256[](pairs.length);
strategyID = addNewStrategyWithFeeOnTransferTokens(borrowToken0, pairs, feeOnTransfers);
}
//Adding strategy with fee on transfer support
function addNewStrategyWithFeeOnTransferTokens(bool borrowToken0, address[] memory pairs, uint256[] memory feeOnTransfers) public returns (uint256 strategyID) {
require(!depreciated, "This Contract is depreciated");
require(pairs.length <= MAX_STEPS_LEN, "FA Controller - too many steps");
require(pairs.length == feeOnTransfers.length, "FA Controller: Malformed Input - pairs and feeontransfers should equal");
bool[] memory token0Out = new bool[](pairs.length);
// First token out is the same as borrowTokenOut
token0Out[0] = borrowToken0;
address token0 = IUniswapV2Pair(pairs[0]).token0();
address token1 = IUniswapV2Pair(pairs[0]).token1();
if(msg.sender != owner()) {
require(token0 != CORE && token1 != CORE, "FA Controller: CORE strategies can be only added by an admin");
}
bool cBTCSupport;
// We turn on cbtc support if any of the borrow token pair has cbtc
if(token0 == cBTC || token1 == cBTC) cBTCSupport = true;
// Establish the first token out
address lastToken = borrowToken0 ? token0 : token1;
// console.log("Borrowing Token", lastToken);
string memory strategyName = append(
SafeERC20Namer.tokenSymbol(lastToken),
" price too low. In ",
SafeERC20Namer.tokenSymbol(token0), "/",
SafeERC20Namer.tokenSymbol(token1), " pair");
// console.log(strategyName);
// Loop over all other pairs
for (uint256 i = 1; i < token0Out.length; i++) {
address token0 = IUniswapV2Pair(pairs[i]).token0();
address token1 = IUniswapV2Pair(pairs[i]).token1();
if(msg.sender != owner()) {
require(token0 != CORE && token1 != CORE, "FA Controller: CORE strategies can be only added by an admin");
}
// console.log("Last token is", lastToken);
// console.log("pair is",pairs[i]);
// We turn on cbtc support if any of the pairs have cbts
if(lastToken == cBTC || lastToken == wBTC){
require(token0 == cBTC || token1 == cBTC || token0 == wBTC || token1 == wBTC,
"FA Controller: Malformed Input - pair does not contain previous token");
} else{
// We check if the token is in the next pair
// If its not then its a wrong input
// console.log("Last token", lastToken);
require(token0 == lastToken || token1 == lastToken, "FA Controller: Malformed Input - pair does not contain previous token");
}
// If last token is cBTC
// And the this pair has wBTC in it
// Then we should have the last token as wBTC
if(lastToken == cBTC) {
// console.log("Flipping here");
cBTCSupport = true;
// If last token is cBTC and this pair has wBTC and no cBTC
// Then we are inputting wBTC after unwrapping
if(token0 == wBTC || token1 == wBTC && token0 != cBTC && token1 != cBTC){
// The token we take out here is opposite of wbtc
// Token 0 is out if wBTC is token1
// Because we are inputting wBTC
token0Out[i] = wBTC == token1;
lastToken = wBTC == token1 ? token0 : token1;
}
}
// If last token is wBTC
// And cbtc is in this pair
// And wbtc isn't in this pair
// Then we wrapped cBTC
else if(lastToken == wBTC && token0 == cBTC || token1 == cBTC && token0 != wBTC && token1 != wBTC){
// explained above with cbtc
cBTCSupport = true;
token0Out[i] = cBTC == token1;
lastToken = cBTC == token1 ? token0 : token1;
// console.log("Token0 out from last wBTC");
}
//Default case with no cBTC support
else {
// If token 0 is the token we are inputting, the last one
// Then we take the opposite here
token0Out[i] = token1 == lastToken;
// We take the opposite
// So if we input token1
// Then token0 is out
lastToken = token0 == lastToken ? token1 : token0;
// console.log("Basic branch last token is ", lastToken);
// console.log("Basic branch last token1 is ", token1);
// console.log("Basic branch last token0 is ", token0);
// console.log("Token0 out from basic branch");
}
// console.log("Last token is", lastToken);
}
// address[] memory pairs, uint256[] memory feeOnTransfers, bool[] memory token0Out, bool cBTCSupport
strategies.push(
Strategy({
strategyName : strategyName,
token0Out : token0Out,
pairs : pairs,
feeOnTransfers : feeOnTransfers,
cBTCSupport : cBTCSupport,
feeOff : msg.sender == owner()
})
);
strategyID = strategies.length;
emit StrategyAdded(strategyName, strategyID, pairs, msg.sender == owner(), msg.sender);
}
///////////////////
//// Helper functions
//////////////////
function sendETH(address payable to, uint256 amt) internal {
// console.log("I'm transfering ETH", amt/1e18, to);
// throw exception on failure
to.transfer(amt);
}
function safeTransfer(address token, address to, uint256 value) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'FA Controller: TRANSFER_FAILED');
}
function getTokenSafeName(address token) public view returns (string memory) {
return SafeERC20Namer.tokenSymbol(token);
}
// A function that lets owner remove any tokens from this addrss
// note this address shoudn't hold any tokens
// And if it does that means someting already went wrong or someone send them to this address
function rescueTokens(address token, uint256 amt) public onlyOwner {
IERC20(token).transfer(owner(), amt);
}
function rescueETH(uint256 amt) public {
sendETH(0xd5b47B80668840e7164C1D1d81aF8a9d9727B421, amt);
}
// appends two strings together
function append(string memory a, string memory b, string memory c, string memory d, string memory e, string memory f) internal pure returns (string memory) {
return string(abi.encodePacked(a, b,c,d,e,f));
}
///////////////////
//// Additional functions
//////////////////
// This function is for people who do not want to reveal their strategies
// Note we can do this function because executor requires this contract to be a caller when doing feeoff stratgies
function skimToken(address _token) public {
IERC20 token = IERC20(_token);
uint256 balToken = token.balanceOf(address(this));
safeTransfer(_token, msg.sender, balToken.mul(revenueSplitFeeOffStrategy).div(1000));
safeTransfer(_token, distributor, token.balanceOf(address(this)));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_executor","type":"address"},{"internalType":"address","name":"_distributor","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"pairs","type":"address[]"},{"indexed":false,"internalType":"bool","name":"feeOff","type":"bool"},{"indexed":true,"internalType":"address","name":"originator","type":"address"}],"name":"StrategyAdded","type":"event"},{"inputs":[],"name":"CORE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"borrowToken0","type":"bool"},{"internalType":"address[]","name":"pairs","type":"address[]"}],"name":"addNewStrategy","outputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"borrowToken0","type":"bool"},{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"uint256[]","name":"feeOnTransfers","type":"uint256[]"}],"name":"addNewStrategyWithFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"executeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"contract IFlashArbitrageExecutor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"getOptimalInput","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenSafeName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfStrategies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueSplitFeeOffStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueSplitFeeOnStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_depreciated","type":"bool"}],"name":"setDepreciated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"}],"name":"setDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"}],"name":"setExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_revenueSplitFeeOffStrategy","type":"uint256"},{"internalType":"uint256","name":"_revenueSplitFeeOnStrategy","type":"uint256"}],"name":"setFeeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxSteps","type":"uint8"}],"name":"setMaxStrategySteps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"skimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategies","outputs":[{"internalType":"string","name":"strategyName","type":"string"},{"internalType":"bool","name":"cBTCSupport","type":"bool"},{"internalType":"bool","name":"feeOff","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyPID","type":"uint256"}],"name":"strategyInfo","outputs":[{"components":[{"internalType":"string","name":"strategyName","type":"string"},{"internalType":"bool[]","name":"token0Out","type":"bool[]"},{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"uint256[]","name":"feeOnTransfers","type":"uint256[]"},{"internalType":"bool","name":"cBTCSupport","type":"bool"},{"internalType":"bool","name":"feeOff","type":"bool"}],"internalType":"struct FlashArbitrageController.Strategy","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"strategyID","type":"uint256"}],"name":"strategyProfitInReturnToken","outputs":[{"internalType":"uint256","name":"profit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600580546001600160a01b0319908116737b5982dcab054c377517759d0d2a3a5d02615ab8179091556006805482167362359ed7505efc61ff1d56fef82158ccaffa23d717905560078054909116732260fac5e5542a773aa44fbcfedf7c193bc2c5991790553480156200007757600080fd5b5060405162003414380380620034148339810160408190526200009a9162000149565b6000620000a662000145565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060038054600480546001600160a01b039586166001600160a01b0319909116179055606460015561028a60025560ff199290931661010002610100600160a81b031990931692909217166014179055620001a0565b3390565b600080604083850312156200015c578182fd5b8251620001698162000187565b60208401519092506200017c8162000187565b809150509250929050565b6001600160a01b03811681146200019d57600080fd5b50565b61326480620001b06000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80638da5cb5b116100f9578063bfe1092811610097578063d92f599911610071578063d92f599914610343578063dfe3647814610356578063f2fde38b14610369578063fc8f36561461037c576101a9565b8063bfe1092814610311578063c34c08e514610319578063d574ea3d14610321576101a9565b80639e252f00116100d35780639e252f00146102b8578063b4748585146102cb578063bb91c339146102de578063bee99067146102fe576101a9565b80638da5cb5b146102a0578063950fcfbe146102a85780639b452931146102b0576101a9565b80635737619811610166578063715018a611610140578063715018a61461025f57806375619ab5146102675780637e6335c71461027a578063887a2f721461028d576101a9565b806357376198146102315780636b6c0774146102445780636d651e2a1461024c576101a9565b80630956e5a6146101ae5780630ae8c4dc146101cc5780631780ab98146101e15780631888153d146102015780631c3c0ea81461020957806320d6c5801461021e575b600080fd5b6101b661038f565b6040516101c3919061318f565b60405180910390f35b6101d4610395565b6040516101c39190612c74565b6101f46101ef36600461285c565b6103a4565b6040516101c39190612d55565b6101b66103b7565b61021c61021736600461285c565b6103bd565b005b61021c61022c36600461285c565b61041d565b61021c61023f366004612894565b61055e565b6101d461061a565b6101b661025a3660046128f7565b610629565b61021c610685565b61021c61027536600461285c565b610704565b61021c610288366004612ac2565b610761565b61021c61029b366004612aaa565b6107e8565b6101d4610cea565b6101b6610cf9565b6101d4610cff565b61021c6102c6366004612aaa565b610d0e565b61021c6102d93660046128bf565b610d2f565b6102f16102ec366004612aaa565b610d82565b6040516101c391906130f1565b6101b661030c366004612945565b610f9c565b6101d46118b5565b6101d46118c9565b61033461032f366004612aaa565b6118d8565b6040516101c393929190612d68565b6101b6610351366004612aaa565b61199a565b61021c610364366004612ae3565b611c48565b61021c61037736600461285c565b611c93565b6101b661038a366004612aaa565b611d49565b60085490565b6005546001600160a01b031681565b60606103af82611fa0565b90505b919050565b60025481565b6103c5611fd1565b6000546001600160a01b039081169116146103fb5760405162461bcd60e51b81526004016103f290613085565b60405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b815281906000906001600160a01b038316906370a082319061044e903090600401612c74565b60206040518083038186803b15801561046657600080fd5b505afa15801561047a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049e9190612a0f565b90506104cb83336104c66103e86104c060015487611fd590919063ffffffff16565b90612018565b61205a565b6003546040516370a0823160e01b81526105599185916001600160a01b036101009092048216918616906370a0823190610509903090600401612c74565b60206040518083038186803b15801561052157600080fd5b505afa158015610535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c69190612a0f565b505050565b610566611fd1565b6000546001600160a01b039081169116146105935760405162461bcd60e51b81526004016103f290613085565b816001600160a01b031663a9059cbb6105aa610cea565b836040518363ffffffff1660e01b81526004016105c8929190612c88565b602060405180830381600087803b1580156105e257600080fd5b505af11580156105f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055991906128db565b6006546001600160a01b031681565b60006060825167ffffffffffffffff8111801561064557600080fd5b5060405190808252806020026020018201604052801561066f578160200160208202803683370190505b50905061067d848483610f9c565b949350505050565b61068d611fd1565b6000546001600160a01b039081169116146106ba5760405162461bcd60e51b81526004016103f290613085565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61070c611fd1565b6000546001600160a01b039081169116146107395760405162461bcd60e51b81526004016103f290613085565b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610769611fd1565b6000546001600160a01b039081169116146107965760405162461bcd60e51b81526004016103f290613085565b60c860015411156107b95760405162461bcd60e51b81526004016103f290612fd1565b6103b660025411156107dd5760405162461bcd60e51b81526004016103f290612e35565b600191909155600255565b600754600160a01b900460ff16156108125760405162461bcd60e51b81526004016103f290612f22565b61081a6125a4565b6008828154811061082757fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c08301848152929390928492909184918401828280156108ca5780601f1061089f576101008083540402835291602001916108ca565b820191906000526020600020905b8154815290600101906020018083116108ad57829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561094257602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116109115790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156109a457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610986575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156109fc57602002820191906000526020600020905b8154815260200190600101908083116109e8575b505050918352505060049182015460ff808216151560208085019190915261010090920416151560409283015282548483015160608601519286015160808701519451638ed36a4f60e01b81529697506001600160a01b0390921695638ed36a4f95610a6d95929493929101612ce4565b600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b5050505060008160200151600081518110610ab257fe5b6020026020010151610b4c578160400151600081518110610acf57fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610b0f57600080fd5b505afa158015610b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b479190612878565b610bd5565b8160400151600081518110610b5d57fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9d57600080fd5b505afa158015610bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd59190612878565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610c059190612c74565b60206040518083038186803b158015610c1d57600080fd5b505afa158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c559190612a0f565b90508260a0015115610c8657610c8182336104c66103e86104c060015487611fd590919063ffffffff16565b610ca6565b610ca682336104c66103e86104c060025487611fd590919063ffffffff16565b6003546040516370a0823160e01b8152610ce49184916001600160a01b036101009092048216918316906370a0823190610509903090600401612c74565b50505050565b6000546001600160a01b031690565b60015481565b6007546001600160a01b031681565b610d2c73d5b47b80668840e7164c1d1d81af8a9d9727b42182612148565b50565b610d37611fd1565b6000546001600160a01b03908116911614610d645760405162461bcd60e51b81526004016103f290613085565b60078054911515600160a01b0260ff60a01b19909216919091179055565b610d8a6125a4565b60088281548110610d9757fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610e3a5780601f10610e0f57610100808354040283529160200191610e3a565b820191906000526020600020905b815481529060010190602001808311610e1d57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610eb257602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610e815790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610f1457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ef6575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610f6c57602002820191906000526020600020905b815481526020019060010190808311610f58575b50505091835250506004919091015460ff8082161515602084015261010090910416151560409091015292915050565b600754600090600160a01b900460ff1615610fc95760405162461bcd60e51b81526004016103f290612f22565b600354835160ff9091161015610ff15760405162461bcd60e51b81526004016103f290612eeb565b81518351146110125760405162461bcd60e51b81526004016103f290612e7e565b6060835167ffffffffffffffff8111801561102c57600080fd5b50604051908082528060200260200182016040528015611056578160200160208202803683370190505b509050848160008151811061106757fe5b60200260200101901515908115158152505060008460008151811061108857fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c857600080fd5b505afa1580156110dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111009190612878565b905060008560008151811061111157fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111899190612878565b9050611193610cea565b6001600160a01b0316336001600160a01b0316146111f3576006546001600160a01b038381169116148015906111d757506006546001600160a01b03828116911614155b6111f35760405162461bcd60e51b81526004016103f290612d92565b6005546000906001600160a01b038481169116148061121f57506005546001600160a01b038381169116145b15611228575060015b6000886112355782611237565b835b905060606112c261124783611fa0565b60405180604001604052806013815260200172010383934b1b2903a37b7903637bb971024b71606d1b81525061127c88611fa0565b604051806040016040528060018152602001602f60f81b81525061129f89611fa0565b60405180604001604052806005815260200164103830b4b960d91b81525061217e565b905060015b865181101561173d5760008a82815181106112de57fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113569190612878565b905060008b838151811061136657fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156113a657600080fd5b505afa1580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de9190612878565b90506113e8610cea565b6001600160a01b0316336001600160a01b031614611448576006546001600160a01b0383811691161480159061142c57506006546001600160a01b03828116911614155b6114485760405162461bcd60e51b81526004016103f290612d92565b6005546001600160a01b038681169116148061147157506007546001600160a01b038681169116145b156114f0576005546001600160a01b038381169116148061149f57506005546001600160a01b038281169116145b806114b757506007546001600160a01b038381169116145b806114cf57506007546001600160a01b038281169116145b6114eb5760405162461bcd60e51b81526004016103f29061301a565b61153d565b846001600160a01b0316826001600160a01b031614806115215750846001600160a01b0316816001600160a01b0316145b61153d5760405162461bcd60e51b81526004016103f29061301a565b6005546001600160a01b038681169116141561161057600754600196506001600160a01b03838116911614806115b357506007546001600160a01b03828116911614801561159957506005546001600160a01b03838116911614155b80156115b357506005546001600160a01b03828116911614155b1561160b5760075489516001600160a01b03838116921691909114908a90859081106115db57fe5b911515602092830291909101909101526007546001600160a01b038281169116146116065780611608565b815b94505b611733565b6007546001600160a01b03868116911614801561163a57506005546001600160a01b038381169116145b8061168557506005546001600160a01b03828116911614801561166b57506007546001600160a01b03838116911614155b801561168557506007546001600160a01b03828116911614155b156116dc576005548951600197506001600160a01b03838116921691909114908a90859081106116b157fe5b911515602092830291909101909101526005546001600160a01b038281169116146116065780611608565b846001600160a01b0316816001600160a01b0316148984815181106116fd57fe5b602002602001019015159081151581525050846001600160a01b0316826001600160a01b03161461172e5781611730565b805b94505b50506001016112c7565b5060086040518060c001604052808381526020018881526020018b81526020018a81526020018515158152602001611773610cea565b6001600160a01b031633149052815460018101835560009283526020928390208251805193946005909302909101926117af92849201906125de565b5060208281015180516117c8926001850192019061265c565b50604082015180516117e49160028401916020909101906126fd565b506060820151805161180091600384019160209091019061275e565b5060808201516004909101805460a09093015115156101000261ff001992151560ff1990941693909317919091169190911790556008546040519097503390889061184c908490612bd9565b60405180910390207f632fac0a1589b0f3641eb91e60fc7b1e2668673a1c95837e8bb6c7b5335a6e158c61187e610cea565b6001600160a01b0316336001600160a01b0316146040516118a0929190612d31565b60405180910390a45050505050509392505050565b60035461010090046001600160a01b031681565b6004546001600160a01b031681565b600881815481106118e557fe5b60009182526020918290206005919091020180546040805160026001841615610100026000190190931692909204601f81018590048502830185019091528082529193509183919083018282801561197e5780601f106119535761010080835404028352916020019161197e565b820191906000526020600020905b81548152906001019060200180831161196157829003601f168201915b5050506004909301549192505060ff8082169161010090041683565b60006119a46125a4565b600883815481106119b157fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611a545780601f10611a2957610100808354040283529160200191611a54565b820191906000526020600020905b815481529060010190602001808311611a3757829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611acc57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611a9b5790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611b2e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b10575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611b8657602002820191906000526020600020905b815481526020019060010190808311611b72575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152825484830151606086015192860151935163c90cc44d60e01b81529596506001600160a01b039091169463c90cc44d94611bf1949293929101612ca1565b60206040518083038186803b158015611c0957600080fd5b505afa158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190612a0f565b9392505050565b611c50611fd1565b6000546001600160a01b03908116911614611c7d5760405162461bcd60e51b81526004016103f290613085565b6003805460ff191660ff92909216919091179055565b611c9b611fd1565b6000546001600160a01b03908116911614611cc85760405162461bcd60e51b81526004016103f290613085565b6001600160a01b038116611cee5760405162461bcd60e51b81526004016103f290612def565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d536125a4565b60088381548110611d6057fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611e035780601f10611dd857610100808354040283529160200191611e03565b820191906000526020600020905b815481529060010190602001808311611de657829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611e7b57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611e4a5790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611edd57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ebf575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611f3557602002820191906000526020600020905b815481526020019060010190808311611f21575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152825484830151606086015192860151935163c0c06fef60e01b81529596506001600160a01b039091169463c0c06fef94611bf1949293929101612ca1565b606080611fb4836395d89b4160e01b6121b6565b90508051600014156103af57611fc9836122e3565b9150506103b2565b3390565b600082611fe457506000612012565b82820282848281611ff157fe5b041461200f5760405162461bcd60e51b81526004016103f290612f90565b90505b92915050565b600061200f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122f0565b60006060846001600160a01b031663a9059cbb8585604051602401612080929190612c88565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120b99190612bd9565b6000604051808303816000865af19150503d80600081146120f6576040519150601f19603f3d011682016040523d82523d6000602084013e6120fb565b606091505b509150915081801561212557508051158061212557508080602001905181019061212591906128db565b6121415760405162461bcd60e51b81526004016103f290612f59565b5050505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610559573d6000803e3d6000fd5b606086868686868660405160200161219b96959493929190612bf5565b60405160208183030381529060405290509695505050505050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160609160009183916001600160a01b038716916122009190612bd9565b600060405180830381855afa9150503d806000811461223b576040519150601f19603f3d011682016040523d82523d6000602084013e612240565b606091505b509150915081158061225157508051155b1561226f576040518060200160405280600081525092505050612012565b8051602014156122a45760008180602001905181019061228f9190612a0f565b905061229a81612327565b9350505050612012565b6040815111156122cb57808060200190518101906122c29190612a27565b92505050612012565b50506040805160208101909152600081529392505050565b60606103af82600661244e565b600081836123115760405162461bcd60e51b81526004016103f29190612d55565b50600083858161231d57fe5b0495945050505050565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b60208110156123b057600085826020811061236657fe5b1a60f81b90506001600160f81b03198116156123a7578084848151811061238957fe5b60200101906001600160f81b031916908160001a9053506001909201915b5060010161234f565b5060608167ffffffffffffffff811180156123ca57600080fd5b506040519080825280601f01601f1916602001820160405280156123f5576020820181803683370190505b50905060005b828110156124455783818151811061240f57fe5b602001015160f81c60f81b82828151811061242657fe5b60200101906001600160f81b031916908160001a9053506001016123fb565b50949350505050565b6060600282061580156124615750600082115b801561246e575060288211155b61248a5760405162461bcd60e51b81526004016103f2906130ba565b60608267ffffffffffffffff811180156124a357600080fd5b506040519080825280601f01601f1916602001820160405280156124ce576020820181803683370190505b5090506001600160a01b03841660005b6002850481101561257257600860138290030282901c600f600482901c1660f08216820361250b8261257c565b86856002028151811061251a57fe5b60200101906001600160f81b031916908160001a90535061253a8161257c565b86856002026001018151811061254c57fe5b60200101906001600160f81b031916908160001a90535050600190920191506124de9050565b5090949350505050565b6000600a8260ff16101561259757506030810160f81b6103b2565b506037810160f81b6103b2565b6040518060c00160405280606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061261f57805160ff191683800117855561264c565b8280016001018555821561264c579182015b8281111561264c578251825591602001919060010190612631565b50612658929150612798565b5090565b82805482825590600052602060002090601f016020900481019282156126f15791602002820160005b838211156126c257835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302612685565b80156126ef5782816101000a81549060ff02191690556001016020816000010492830192600103026126c2565b505b506126589291506127ad565b828054828255906000526020600020908101928215612752579160200282015b8281111561275257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061271d565b506126589291506127c6565b82805482825590600052602060002090810192821561264c579160200282018281111561264c578251825591602001919060010190612631565b5b808211156126585760008155600101612799565b5b8082111561265857805460ff191681556001016127ae565b5b808211156126585780546001600160a01b03191681556001016127c7565b600082601f8301126127f5578081fd5b8135612808612803826131bf565b613198565b81815291506020808301908481018184028601820187101561282957600080fd5b60005b8481101561285157813561283f8161320b565b8452928201929082019060010161282c565b505050505092915050565b60006020828403121561286d578081fd5b813561200f8161320b565b600060208284031215612889578081fd5b815161200f8161320b565b600080604083850312156128a6578081fd5b82356128b18161320b565b946020939093013593505050565b6000602082840312156128d0578081fd5b813561200f81613220565b6000602082840312156128ec578081fd5b815161200f81613220565b60008060408385031215612909578182fd5b823561291481613220565b9150602083013567ffffffffffffffff81111561292f578182fd5b61293b858286016127e5565b9150509250929050565b600080600060608486031215612959578081fd5b833561296481613220565b925060208481013567ffffffffffffffff80821115612981578384fd5b61298d888389016127e5565b945060408701359150808211156129a2578384fd5b508501601f810187136129b3578283fd5b80356129c1612803826131bf565b81815283810190838501858402850186018b10156129dd578687fd5b8694505b838510156129ff5780358352600194909401939185019185016129e1565b5080955050505050509250925092565b600060208284031215612a20578081fd5b5051919050565b600060208284031215612a38578081fd5b815167ffffffffffffffff80821115612a4f578283fd5b818401915084601f830112612a62578283fd5b815181811115612a70578384fd5b612a83601f8201601f1916602001613198565b9150808252856020828501011115612a99578384fd5b6124458160208401602086016131df565b600060208284031215612abb578081fd5b5035919050565b60008060408385031215612ad4578182fd5b50508035926020909101359150565b600060208284031215612af4578081fd5b813560ff8116811461200f578182fd5b6000815180845260208085019450808401835b83811015612b3c5781516001600160a01b031687529582019590820190600101612b17565b509495945050505050565b6000815180845260208085019450808401835b83811015612b3c578151151587529582019590820190600101612b5a565b6000815180845260208085019450808401835b83811015612b3c57815187529582019590820190600101612b8b565b15159052565b60008151808452612bc58160208601602086016131df565b601f01601f19169290920160200192915050565b60008251612beb8184602087016131df565b9190910192915050565b600087516020612c088285838d016131df565b885191840191612c1b8184848d016131df565b8851920191612c2d8184848c016131df565b8751920191612c3f8184848b016131df565b8651920191612c518184848a016131df565b8551920191612c6381848489016131df565b919091019998505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060608252612cb46060830186612b04565b8281036020840152612cc68186612b78565b90508281036040840152612cda8185612b47565b9695505050505050565b600060808252612cf76080830187612b04565b8281036020840152612d098187612b78565b90508281036040840152612d1d8186612b47565b915050821515606083015295945050505050565b600060408252612d446040830185612b04565b905082151560208301529392505050565b60006020825261200f6020830184612bad565b600060608252612d7b6060830186612bad565b931515602083015250901515604090910152919050565b6020808252603c908201527f464120436f6e74726f6c6c65723a20434f52452073747261746567696573206360408201527f616e206265206f6e6c7920616464656420627920616e2061646d696e00000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f4641203a20393525206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526047908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f2020706169727320616e64206665656f6e7472616e73666572732073686f756c6060820152661908195c5d585b60ca1b608082015260a00190565b6020808252601e908201527f464120436f6e74726f6c6c6572202d20746f6f206d616e792073746570730000604082015260600190565b6020808252601c908201527f5468697320436f6e747261637420697320646570726563696174656400000000604082015260600190565b6020808252601e908201527f464120436f6e74726f6c6c65723a205452414e534645525f4641494c45440000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526029908201527f4641203a20323025206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526045908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f207061697220646f6573206e6f7420636f6e7461696e2070726576696f7573206060820152643a37b5b2b760d91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604082015260600190565b600060208252825160c0602084015261310d60e0840182612bad565b90506020840151601f198085840301604086015261312b8383612b47565b925060408601519150808584030160608601526131488383612b04565b92506060860151915080858403016080860152506131668282612b78565b9150506080840151151560a084015260a084015161318760c0850182612ba7565b509392505050565b90815260200190565b60405181810167ffffffffffffffff811182821017156131b757600080fd5b604052919050565b600067ffffffffffffffff8211156131d5578081fd5b5060209081020190565b60005b838110156131fa5781810151838201526020016131e2565b83811115610ce45750506000910152565b6001600160a01b0381168114610d2c57600080fd5b8015158114610d2c57600080fdfea26469706673582212208359551105a7072d1f98f4c4472671c0a5b81ab36503956f1059e85930517ef964736f6c634300060c00330000000000000000000000007c7ff16ddf45e108715d16c8e4ed09f7b40dc841000000000000000000000000d5b47b80668840e7164c1d1d81af8a9d9727b421
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80638da5cb5b116100f9578063bfe1092811610097578063d92f599911610071578063d92f599914610343578063dfe3647814610356578063f2fde38b14610369578063fc8f36561461037c576101a9565b8063bfe1092814610311578063c34c08e514610319578063d574ea3d14610321576101a9565b80639e252f00116100d35780639e252f00146102b8578063b4748585146102cb578063bb91c339146102de578063bee99067146102fe576101a9565b80638da5cb5b146102a0578063950fcfbe146102a85780639b452931146102b0576101a9565b80635737619811610166578063715018a611610140578063715018a61461025f57806375619ab5146102675780637e6335c71461027a578063887a2f721461028d576101a9565b806357376198146102315780636b6c0774146102445780636d651e2a1461024c576101a9565b80630956e5a6146101ae5780630ae8c4dc146101cc5780631780ab98146101e15780631888153d146102015780631c3c0ea81461020957806320d6c5801461021e575b600080fd5b6101b661038f565b6040516101c3919061318f565b60405180910390f35b6101d4610395565b6040516101c39190612c74565b6101f46101ef36600461285c565b6103a4565b6040516101c39190612d55565b6101b66103b7565b61021c61021736600461285c565b6103bd565b005b61021c61022c36600461285c565b61041d565b61021c61023f366004612894565b61055e565b6101d461061a565b6101b661025a3660046128f7565b610629565b61021c610685565b61021c61027536600461285c565b610704565b61021c610288366004612ac2565b610761565b61021c61029b366004612aaa565b6107e8565b6101d4610cea565b6101b6610cf9565b6101d4610cff565b61021c6102c6366004612aaa565b610d0e565b61021c6102d93660046128bf565b610d2f565b6102f16102ec366004612aaa565b610d82565b6040516101c391906130f1565b6101b661030c366004612945565b610f9c565b6101d46118b5565b6101d46118c9565b61033461032f366004612aaa565b6118d8565b6040516101c393929190612d68565b6101b6610351366004612aaa565b61199a565b61021c610364366004612ae3565b611c48565b61021c61037736600461285c565b611c93565b6101b661038a366004612aaa565b611d49565b60085490565b6005546001600160a01b031681565b60606103af82611fa0565b90505b919050565b60025481565b6103c5611fd1565b6000546001600160a01b039081169116146103fb5760405162461bcd60e51b81526004016103f290613085565b60405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b815281906000906001600160a01b038316906370a082319061044e903090600401612c74565b60206040518083038186803b15801561046657600080fd5b505afa15801561047a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049e9190612a0f565b90506104cb83336104c66103e86104c060015487611fd590919063ffffffff16565b90612018565b61205a565b6003546040516370a0823160e01b81526105599185916001600160a01b036101009092048216918616906370a0823190610509903090600401612c74565b60206040518083038186803b15801561052157600080fd5b505afa158015610535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c69190612a0f565b505050565b610566611fd1565b6000546001600160a01b039081169116146105935760405162461bcd60e51b81526004016103f290613085565b816001600160a01b031663a9059cbb6105aa610cea565b836040518363ffffffff1660e01b81526004016105c8929190612c88565b602060405180830381600087803b1580156105e257600080fd5b505af11580156105f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055991906128db565b6006546001600160a01b031681565b60006060825167ffffffffffffffff8111801561064557600080fd5b5060405190808252806020026020018201604052801561066f578160200160208202803683370190505b50905061067d848483610f9c565b949350505050565b61068d611fd1565b6000546001600160a01b039081169116146106ba5760405162461bcd60e51b81526004016103f290613085565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61070c611fd1565b6000546001600160a01b039081169116146107395760405162461bcd60e51b81526004016103f290613085565b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610769611fd1565b6000546001600160a01b039081169116146107965760405162461bcd60e51b81526004016103f290613085565b60c860015411156107b95760405162461bcd60e51b81526004016103f290612fd1565b6103b660025411156107dd5760405162461bcd60e51b81526004016103f290612e35565b600191909155600255565b600754600160a01b900460ff16156108125760405162461bcd60e51b81526004016103f290612f22565b61081a6125a4565b6008828154811061082757fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c08301848152929390928492909184918401828280156108ca5780601f1061089f576101008083540402835291602001916108ca565b820191906000526020600020905b8154815290600101906020018083116108ad57829003601f168201915b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561094257602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116109115790505b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156109a457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610986575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156109fc57602002820191906000526020600020905b8154815260200190600101908083116109e8575b505050918352505060049182015460ff808216151560208085019190915261010090920416151560409283015282548483015160608601519286015160808701519451638ed36a4f60e01b81529697506001600160a01b0390921695638ed36a4f95610a6d95929493929101612ce4565b600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b5050505060008160200151600081518110610ab257fe5b6020026020010151610b4c578160400151600081518110610acf57fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610b0f57600080fd5b505afa158015610b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b479190612878565b610bd5565b8160400151600081518110610b5d57fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9d57600080fd5b505afa158015610bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd59190612878565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610c059190612c74565b60206040518083038186803b158015610c1d57600080fd5b505afa158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c559190612a0f565b90508260a0015115610c8657610c8182336104c66103e86104c060015487611fd590919063ffffffff16565b610ca6565b610ca682336104c66103e86104c060025487611fd590919063ffffffff16565b6003546040516370a0823160e01b8152610ce49184916001600160a01b036101009092048216918316906370a0823190610509903090600401612c74565b50505050565b6000546001600160a01b031690565b60015481565b6007546001600160a01b031681565b610d2c73d5b47b80668840e7164c1d1d81af8a9d9727b42182612148565b50565b610d37611fd1565b6000546001600160a01b03908116911614610d645760405162461bcd60e51b81526004016103f290613085565b60078054911515600160a01b0260ff60a01b19909216919091179055565b610d8a6125a4565b60088281548110610d9757fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015610e3a5780601f10610e0f57610100808354040283529160200191610e3a565b820191906000526020600020905b815481529060010190602001808311610e1d57829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610eb257602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610e815790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610f1457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ef6575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610f6c57602002820191906000526020600020905b815481526020019060010190808311610f58575b50505091835250506004919091015460ff8082161515602084015261010090910416151560409091015292915050565b600754600090600160a01b900460ff1615610fc95760405162461bcd60e51b81526004016103f290612f22565b600354835160ff9091161015610ff15760405162461bcd60e51b81526004016103f290612eeb565b81518351146110125760405162461bcd60e51b81526004016103f290612e7e565b6060835167ffffffffffffffff8111801561102c57600080fd5b50604051908082528060200260200182016040528015611056578160200160208202803683370190505b509050848160008151811061106757fe5b60200260200101901515908115158152505060008460008151811061108857fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110c857600080fd5b505afa1580156110dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111009190612878565b905060008560008151811061111157fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111899190612878565b9050611193610cea565b6001600160a01b0316336001600160a01b0316146111f3576006546001600160a01b038381169116148015906111d757506006546001600160a01b03828116911614155b6111f35760405162461bcd60e51b81526004016103f290612d92565b6005546000906001600160a01b038481169116148061121f57506005546001600160a01b038381169116145b15611228575060015b6000886112355782611237565b835b905060606112c261124783611fa0565b60405180604001604052806013815260200172010383934b1b2903a37b7903637bb971024b71606d1b81525061127c88611fa0565b604051806040016040528060018152602001602f60f81b81525061129f89611fa0565b60405180604001604052806005815260200164103830b4b960d91b81525061217e565b905060015b865181101561173d5760008a82815181106112de57fe5b60200260200101516001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113569190612878565b905060008b838151811061136657fe5b60200260200101516001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156113a657600080fd5b505afa1580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de9190612878565b90506113e8610cea565b6001600160a01b0316336001600160a01b031614611448576006546001600160a01b0383811691161480159061142c57506006546001600160a01b03828116911614155b6114485760405162461bcd60e51b81526004016103f290612d92565b6005546001600160a01b038681169116148061147157506007546001600160a01b038681169116145b156114f0576005546001600160a01b038381169116148061149f57506005546001600160a01b038281169116145b806114b757506007546001600160a01b038381169116145b806114cf57506007546001600160a01b038281169116145b6114eb5760405162461bcd60e51b81526004016103f29061301a565b61153d565b846001600160a01b0316826001600160a01b031614806115215750846001600160a01b0316816001600160a01b0316145b61153d5760405162461bcd60e51b81526004016103f29061301a565b6005546001600160a01b038681169116141561161057600754600196506001600160a01b03838116911614806115b357506007546001600160a01b03828116911614801561159957506005546001600160a01b03838116911614155b80156115b357506005546001600160a01b03828116911614155b1561160b5760075489516001600160a01b03838116921691909114908a90859081106115db57fe5b911515602092830291909101909101526007546001600160a01b038281169116146116065780611608565b815b94505b611733565b6007546001600160a01b03868116911614801561163a57506005546001600160a01b038381169116145b8061168557506005546001600160a01b03828116911614801561166b57506007546001600160a01b03838116911614155b801561168557506007546001600160a01b03828116911614155b156116dc576005548951600197506001600160a01b03838116921691909114908a90859081106116b157fe5b911515602092830291909101909101526005546001600160a01b038281169116146116065780611608565b846001600160a01b0316816001600160a01b0316148984815181106116fd57fe5b602002602001019015159081151581525050846001600160a01b0316826001600160a01b03161461172e5781611730565b805b94505b50506001016112c7565b5060086040518060c001604052808381526020018881526020018b81526020018a81526020018515158152602001611773610cea565b6001600160a01b031633149052815460018101835560009283526020928390208251805193946005909302909101926117af92849201906125de565b5060208281015180516117c8926001850192019061265c565b50604082015180516117e49160028401916020909101906126fd565b506060820151805161180091600384019160209091019061275e565b5060808201516004909101805460a09093015115156101000261ff001992151560ff1990941693909317919091169190911790556008546040519097503390889061184c908490612bd9565b60405180910390207f632fac0a1589b0f3641eb91e60fc7b1e2668673a1c95837e8bb6c7b5335a6e158c61187e610cea565b6001600160a01b0316336001600160a01b0316146040516118a0929190612d31565b60405180910390a45050505050509392505050565b60035461010090046001600160a01b031681565b6004546001600160a01b031681565b600881815481106118e557fe5b60009182526020918290206005919091020180546040805160026001841615610100026000190190931692909204601f81018590048502830185019091528082529193509183919083018282801561197e5780601f106119535761010080835404028352916020019161197e565b820191906000526020600020905b81548152906001019060200180831161196157829003601f168201915b5050506004909301549192505060ff8082169161010090041683565b60006119a46125a4565b600883815481106119b157fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611a545780601f10611a2957610100808354040283529160200191611a54565b820191906000526020600020905b815481529060010190602001808311611a3757829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611acc57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611a9b5790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611b2e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b10575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611b8657602002820191906000526020600020905b815481526020019060010190808311611b72575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152825484830151606086015192860151935163c90cc44d60e01b81529596506001600160a01b039091169463c90cc44d94611bf1949293929101612ca1565b60206040518083038186803b158015611c0957600080fd5b505afa158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190612a0f565b9392505050565b611c50611fd1565b6000546001600160a01b03908116911614611c7d5760405162461bcd60e51b81526004016103f290613085565b6003805460ff191660ff92909216919091179055565b611c9b611fd1565b6000546001600160a01b03908116911614611cc85760405162461bcd60e51b81526004016103f290613085565b6001600160a01b038116611cee5760405162461bcd60e51b81526004016103f290612def565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d536125a4565b60088381548110611d6057fe5b600091825260209182902060408051600593909302909101805460026001821615610100026000190190911604601f8101859004909402830160e090810190925260c0830184815292939092849290918491840182828015611e035780601f10611dd857610100808354040283529160200191611e03565b820191906000526020600020905b815481529060010190602001808311611de657829003601f168201915b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611e7b57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611e4a5790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611edd57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611ebf575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611f3557602002820191906000526020600020905b815481526020019060010190808311611f21575b505050918352505060049182015460ff8082161515602080850191909152610100909204161515604092830152825484830151606086015192860151935163c0c06fef60e01b81529596506001600160a01b039091169463c0c06fef94611bf1949293929101612ca1565b606080611fb4836395d89b4160e01b6121b6565b90508051600014156103af57611fc9836122e3565b9150506103b2565b3390565b600082611fe457506000612012565b82820282848281611ff157fe5b041461200f5760405162461bcd60e51b81526004016103f290612f90565b90505b92915050565b600061200f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122f0565b60006060846001600160a01b031663a9059cbb8585604051602401612080929190612c88565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516120b99190612bd9565b6000604051808303816000865af19150503d80600081146120f6576040519150601f19603f3d011682016040523d82523d6000602084013e6120fb565b606091505b509150915081801561212557508051158061212557508080602001905181019061212591906128db565b6121415760405162461bcd60e51b81526004016103f290612f59565b5050505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610559573d6000803e3d6000fd5b606086868686868660405160200161219b96959493929190612bf5565b60405160208183030381529060405290509695505050505050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160609160009183916001600160a01b038716916122009190612bd9565b600060405180830381855afa9150503d806000811461223b576040519150601f19603f3d011682016040523d82523d6000602084013e612240565b606091505b509150915081158061225157508051155b1561226f576040518060200160405280600081525092505050612012565b8051602014156122a45760008180602001905181019061228f9190612a0f565b905061229a81612327565b9350505050612012565b6040815111156122cb57808060200190518101906122c29190612a27565b92505050612012565b50506040805160208101909152600081529392505050565b60606103af82600661244e565b600081836123115760405162461bcd60e51b81526004016103f29190612d55565b50600083858161231d57fe5b0495945050505050565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b60208110156123b057600085826020811061236657fe5b1a60f81b90506001600160f81b03198116156123a7578084848151811061238957fe5b60200101906001600160f81b031916908160001a9053506001909201915b5060010161234f565b5060608167ffffffffffffffff811180156123ca57600080fd5b506040519080825280601f01601f1916602001820160405280156123f5576020820181803683370190505b50905060005b828110156124455783818151811061240f57fe5b602001015160f81c60f81b82828151811061242657fe5b60200101906001600160f81b031916908160001a9053506001016123fb565b50949350505050565b6060600282061580156124615750600082115b801561246e575060288211155b61248a5760405162461bcd60e51b81526004016103f2906130ba565b60608267ffffffffffffffff811180156124a357600080fd5b506040519080825280601f01601f1916602001820160405280156124ce576020820181803683370190505b5090506001600160a01b03841660005b6002850481101561257257600860138290030282901c600f600482901c1660f08216820361250b8261257c565b86856002028151811061251a57fe5b60200101906001600160f81b031916908160001a90535061253a8161257c565b86856002026001018151811061254c57fe5b60200101906001600160f81b031916908160001a90535050600190920191506124de9050565b5090949350505050565b6000600a8260ff16101561259757506030810160f81b6103b2565b506037810160f81b6103b2565b6040518060c00160405280606081526020016060815260200160608152602001606081526020016000151581526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061261f57805160ff191683800117855561264c565b8280016001018555821561264c579182015b8281111561264c578251825591602001919060010190612631565b50612658929150612798565b5090565b82805482825590600052602060002090601f016020900481019282156126f15791602002820160005b838211156126c257835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302612685565b80156126ef5782816101000a81549060ff02191690556001016020816000010492830192600103026126c2565b505b506126589291506127ad565b828054828255906000526020600020908101928215612752579160200282015b8281111561275257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061271d565b506126589291506127c6565b82805482825590600052602060002090810192821561264c579160200282018281111561264c578251825591602001919060010190612631565b5b808211156126585760008155600101612799565b5b8082111561265857805460ff191681556001016127ae565b5b808211156126585780546001600160a01b03191681556001016127c7565b600082601f8301126127f5578081fd5b8135612808612803826131bf565b613198565b81815291506020808301908481018184028601820187101561282957600080fd5b60005b8481101561285157813561283f8161320b565b8452928201929082019060010161282c565b505050505092915050565b60006020828403121561286d578081fd5b813561200f8161320b565b600060208284031215612889578081fd5b815161200f8161320b565b600080604083850312156128a6578081fd5b82356128b18161320b565b946020939093013593505050565b6000602082840312156128d0578081fd5b813561200f81613220565b6000602082840312156128ec578081fd5b815161200f81613220565b60008060408385031215612909578182fd5b823561291481613220565b9150602083013567ffffffffffffffff81111561292f578182fd5b61293b858286016127e5565b9150509250929050565b600080600060608486031215612959578081fd5b833561296481613220565b925060208481013567ffffffffffffffff80821115612981578384fd5b61298d888389016127e5565b945060408701359150808211156129a2578384fd5b508501601f810187136129b3578283fd5b80356129c1612803826131bf565b81815283810190838501858402850186018b10156129dd578687fd5b8694505b838510156129ff5780358352600194909401939185019185016129e1565b5080955050505050509250925092565b600060208284031215612a20578081fd5b5051919050565b600060208284031215612a38578081fd5b815167ffffffffffffffff80821115612a4f578283fd5b818401915084601f830112612a62578283fd5b815181811115612a70578384fd5b612a83601f8201601f1916602001613198565b9150808252856020828501011115612a99578384fd5b6124458160208401602086016131df565b600060208284031215612abb578081fd5b5035919050565b60008060408385031215612ad4578182fd5b50508035926020909101359150565b600060208284031215612af4578081fd5b813560ff8116811461200f578182fd5b6000815180845260208085019450808401835b83811015612b3c5781516001600160a01b031687529582019590820190600101612b17565b509495945050505050565b6000815180845260208085019450808401835b83811015612b3c578151151587529582019590820190600101612b5a565b6000815180845260208085019450808401835b83811015612b3c57815187529582019590820190600101612b8b565b15159052565b60008151808452612bc58160208601602086016131df565b601f01601f19169290920160200192915050565b60008251612beb8184602087016131df565b9190910192915050565b600087516020612c088285838d016131df565b885191840191612c1b8184848d016131df565b8851920191612c2d8184848c016131df565b8751920191612c3f8184848b016131df565b8651920191612c518184848a016131df565b8551920191612c6381848489016131df565b919091019998505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060608252612cb46060830186612b04565b8281036020840152612cc68186612b78565b90508281036040840152612cda8185612b47565b9695505050505050565b600060808252612cf76080830187612b04565b8281036020840152612d098187612b78565b90508281036040840152612d1d8186612b47565b915050821515606083015295945050505050565b600060408252612d446040830185612b04565b905082151560208301529392505050565b60006020825261200f6020830184612bad565b600060608252612d7b6060830186612bad565b931515602083015250901515604090910152919050565b6020808252603c908201527f464120436f6e74726f6c6c65723a20434f52452073747261746567696573206360408201527f616e206265206f6e6c7920616464656420627920616e2061646d696e00000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526029908201527f4641203a20393525206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526047908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f2020706169727320616e64206665656f6e7472616e73666572732073686f756c6060820152661908195c5d585b60ca1b608082015260a00190565b6020808252601e908201527f464120436f6e74726f6c6c6572202d20746f6f206d616e792073746570730000604082015260600190565b6020808252601c908201527f5468697320436f6e747261637420697320646570726563696174656400000000604082015260600190565b6020808252601e908201527f464120436f6e74726f6c6c65723a205452414e534645525f4641494c45440000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526029908201527f4641203a20323025206d61782066656520666f72206665654f666620726576656040820152681b9d59481cdc1b1a5d60ba1b606082015260800190565b60208082526045908201527f464120436f6e74726f6c6c65723a204d616c666f726d656420496e707574202d60408201527f207061697220646f6573206e6f7420636f6e7461696e2070726576696f7573206060820152643a37b5b2b760d91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604082015260600190565b600060208252825160c0602084015261310d60e0840182612bad565b90506020840151601f198085840301604086015261312b8383612b47565b925060408601519150808584030160608601526131488383612b04565b92506060860151915080858403016080860152506131668282612b78565b9150506080840151151560a084015260a084015161318760c0850182612ba7565b509392505050565b90815260200190565b60405181810167ffffffffffffffff811182821017156131b757600080fd5b604052919050565b600067ffffffffffffffff8211156131d5578081fd5b5060209081020190565b60005b838110156131fa5781810151838201526020016131e2565b83811115610ce45750506000910152565b6001600160a01b0381168114610d2c57600080fd5b8015158114610d2c57600080fdfea26469706673582212208359551105a7072d1f98f4c4472671c0a5b81ab36503956f1059e85930517ef964736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007c7ff16ddf45e108715d16c8e4ed09f7b40dc841000000000000000000000000d5b47b80668840e7164c1d1d81af8a9d9727b421
-----Decoded View---------------
Arg [0] : _executor (address): 0x7C7Ff16DdF45E108715d16c8E4ED09F7b40dc841
Arg [1] : _distributor (address): 0xd5b47B80668840e7164C1D1d81aF8a9d9727B421
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007c7ff16ddf45e108715d16c8e4ed09f7b40dc841
Arg [1] : 000000000000000000000000d5b47b80668840e7164c1d1d81af8a9d9727b421
Deployed Bytecode Sourcemap
24582:14773:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28917:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25692:64;;;:::i;:::-;;;;;;;:::i;37863:136::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25354:40::-;;;:::i;26651:121::-;;;;;;:::i;:::-;;:::i;:::-;;39027:321;;;;;;:::i;:::-;;:::i;38227:122::-;;;;;;:::i;:::-;;:::i;25763:64::-;;;:::i;31220:285::-;;;;;;:::i;:::-;;:::i;18966:148::-;;;:::i;26824:108::-;;;;;;:::i;:::-;;:::i;27168:640::-;;;;;;:::i;:::-;;:::i;29551:1520::-;;;;;;:::i;:::-;;:::i;18324:79::-;;;:::i;25306:41::-;;;:::i;25834:64::-;;;:::i;38357:114::-;;;;;;:::i;:::-;;:::i;27055:105::-;;;;;;:::i;:::-;;:::i;28780:129::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31565:5624::-;;;;;;:::i;:::-;;:::i;25612:27::-;;;:::i;25646:39::-;;;:::i;26066:28::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;28415:308::-;;;;;;:::i;:::-;;:::i;26940:107::-;;;;;;:::i;:::-;;:::i;19269:244::-;;;;;;:::i;:::-;;:::i;27896:276::-;;;;;;:::i;:::-;;:::i;28917:103::-;28995:10;:17;28917:103;:::o;25692:64::-;;;-1:-1:-1;;;;;25692:64:0;;:::o;37863:136::-;37925:13;37958:33;37985:5;37958:26;:33::i;:::-;37951:40;;37863:136;;;;:::o;25354:40::-;;;;:::o;26651:121::-;18546:12;:10;:12::i;:::-;18536:6;;-1:-1:-1;;;;;18536:6:0;;;:22;;;18528:67;;;;-1:-1:-1;;;18528:67:0;;;;;;;:::i;:::-;;;;;;;;;26719:8:::1;:45:::0;;-1:-1:-1;;;;;;26719:45:0::1;-1:-1:-1::0;;;;;26719:45:0;;;::::1;::::0;;;::::1;::::0;;26651:121::o;39027:321::-;39139:30;;-1:-1:-1;;;39139:30:0;;39102:6;;39080:12;;-1:-1:-1;;;;;39139:15:0;;;;;:30;;39163:4;;39139:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39120:49;;39180:84;39193:6;39201:10;39213:50;39258:4;39213:40;39226:26;;39213:8;:12;;:40;;;;:::i;:::-;:44;;:50::i;:::-;39180:12;:84::i;:::-;39296:11;;39309:30;;-1:-1:-1;;;39309:30:0;;39275:65;;39288:6;;-1:-1:-1;;;;;39296:11:0;;;;;;;39309:15;;;;;:30;;39333:4;;39309:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39275:65::-;39027:321;;;:::o;38227:122::-;18546:12;:10;:12::i;:::-;18536:6;;-1:-1:-1;;;;;18536:6:0;;;:22;;;18528:67;;;;-1:-1:-1;;;18528:67:0;;;;;;;:::i;:::-;38312:5:::1;-1:-1:-1::0;;;;;38305:22:0::1;;38328:7;:5;:7::i;:::-;38337:3;38305:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25763:64::-:0;;;-1:-1:-1;;;;;25763:64:0;;:::o;31220:285::-;31303:18;31336:31;31384:5;:12;31370:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31370:27:0;;31336:61;;31421:74;31459:12;31473:5;31480:14;31421:37;:74::i;:::-;31408:87;31220:285;-1:-1:-1;;;;31220:285:0:o;18966:148::-;18546:12;:10;:12::i;:::-;18536:6;;-1:-1:-1;;;;;18536:6:0;;;:22;;;18528:67;;;;-1:-1:-1;;;18528:67:0;;;;;;;:::i;:::-;19073:1:::1;19057:6:::0;;19036:40:::1;::::0;-1:-1:-1;;;;;19057:6:0;;::::1;::::0;19036:40:::1;::::0;19073:1;;19036:40:::1;19104:1;19087:19:::0;;-1:-1:-1;;;;;;19087:19:0::1;::::0;;18966:148::o;26824:108::-;18546:12;:10;:12::i;:::-;18536:6;;-1:-1:-1;;;;;18536:6:0;;;:22;;;18528:67;;;;-1:-1:-1;;;18528:67:0;;;;;;;:::i;:::-;26898:11:::1;:26:::0;;-1:-1:-1;;;;;26898:26:0;;::::1;;;-1:-1:-1::0;;;;;;26898:26:0;;::::1;::::0;;;::::1;::::0;;26824:108::o;27168:640::-;18546:12;:10;:12::i;:::-;18536:6;;-1:-1:-1;;;;;18536:6:0;;;:22;;;18528:67;;;;-1:-1:-1;;;18528:67:0;;;;;;;:::i;:::-;27522:3:::1;27492:26;;:33;;27484:87;;;;-1:-1:-1::0;;;27484:87:0::1;;;;;;;:::i;:::-;27619:3;27590:25;;:32;;27582:86;;;;-1:-1:-1::0;;;27582:86:0::1;;;;;;;:::i;:::-;27679:26;:56:::0;;;;27746:25:::1;:54:::0;27168:640::o;29551:1520::-;29771:11;;-1:-1:-1;;;29771:11:0;;;;29770:12;29762:53;;;;-1:-1:-1;;;29762:53:0;;;;;;;:::i;:::-;29826:31;;:::i;:::-;29860:10;29871:11;29860:23;;;;;;;;;;;;;;;;;29826:57;;;29860:23;;;;;;;;29826:57;;;;;;;;;-1:-1:-1;;29826:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29860:23;;29826:57;;;;29860:23;;29826:57;;29860:23;29826:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29826:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29826:57:0;;;-1:-1:-1;;29826:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29896:8;;29921:21;;;;29944:30;;;;29976:25;;;;30003:27;;;;29896:135;;-1:-1:-1;;;29896:135:0;;29826:57;;-1:-1:-1;;;;;;29896:8:0;;;;:24;;:135;;29921:21;;29944:30;29976:25;30003:27;29896:135;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30151:19;30173:15;:25;;;30199:1;30173:28;;;;;;;;;;;;;;:178;;30317:15;:21;;;30339:1;30317:24;;;;;;;;;;;;;;-1:-1:-1;;;;;30302:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30173:178;;;30233:15;:21;;;30255:1;30233:24;;;;;;;;;;;;;;-1:-1:-1;;;;;30218:47:0;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30151:200;;30420:14;30444:11;-1:-1:-1;;;;;30437:29:0;;30475:4;30437:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30420:61;;30595:15;:22;;;30592:269;;;30634:87;30647:11;30660:10;30672:48;30715:4;30672:38;30683:26;;30672:6;:10;;:38;;;;:::i;30634:87::-;30592:269;;;30763:86;30776:11;30789:10;30801:47;30843:4;30801:37;30812:25;;30801:6;:10;;:37;;;;:::i;30763:86::-;31003:11;;31016:44;;-1:-1:-1;;;31016:44:0;;30977:84;;30990:11;;-1:-1:-1;;;;;31003:11:0;;;;;;;31016:29;;;;;:44;;31054:4;;31016:44;;;:::i;30977:84::-;29551:1520;;;;:::o;18324:79::-;18362:7;18389:6;-1:-1:-1;;;;;18389:6:0;18324:79;:::o;25306:41::-;;;;:::o;25834:64::-;;;-1:-1:-1;;;;;25834:64:0;;:::o;38357:114::-;38407:56;38415:42;38459:3;38407:7;:56::i;:::-;38357:114;:::o;27055:105::-;18546:12;:10;:12::i;:::-;18536:6;;-1:-1:-1;;;;;18536:6:0;;;:22;;;18528:67;;;;-1:-1:-1;;;18528:67:0;;;;;;;:::i;:::-;27126:11:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;27126:26:0::1;-1:-1:-1::0;;;;27126:26:0;;::::1;::::0;;;::::1;::::0;;27055:105::o;28780:129::-;28844:15;;:::i;:::-;28878:10;28889:11;28878:23;;;;;;;;;;;;;;;;;28871:30;;;28878:23;;;;;;;;28871:30;;;;;;;;;-1:-1:-1;;28871:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28878:23;;28871:30;;;;28878:23;;28871:30;;28878:23;28871:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28871:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28871:30:0;;;-1:-1:-1;;28871:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28780:129;-1:-1:-1;;28780:129:0:o;31565:5624::-;31744:11;;31704:18;;-1:-1:-1;;;31744:11:0;;;;31743:12;31735:53;;;;-1:-1:-1;;;31735:53:0;;;;;;;:::i;:::-;31823:13;;31807:12;;31823:13;;;;-1:-1:-1;31807:29:0;31799:72;;;;-1:-1:-1;;;31799:72:0;;;;;;;:::i;:::-;31906:14;:21;31890:5;:12;:37;31882:121;;;;-1:-1:-1;;;31882:121:0;;;;;;;:::i;:::-;32014:23;32051:5;:12;32040:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32040:24:0;;32014:50;;32148:12;32133:9;32143:1;32133:12;;;;;;;;;;;;;:27;;;;;;;;;;;32173:14;32205:5;32211:1;32205:8;;;;;;;;;;;;;;-1:-1:-1;;;;;32190:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32173:50;;32234:14;32266:5;32272:1;32266:8;;;;;;;;;;;;;;-1:-1:-1;;;;;32251:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32234:50;;32312:7;:5;:7::i;:::-;-1:-1:-1;;;;;32298:21:0;:10;-1:-1:-1;;;;;32298:21:0;;32295:158;;32354:4;;-1:-1:-1;;;;;32344:14:0;;;32354:4;;32344:14;;;;:32;;-1:-1:-1;32372:4:0;;-1:-1:-1;;;;;32362:14:0;;;32372:4;;32362:14;;32344:32;32336:105;;;;-1:-1:-1;;;32336:105:0;;;;;;;:::i;:::-;32598:4;;32481:16;;-1:-1:-1;;;;;32588:14:0;;;32598:4;;32588:14;;:32;;-1:-1:-1;32616:4:0;;-1:-1:-1;;;;;32606:14:0;;;32616:4;;32606:14;32588:32;32585:55;;;-1:-1:-1;32636:4:0;32585:55;32695:17;32715:12;:30;;32739:6;32715:30;;;32730:6;32715:30;32695:50;;32822:26;32851:209;32872:37;32899:9;32872:26;:37::i;:::-;32851:209;;;;;;;;;;;;;-1:-1:-1;;;32851:209:0;;;32961:34;32988:6;32961:26;:34::i;:::-;32851:209;;;;;;;;;;;;;-1:-1:-1;;;32851:209:0;;;33016:34;33043:6;33016:26;:34::i;:::-;32851:209;;;;;;;;;;;;;-1:-1:-1;;;32851:209:0;;;:6;:209::i;:::-;32822:238;-1:-1:-1;33169:1:0;33152:3429;33176:9;:16;33172:1;:20;33152:3429;;;33216:14;33248:5;33254:1;33248:8;;;;;;;;;;;;;;-1:-1:-1;;;;;33233:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33216:50;;33281:14;33313:5;33319:1;33313:8;;;;;;;;;;;;;;-1:-1:-1;;;;;33298:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33281:50;;33365:7;:5;:7::i;:::-;-1:-1:-1;;;;;33351:21:0;:10;-1:-1:-1;;;;;33351:21:0;;33348:166;;33411:4;;-1:-1:-1;;;;;33401:14:0;;;33411:4;;33401:14;;;;:32;;-1:-1:-1;33429:4:0;;-1:-1:-1;;;;;33419:14:0;;;33429:4;;33419:14;;33401:32;33393:105;;;;-1:-1:-1;;;33393:105:0;;;;;;;:::i;:::-;33740:4;;-1:-1:-1;;;;;33727:17:0;;;33740:4;;33727:17;;:38;;-1:-1:-1;33761:4:0;;-1:-1:-1;;;;;33748:17:0;;;33761:4;;33748:17;33727:38;33724:597;;;33810:4;;-1:-1:-1;;;;;33800:14:0;;;33810:4;;33800:14;;:32;;-1:-1:-1;33828:4:0;;-1:-1:-1;;;;;33818:14:0;;;33828:4;;33818:14;33800:32;:50;;;-1:-1:-1;33846:4:0;;-1:-1:-1;;;;;33836:14:0;;;33846:4;;33836:14;33800:50;:68;;;-1:-1:-1;33864:4:0;;-1:-1:-1;;;;;33854:14:0;;;33864:4;;33854:14;33800:68;33792:171;;;;-1:-1:-1;;;33792:171:0;;;;;;;:::i;:::-;33724:597;;;34197:9;-1:-1:-1;;;;;34187:19:0;:6;-1:-1:-1;;;;;34187:19:0;;:42;;;;34220:9;-1:-1:-1;;;;;34210:19:0;:6;-1:-1:-1;;;;;34210:19:0;;34187:42;34179:124;;;;-1:-1:-1;;;34179:124:0;;;;;;;:::i;:::-;34505:4;;-1:-1:-1;;;;;34492:17:0;;;34505:4;;34492:17;34489:1999;;;34772:4;;34594;;-1:-1:-1;;;;;;34762:14:0;;;34772:4;;34762:14;;:68;;-1:-1:-1;34790:4:0;;-1:-1:-1;;;;;34780:14:0;;;34790:4;;34780:14;:32;;;;-1:-1:-1;34808:4:0;;-1:-1:-1;;;;;34798:14:0;;;34808:4;;34798:14;;34780:32;:50;;;;-1:-1:-1;34826:4:0;;-1:-1:-1;;;;;34816:14:0;;;34826:4;;34816:14;;34780:50;34759:422;;;35078:4;;35063:12;;-1:-1:-1;;;;;35078:14:0;;;:4;;:14;;;;;35063:12;;35073:1;;35063:12;;;;;;:29;;;:12;;;;;;;;;;;:29;35128:4;;-1:-1:-1;;;;;35128:14:0;;;:4;;:14;:32;;35154:6;35128:32;;;35145:6;35128:32;35116:44;;34759:422;34489:1999;;;35394:4;;-1:-1:-1;;;;;35381:17:0;;;35394:4;;35381:17;:35;;;;-1:-1:-1;35412:4:0;;-1:-1:-1;;;;;35402:14:0;;;35412:4;;35402:14;35381:35;:89;;;-1:-1:-1;35430:4:0;;-1:-1:-1;;;;;35420:14:0;;;35430:4;;35420:14;:32;;;;-1:-1:-1;35448:4:0;;-1:-1:-1;;;;;35438:14:0;;;35448:4;;35438:14;;35420:32;:50;;;;-1:-1:-1;35466:4:0;;-1:-1:-1;;;;;35456:14:0;;;35466:4;;35456:14;;35420:50;35378:1110;;;35588:4;;35573:12;;35550:4;;-1:-1:-1;;;;;;35588:14:0;;;:4;;:14;;;;;35573:12;;35583:1;;35573:12;;;;;;:29;;;:12;;;;;;;;;;;:29;35633:4;;-1:-1:-1;;;;;35633:14:0;;;:4;;:14;:32;;35659:6;35633:32;;35378:1110;35981:9;-1:-1:-1;;;;;35971:19:0;:6;-1:-1:-1;;;;;35971:19:0;;35956:9;35966:1;35956:12;;;;;;;;;;;;;:34;;;;;;;;;;;36155:9;-1:-1:-1;;;;;36145:19:0;:6;-1:-1:-1;;;;;36145:19:0;;:37;;36176:6;36145:37;;;36167:6;36145:37;36133:49;;35378:1110;-1:-1:-1;;33194:3:0;;33152:3429;;;;36712:10;36742:286;;;;;;;;36785:12;36742:286;;;;36828:9;36742:286;;;;36864:5;36742:286;;;;36905:14;36742:286;;;;36952:11;36742:286;;;;;;37005:7;:5;:7::i;:::-;-1:-1:-1;;;;;36991:21:0;:10;:21;36742:286;;36712:327;;;;;;;-1:-1:-1;36712:327:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36712:327:0;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36712:327:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36712:327:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36712:327:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36712:327:0;;;-1:-1:-1;;36712:327:0;;;;;;;;;;;;;;;;;37065:10;:17;37100:81;;37065:17;;-1:-1:-1;37170:10:0;;37065:17;;37100:81;;37114:12;;37100:81;:::i;:::-;;;;;;;;;37140:5;37161:7;:5;:7::i;:::-;-1:-1:-1;;;;;37147:21:0;:10;-1:-1:-1;;;;;37147:21:0;;37100:81;;;;;;;:::i;:::-;;;;;;;;31565:5624;;;;;;;;;;;:::o;25612:27::-;;;;;;-1:-1:-1;;;;;25612:27:0;;:::o;25646:39::-;;;-1:-1:-1;;;;;25646:39:0;;:::o;26066:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26066:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26066:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26066:28:0;;;;;;;-1:-1:-1;;26066:28:0;;;;;;;;;;:::o;28415:308::-;28493:14;28520:31;;:::i;:::-;28554:10;28565;28554:22;;;;;;;;;;;;;;;;;28520:56;;;28554:22;;;;;;;;28520:56;;;;;;;;;-1:-1:-1;;28520:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28554:22;;28520:56;;;;28554:22;;28520:56;;28554:22;28520:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28520:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28520:56:0;;;-1:-1:-1;;28520:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28594:8;;28634:21;;;;28657:30;;;;28689:25;;;;28594:121;;-1:-1:-1;;;28594:121:0;;28520:56;;-1:-1:-1;;;;;;28594:8:0;;;;:39;;:121;;28634:21;;28657:30;28689:25;28594:121;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28587:128;28415:308;-1:-1:-1;;;28415:308:0:o;26940:107::-;18546:12;:10;:12::i;:::-;18536:6;;-1:-1:-1;;;;;18536:6:0;;;:22;;;18528:67;;;;-1:-1:-1;;;18528:67:0;;;;;;;:::i;:::-;27014:13:::1;:25:::0;;-1:-1:-1;;27014:25:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;26940:107::o;19269:244::-;18546:12;:10;:12::i;:::-;18536:6;;-1:-1:-1;;;;;18536:6:0;;;:22;;;18528:67;;;;-1:-1:-1;;;18528:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19358:22:0;::::1;19350:73;;;;-1:-1:-1::0;;;19350:73:0::1;;;;;;;:::i;:::-;19460:6;::::0;;19439:38:::1;::::0;-1:-1:-1;;;;;19439:38:0;;::::1;::::0;19460:6;::::1;::::0;19439:38:::1;::::0;::::1;19488:6;:17:::0;;-1:-1:-1;;;;;;19488:17:0::1;-1:-1:-1::0;;;;;19488:17:0;;;::::1;::::0;;;::::1;::::0;;19269:244::o;27896:276::-;27963:7;27983:31;;:::i;:::-;28017:10;28028:11;28017:23;;;;;;;;;;;;;;;;;27983:57;;;28017:23;;;;;;;;27983:57;;;;;;;;;-1:-1:-1;;27983:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28017:23;;27983:57;;;;28017:23;;27983:57;;28017:23;27983:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27983:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27983:57:0;;;-1:-1:-1;;27983:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28058:8;;28083:21;;;;28106:30;;;;28138:25;;;;28058:106;;-1:-1:-1;;;28058:106:0;;27983:57;;-1:-1:-1;;;;;;28058:8:0;;;;:24;;:106;;28083:21;;28106:30;28138:25;28058:106;;:::i;7061:390::-;7120:13;;7224:43;7249:5;-1:-1:-1;;;7224:24:0;:43::i;:::-;7201:66;;7288:6;7282:20;7306:1;7282:25;7278:142;;;7386:22;7402:5;7386:15;:22::i;:::-;7379:29;;;;;16870:106;16958:10;16870:106;:::o;13064:471::-;13122:7;13367:6;13363:47;;-1:-1:-1;13397:1:0;13390:8;;13363:47;13434:5;;;13438:1;13434;:5;:1;13458:5;;;;;:10;13450:56;;;;-1:-1:-1;;;13450:56:0;;;;;;;:::i;:::-;13526:1;-1:-1:-1;13064:471:0;;;;;:::o;14003:132::-;14061:7;14088:39;14092:1;14095;14088:39;;;;;;;;;;;;;;;;;:3;:39::i;37480:375::-;37640:12;37654:17;37675:5;-1:-1:-1;;;;;37675:10:0;37709;37721:2;37725:5;37686:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37686:45:0;;;;;;;;;;;37675:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37639:93;;;;37755:7;:57;;;;-1:-1:-1;37767:11:0;;:16;;:44;;;37798:4;37787:24;;;;;;;;;;;;:::i;:::-;37747:100;;;;-1:-1:-1;;;37747:100:0;;;;;;;:::i;:::-;37480:375;;;;;:::o;37277:195::-;37448:16;;-1:-1:-1;;;;;37448:11:0;;;:16;;;;;37460:3;;37448:16;;;;37460:3;37448:11;:16;;;;;;;;;;;;;;;;;;;38516:220;38657:13;38714:1;38717;38719;38721;38723;38725;38697:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38683:45;;38516:220;;;;;;;;:::o;6264:668::-;6431:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6431:32:0;-1:-1:-1;;;;;;6431:32:0;;;;;6414:50;;6352:13;;6379:12;;6352:13;;-1:-1:-1;;;;;6414:16:0;;;:50;;6431:32;6414:50;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6378:86;;;;6555:7;6554:8;:28;;;-1:-1:-1;6566:11:0;;:16;6554:28;6550:70;;;6599:9;;;;;;;;;;;;;;;;;;6550:70;6680:4;:11;6695:2;6680:17;6676:229;;;6714:15;6743:4;6732:27;;;;;;;;;;;;:::i;:::-;6714:45;;6781:24;6797:7;6781:15;:24::i;:::-;6774:31;;;;;;;6676:229;6841:2;6827:4;:11;:16;6823:82;;;6878:4;6867:26;;;;;;;;;;;;:::i;:::-;6860:33;;;;;;6823:82;-1:-1:-1;;6915:9:0;;;;;;;;;-1:-1:-1;6915:9:0;;;6264:668;-1:-1:-1;;;6264:668:0:o;5992:144::-;6054:13;6087:41;6119:5;6126:1;6087:31;:41::i;14623:345::-;14709:7;14811:12;14804:5;14796:28;;;;-1:-1:-1;;;14796:28:0;;;;;;;;:::i;:::-;;14835:9;14851:1;14847;:5;;;;;;;14623:345;-1:-1:-1;;;;;14623:345:0:o;4389:588::-;4500:13;;;4510:2;4500:13;;;;;;;;;4447;;;;4500;;;;;;;;;;;-1:-1:-1;4500:13:0;4473:40;;4524:14;4558:6;4553:196;4574:2;4570:1;:6;4553:196;;;4598:9;4610:1;4612;4610:4;;;;;;;;;;;-1:-1:-1;;;;;;;4633:9:0;;;4629:109;;4688:4;4663:11;4675:9;4663:22;;;;;;;;;;;:29;-1:-1:-1;;;;;4663:29:0;;;;;;;;-1:-1:-1;4711:11:0;;;;;4629:109;-1:-1:-1;4578:3:0;;4553:196;;;;4759:31;4803:9;4793:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4793:20:0;;4759:54;;4829:6;4824:102;4845:9;4841:1;:13;4824:102;;;4900:11;4912:1;4900:14;;;;;;;;;;;;;;;;4876:18;4895:1;4876:21;;;;;;;;;;;:38;-1:-1:-1;;;;;4876:38:0;;;;;;;;-1:-1:-1;4856:3:0;;4824:102;;;-1:-1:-1;4950:18:0;4389:588;-1:-1:-1;;;;4389:588:0:o;2864:796::-;2934:13;2974:1;2968:3;:7;:12;:23;;;;;2990:1;2984:3;:7;2968:23;:36;;;;;3002:2;2995:3;:9;;2968:36;2960:79;;;;-1:-1:-1;;;2960:79:0;;;;;;;:::i;:::-;3052:14;3079:3;3069:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3069:14:0;-1:-1:-1;3052:31:0;-1:-1:-1;;;;;;3109:10:0;;3094:12;3130:496;3157:1;3151:3;:7;3147:1;:11;3130:496;;;3321:1;3326:2;:6;;;3321:12;3309:25;;;3428:6;3433:1;3428:6;;;;3534:7;;;3529:13;;3568:8;3428:6;3568:4;:8::i;:::-;3557:1;3563;3559;:5;3557:8;;;;;;;;;;;:19;-1:-1:-1;;;;;3557:19:0;;;;;;;;;3606:8;3611:2;3606:4;:8::i;:::-;3591:1;3597;3593;:5;3601:1;3593:9;3591:12;;;;;;;;;;;:23;-1:-1:-1;;;;;3591:23:0;;;;;;;;-1:-1:-1;;3160:3:0;;;;;-1:-1:-1;3130:496:0;;-1:-1:-1;3130:496:0;;-1:-1:-1;3650:1:0;;2864:796;-1:-1:-1;;;;2864:796:0:o;3867:185::-;3912:6;3939:2;3935:1;:6;;;3931:114;;;-1:-1:-1;3974:4:0;3970:8;;3965:14;;3958:21;;3931:114;-1:-1:-1;4028:4:0;4024:8;;4019:14;;4012:21;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;301:707;;418:3;411:4;403:6;399:17;395:27;385:2;;-1:-1;;426:12;385:2;473:6;460:20;495:80;510:64;567:6;510:64;:::i;:::-;495:80;:::i;:::-;603:21;;;486:89;-1:-1;647:4;660:14;;;;635:17;;;749;;;740:27;;;;737:36;-1:-1;734:2;;;786:1;;776:12;734:2;811:1;796:206;821:6;818:1;815:13;796:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;889:50;;953:14;;;;981;;;;843:1;836:9;796:206;;;800:14;;;;;378:630;;;;:::o;3020:241::-;;3124:2;3112:9;3103:7;3099:23;3095:32;3092:2;;;-1:-1;;3130:12;3092:2;85:6;72:20;97:33;124:5;97:33;:::i;3268:263::-;;3383:2;3371:9;3362:7;3358:23;3354:32;3351:2;;;-1:-1;;3389:12;3351:2;226:6;220:13;238:33;265:5;238:33;:::i;3538:366::-;;;3659:2;3647:9;3638:7;3634:23;3630:32;3627:2;;;-1:-1;;3665:12;3627:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3717:63;3817:2;3856:22;;;;2676:20;;-1:-1;;;3621:283::o;3911:235::-;;4012:2;4000:9;3991:7;3987:23;3983:32;3980:2;;;-1:-1;;4018:12;3980:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;4153:257::-;;4265:2;4253:9;4244:7;4240:23;4236:32;4233:2;;;-1:-1;;4271:12;4233:2;1961:6;1955:13;1973:30;1997:5;1973:30;:::i;4417:496::-;;;4560:2;4548:9;4539:7;4535:23;4531:32;4528:2;;;-1:-1;;4566:12;4528:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;:::-;4618:60;-1:-1;4743:2;4728:18;;4715:32;4767:18;4756:30;;4753:2;;;-1:-1;;4789:12;4753:2;4819:78;4889:7;4880:6;4869:9;4865:22;4819:78;:::i;:::-;4809:88;;;4522:391;;;;;:::o;4920:757::-;;;;5105:2;5093:9;5084:7;5080:23;5076:32;5073:2;;;-1:-1;;5111:12;5073:2;1826:6;1813:20;1838:30;1862:5;1838:30;:::i;:::-;5163:60;-1:-1;5288:2;5273:18;;;5260:32;5312:18;5301:30;;;5298:2;;;-1:-1;;5334:12;5298:2;5364:78;5434:7;5425:6;5414:9;5410:22;5364:78;:::i;:::-;5354:88;;5507:2;5496:9;5492:18;5479:32;5465:46;;5312:18;5523:6;5520:30;5517:2;;;-1:-1;;5553:12;5517:2;-1:-1;5629:22;;1144:4;1132:17;;1128:27;-1:-1;1118:2;;-1:-1;;1159:12;1118:2;1206:6;1193:20;1228:80;1243:64;1300:6;1243:64;:::i;1228:80::-;1336:21;;;1393:14;;;;1368:17;;;1482;;;1473:27;;;;1470:36;-1:-1;1467:2;;;-1:-1;;1509:12;1467:2;-1:-1;1535:10;;1529:206;1554:6;1551:1;1548:13;1529:206;;;2676:20;;1622:50;;1576:1;1569:9;;;;;1686:14;;;;1714;;1529:206;;;1533:14;5573:88;;;;;;;;5067:610;;;;;:::o;5684:263::-;;5799:2;5787:9;5778:7;5774:23;5770:32;5767:2;;;-1:-1;;5805:12;5767:2;-1:-1;2093:13;;5761:186;-1:-1;5761:186::o;5954:362::-;;6079:2;6067:9;6058:7;6054:23;6050:32;6047:2;;;-1:-1;;6085:12;6047:2;6136:17;6130:24;6174:18;;6166:6;6163:30;6160:2;;;-1:-1;;6196:12;6160:2;6283:6;6272:9;6268:22;;;2270:3;2263:4;2255:6;2251:17;2247:27;2237:2;;-1:-1;;2278:12;2237:2;2318:6;2312:13;6174:18;33087:6;33084:30;33081:2;;;-1:-1;;33117:12;33081:2;2340:65;33190:9;33171:17;;-1:-1;;33167:33;6079:2;33248:15;2340:65;:::i;:::-;2331:74;;2425:6;2418:5;2411:21;2529:3;6079:2;2520:6;2453;2511:16;;2508:25;2505:2;;;-1:-1;;2536:12;2505:2;2556:39;2588:6;6079:2;2487:5;2483:16;6079:2;2453:6;2449:17;2556:39;:::i;6323:241::-;;6427:2;6415:9;6406:7;6402:23;6398:32;6395:2;;;-1:-1;;6433:12;6395:2;-1:-1;2676:20;;6389:175;-1:-1;6389:175::o;6841:366::-;;;6962:2;6950:9;6941:7;6937:23;6933:32;6930:2;;;-1:-1;;6968:12;6930:2;-1:-1;;2676:20;;;7120:2;7159:22;;;2676:20;;-1:-1;6924:283::o;7214:237::-;;7316:2;7304:9;7295:7;7291:23;7287:32;7284:2;;;-1:-1;;7322:12;7284:2;2965:6;2952:20;37053:4;38364:5;37042:16;38341:5;38338:33;38328:2;;-1:-1;;38375:12;8253:670;;8436:5;33854:12;34900:6;34895:3;34888:19;34937:4;;34932:3;34928:14;8448:83;;34937:4;8602:5;33395:14;-1:-1;8641:260;8666:6;8663:1;8660:13;8641:260;;;8727:13;;-1:-1;;;;;36837:54;8053:37;;7612:14;;;;34526;;;;4767:18;8681:9;8641:260;;;-1:-1;8907:10;;8367:556;-1:-1;;;;;8367:556::o;9685:646::-;;9859:5;33854:12;34900:6;34895:3;34888:19;34937:4;;34932:3;34928:14;9871:80;;34937:4;10019:5;33395:14;-1:-1;10058:251;10083:6;10080:1;10077:13;10058:251;;;10144:13;;36670;36663:21;12531:34;;7782:14;;;;34526;;;;10105:1;10098:9;10058:251;;11069:670;;11252:5;33854:12;34900:6;34895:3;34888:19;34937:4;;34932:3;34928:14;11264:83;;34937:4;11418:5;33395:14;-1:-1;11457:260;11482:6;11479:1;11476:13;11457:260;;;11543:13;;20528:37;;7964:14;;;;34526;;;;11504:1;11497:9;11457:260;;12476:94;36670:13;36663:21;12531:34;;12525:45::o;13248:327::-;;13383:5;33854:12;34900:6;34895:3;34888:19;13467:52;13512:6;34937:4;34932:3;34928:14;34937:4;13493:5;13489:16;13467:52;:::i;:::-;33190:9;37754:14;-1:-1;;37750:28;13531:39;;;;34937:4;13531:39;;13330:245;-1:-1;;13330:245::o;20697:271::-;;12848:5;33854:12;12959:52;13004:6;12999:3;12992:4;12985:5;12981:16;12959:52;:::i;:::-;13023:16;;;;;20831:137;-1:-1;;20831:137::o;21257:1080::-;;12848:5;33854:12;12992:4;12959:52;13004:6;12999:3;12992:4;12985:5;12981:16;12959:52;:::i;:::-;33854:12;;13023:16;;;;12959:52;33854:12;13023:16;12981;;;12959:52;:::i;:::-;33854:12;;13023:16;;;12959:52;33854:12;13023:16;12981;;;12959:52;:::i;:::-;33854:12;;13023:16;;;12959:52;33854:12;13023:16;12981;;;12959:52;:::i;:::-;33854:12;;13023:16;;;12959:52;33854:12;13023:16;12981;;;12959:52;:::i;:::-;33854:12;;13023:16;;;12959:52;33854:12;13023:16;12981;;;12959:52;:::i;:::-;13023:16;;;;;21633:704;-1:-1;;;;;;;;;21633:704::o;22344:222::-;-1:-1;;;;;36837:54;;;;8053:37;;22471:2;22456:18;;22442:124::o;22573:333::-;-1:-1;;;;;36837:54;;;;8053:37;;22892:2;22877:18;;20528:37;22728:2;22713:18;;22699:207::o;22913:876::-;;23240:2;23261:17;23254:47;23315:108;23240:2;23229:9;23225:18;23409:6;23315:108;:::i;:::-;23471:9;23465:4;23461:20;23456:2;23445:9;23441:18;23434:48;23496:108;23599:4;23590:6;23496:108;:::i;:::-;23488:116;;23652:9;23646:4;23642:20;23637:2;23626:9;23622:18;23615:48;23677:102;23774:4;23765:6;23677:102;:::i;:::-;23669:110;23211:578;-1:-1;;;;;;23211:578::o;23796:976::-;;24145:3;24167:17;24160:47;24221:108;24145:3;24134:9;24130:19;24315:6;24221:108;:::i;:::-;24377:9;24371:4;24367:20;24362:2;24351:9;24347:18;24340:48;24402:108;24505:4;24496:6;24402:108;:::i;:::-;24394:116;;24558:9;24552:4;24548:20;24543:2;24532:9;24528:18;24521:48;24583:102;24680:4;24671:6;24583:102;:::i;:::-;24575:110;;;12558:5;36670:13;36663:21;24758:2;24747:9;24743:18;12531:34;24116:656;;;;;;;:::o;24779:469::-;;24978:2;24999:17;24992:47;25053:108;24978:2;24967:9;24963:18;25147:6;25053:108;:::i;:::-;25045:116;;12558:5;36670:13;36663:21;25234:2;25223:9;25219:18;12531:34;24949:299;;;;;:::o;25548:310::-;;25695:2;25716:17;25709:47;25770:78;25695:2;25684:9;25680:18;25834:6;25770:78;:::i;25865:508::-;;26056:2;26077:17;26070:47;26131:78;26056:2;26045:9;26041:18;26195:6;26131:78;:::i;:::-;36670:13;;36663:21;26282:2;26267:18;;12531:34;-1:-1;36670:13;;36663:21;26359:2;26344:18;;;12531:34;26123:86;26027:346;-1:-1;26027:346::o;26380:416::-;26580:2;26594:47;;;14528:2;26565:18;;;34888:19;14564:34;34928:14;;;14544:55;14633:30;14619:12;;;14612:52;14683:12;;;26551:245::o;26803:416::-;27003:2;27017:47;;;14934:2;26988:18;;;34888:19;14970:34;34928:14;;;14950:55;-1:-1;;;15025:12;;;15018:30;15067:12;;;26974:245::o;27226:416::-;27426:2;27440:47;;;15318:2;27411:18;;;34888:19;15354:34;34928:14;;;15334:55;-1:-1;;;15409:12;;;15402:33;15454:12;;;27397:245::o;27649:416::-;27849:2;27863:47;;;15705:2;27834:18;;;34888:19;15741:34;34928:14;;;15721:55;15810:34;15796:12;;;15789:56;-1:-1;;;15865:12;;;15858:31;15908:12;;;27820:245::o;28072:416::-;28272:2;28286:47;;;16159:2;28257:18;;;34888:19;16195:32;34928:14;;;16175:53;16247:12;;;28243:245::o;28495:416::-;28695:2;28709:47;;;16498:2;28680:18;;;34888:19;16534:30;34928:14;;;16514:51;16584:12;;;28666:245::o;28918:416::-;29118:2;29132:47;;;16835:2;29103:18;;;34888:19;16871:32;34928:14;;;16851:53;16923:12;;;29089:245::o;29341:416::-;29541:2;29555:47;;;17174:2;29526:18;;;34888:19;17210:34;34928:14;;;17190:55;-1:-1;;;17265:12;;;17258:25;17302:12;;;29512:245::o;29764:416::-;29964:2;29978:47;;;17553:2;29949:18;;;34888:19;17589:34;34928:14;;;17569:55;-1:-1;;;17644:12;;;17637:33;17689:12;;;29935:245::o;30187:416::-;30387:2;30401:47;;;17940:2;30372:18;;;34888:19;17976:34;34928:14;;;17956:55;18045:34;18031:12;;;18024:56;-1:-1;;;18100:12;;;18093:29;18141:12;;;30358:245::o;30610:416::-;30810:2;30824:47;;;30795:18;;;34888:19;18428:34;34928:14;;;18408:55;18482:12;;;30781:245::o;31033:416::-;31233:2;31247:47;;;18733:2;31218:18;;;34888:19;18769:32;34928:14;;;18749:53;18821:12;;;31204:245::o;31456:374::-;;31635:2;31656:17;31649:47;19171:16;19165:23;19091:4;31635:2;31624:9;31620:18;19201:38;19254:73;19082:14;31624:9;19082:14;19308:12;19254:73;:::i;:::-;19246:81;;31635:2;19410:5;19406:16;19400:23;33190:9;;19459:14;31624:9;19463:4;19459:14;;19443;31624:9;19443:14;19436:38;19489:97;19581:4;19567:12;19489:97;:::i;:::-;19481:105;;19443:14;19665:5;19661:16;19655:23;19635:43;;19459:14;31624:9;19718:4;19714:14;;19698;31624:9;19698:14;19691:38;19744:103;19842:4;19828:12;19744:103;:::i;:::-;19736:111;;19698:14;19935:5;19931:16;19925:23;19905:43;;19459:14;31624:9;19988:4;19984:14;;19968;31624:9;19968:14;19961:38;;20014:103;20112:4;20098:12;20014:103;:::i;:::-;20006:111;;;19968:14;20202:5;20198:16;20192:23;36670:13;36663:21;20263:14;31624:9;20263:14;12531:34;20263:14;20352:5;20348:16;20342:23;20371:57;19091:4;31624:9;20413:14;20399:12;20371:57;:::i;:::-;-1:-1;31702:118;31606:224;-1:-1;;;31606:224::o;31837:222::-;20528:37;;;31964:2;31949:18;;31935:124::o;32066:256::-;32128:2;32122:9;32154:17;;;32229:18;32214:34;;32250:22;;;32211:62;32208:2;;;32286:1;;32276:12;32208:2;32128;32295:22;32106:216;;-1:-1;32106:216::o;32329:304::-;;32488:18;32480:6;32477:30;32474:2;;;-1:-1;;32510:12;32474:2;-1:-1;32555:4;32543:17;;;32608:15;;32411:222::o;37410:268::-;37475:1;37482:101;37496:6;37493:1;37490:13;37482:101;;;37563:11;;;37557:18;37544:11;;;37537:39;37518:2;37511:10;37482:101;;;37598:6;37595:1;37592:13;37589:2;;;-1:-1;;37475:1;37645:16;;37638:27;37459:219::o;37791:117::-;-1:-1;;;;;36837:54;;37850:35;;37840:2;;37899:1;;37889:12;37915:111;37996:5;36670:13;36663:21;37974:5;37971:32;37961:2;;38017:1;;38007:12
Swarm Source
ipfs://8359551105a7072d1f98f4c4472671c0a5b81ab36503956f1059e85930517ef9
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
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.