Contract Source Code (Solidity Multiple files format)
More Options
SimilarSol2UmlNEWSubmit AuditCompareNEW
File 19 of 26: LADDER.sol
/* |||||||| |||||||| |||||||| |||||||| |||||||| ▄▀▀▀▀▄ |||||||| |||||||| █ █ |||||||| |||||||| ▐ █ |||||||| |||||||| █ |||||||| |||||||| ▄▀▄▄▄▄▄▄▀ |||||||| |||||||| █ |||||||| |||||||| ▐ |||||||| ||||||||-------------------|||||||| ||||||||-------------------|||||||| |||||||| ▄▀▀█▄ |||||||| |||||||| ▐ ▄▀ ▀▄ |||||||| |||||||| █▄▄▄█ |||||||| |||||||| ▄▀ █ |||||||| |||||||| █ ▄▀ |||||||| |||||||| ▐ ▐ |||||||| ||||||||-------------------|||||||| ||||||||-------------------|||||||| |||||||| ▄▀▀█▄▄ |||||||| |||||||| █ ▄▀ █ |||||||| |||||||| ▐ █ █ |||||||| |||||||| █ █ |||||||| |||||||| ▄▀▄▄▄▄▀ |||||||| |||||||| █ ▐ |||||||| |||||||| ▐ |||||||| ||||||||-------------------|||||||| ||||||||-------------------|||||||| |||||||| ▄▀▀█▄▄ |||||||| |||||||| █ ▄▀ █ |||||||| |||||||| ▐ █ █ |||||||| |||||||| █ █ |||||||| |||||||| ▄▀▄▄▄▄▀ |||||||| |||||||| █ ▐ |||||||| |||||||| ▐ |||||||| ||||||||-------------------|||||||| ||||||||-------------------|||||||| |||||||| ▄▀▀█▄▄▄▄ |||||||| |||||||| ▐ ▄▀ ▐ |||||||| |||||||| █▄▄▄▄▄ |||||||| |||||||| █ ▌ |||||||| |||||||| ▄▀▄▄▄▄ |||||||| |||||||| █ ▐ |||||||| ||||||||-------------------|||||||| ||||||||-------------------|||||||| |||||||| ▄▀▀▄▀▀▀▄ |||||||| |||||||| █ █ █ |||||||| |||||||| ▐ █▀▀█▀ |||||||| |||||||| ▄▀ █ |||||||| |||||||| █ █ |||||||| |||||||| ▐ ▐ |||||||| |||||||| |||||||| |||||||| |||||||| LADDER is an experimental self-marketmaking token using liquidity bins on Trader Joe v2.1Forked from White Lotus Token80% of rebalance goes to floor, 20% goes to wall If price moves from wall into floor, the function punishFloorSellers can be activated by anyone to burn the price wall resistance bin.Because of this new burn mechanic, the sell tax which previously was split between stakers and a burn now all goes to stakers.This token is an attempt at a store of value cryptocurrency, with a likely floor price. The floor price is not guaranteed. This token is not an investment vehicle, it is an experiment. LADDER is a fully decentralized protocol. There will be no continued development besides the contracts herein. Full ownership will be revoked and further development(such as an interface for staking, rebalancing etc) will be the onus of the community */// SPDX-License-Identifier: MITpragma solidity ^0.8.10;import {SafeTransferLib} from "./SafeTransferLib.sol";import {ERC20} from "./ERC20.sol";import "./Ownable.sol";import "./ILBPair.sol";import "./ILBRouter.sol";import "./ILBToken.sol";import "./IERC20.sol";import "./SafeMath.sol";import "./Constants.sol";import {PriceHelper} from "./PriceHelper.sol";contract LADDER is ERC20, Ownable { using SafeTransferLib for address payable; using SafeMath for uint256; using PriceHelper for uint256; ILBRouter public joeRouter; ILBPair public pair; address public vault; //staking contract address public immutable NATIVE; //weth address private founderWallet; address private devWallet; bool public rebalancesEnabled; bool public feesEnabled; bool isRebalancing; // JOE LIQ uint16 public binStep; //bin steps uint24 public startBin; //starting bin uint256 public lastRecordedActiveBin; //recorded bin to know where rebalances occur. uint24 public maxBin; //this is the last bin where we have liq uint256 public xPerBin; //xToken amount per bin uint256 public slippageToleranceMultiplier = 99; uint24 public floorLiquidityBin; //the floor where bin liquidity sits. uint24 public tightLiqBin; //bin for active trading /// @dev updated fee breakdown uint256 public stakeFee = 100; //10% uint24 public seedLiquidityTimes; //for initialize function uint256 public maxSupply; bool public tradingEnabled; // @dev blacklisting dexes to only provision liq to traderjoe // give me a mapping of address to bool mapping(address => bool) public blacklist; constructor( ILBRouter joeRouter_, address native_, uint256 maxSupply_, uint256 _xPerBin, address devWallet_, address founderWallet_ ) ERC20("LADDER", "LADDER", 18) { address uniswapv3 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45; address sushiswap = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506; address sushiswapTrident = 0xD9988b4B5bBC53A794240496cfA9Bf5b1F8E0523; address balancer = 0xBA12222222228d8Ba445958a75a0704d566BF2C8; address camelot = 0xc873fEcbd354f5A56E00E710B90EF4201db2448d; address chronos = 0xdd94018F54e565dbfc939F7C44a16e163FaAb331; address curve = 0x4c2Af2Df2a7E567B5155879720619EA06C5BB15D; address joev1 = 0xaE4EC9901c3076D0DdBe76A520F9E90a6227aCB7; address joev2 = 0x7BFd7192E76D950832c77BB412aaE841049D8D9B; blacklist[uniswapv3] = true; blacklist[sushiswap] = true; blacklist[sushiswapTrident] = true; blacklist[balancer] = true; blacklist[camelot] = true; blacklist[chronos] = true; blacklist[curve] = true; blacklist[joev1] = true; blacklist[joev2] = true; joeRouter = joeRouter_; NATIVE = native_; devWallet = devWallet_; founderWallet = founderWallet_; maxSupply = maxSupply_ * 1 ether; rebalancesEnabled = true; feesEnabled = true; xPerBin = _xPerBin * 1 ether; } modifier rebalanceAllowed() { if (binStep == 0 || floorLiquidityBin == getActiveBinId()) { revert("At floor"); } if ( getActiveBinId() - lastRecordedActiveBin > 19 && rebalancesEnabled ) { _; } else { revert("Out of range"); } } //==================================================================================================================== // Initialize functions - messy cause developed via hackaton and would run out of gas otherwise. works on my machine. //==================================================================================================================== function initialize( address pair_, int256[] memory deltaIds, uint256[] memory distributionX, uint256[] memory distributionY, address _vault ) external payable onlyOwner { require(seedLiquidityTimes < 12, "initialized"); if (seedLiquidityTimes == 0) { vault = _vault; pair = ILBPair(pair_); binStep = pair.getBinStep(); startBin = getActiveBinId(); lastRecordedActiveBin = getActiveBinId() + 1; // add one because it's where our liquidity sits approvals(); maxBin = getActiveBinId() + 1200; } _mint(address(this), maxSupply / 12); isRebalancing = true; addLiquidity(deltaIds, distributionX, distributionY, getActiveBinId()); isRebalancing = false; seedLiquidityTimes = seedLiquidityTimes + 1; } //============================================================================= // Rebalance //============================================================================= // Rebalance liquidity function rebalanceLiquidity() external rebalanceAllowed { isRebalancing = true; removeLiquidity(); uint256 totalEthInContract = IERC20(NATIVE).balanceOf(address(this)); uint256 totalLotusInPool = (maxBin - (getActiveBinId() + 1)) * xPerBin; uint256 totalCirculatingSupply = totalSupply - (totalLotusInPool + balanceOf[0x000000000000000000000000000000000000dEaD]); uint256 newFloorPrice = getAverageTokenPrice( totalEthInContract, totalCirculatingSupply ); uint24 expectedFloorBin = joeRouter.getIdFromPrice( pair, newFloorPrice.convertDecimalPriceTo128x128() ); floorLiquidityBin = expectedFloorBin > getActiveBinId() ? getActiveBinId() - 1 : expectedFloorBin; int256 deltaForMainLiq = -(int24(getActiveBinId()) - int256(int24(floorLiquidityBin))); tightLiqBin = getActiveBinId() - 1; int256[] memory deltaIds = new int256[](2); deltaIds[0] = deltaForMainLiq; deltaIds[1] = -1; uint256[] memory distributionX = new uint256[](2); distributionX[0] = 0; distributionX[1] = 0; uint256[] memory distributionY = new uint256[](2); // @dev changed %'s distributionY[0] = (Constants.PRECISION * 80) / 100; distributionY[1] = (Constants.PRECISION * 20) / 100; addLiquidity(deltaIds, distributionX, distributionY, getActiveBinId()); isRebalancing = false; } function punishFloorSellers() external { // Have to be at floor require( getActiveBinId() == floorLiquidityBin, "active bin must be floor" ); uint256[] memory amounts = new uint256[](1); uint256[] memory ids = new uint256[](1); ids[0] = tightLiqBin; amounts[0] = pair.balanceOf(address(this), tightLiqBin) - 1; // remove liquidity from tightLiqBin pair.burn(address(this), address(this), ids, amounts); // burn the MOAT that is received from removeLiquidity. _burn(address(this), balanceOf[address(this)]); } function removeLiquidity() internal { bool isInsideRange = false; uint256 numberOfBinsToWithdraw = (getActiveBinId() - lastRecordedActiveBin); numberOfBinsToWithdraw = floorLiquidityBin == 0 ? numberOfBinsToWithdraw : numberOfBinsToWithdraw + 1; if ( tightLiqBin >= lastRecordedActiveBin && tightLiqBin <= lastRecordedActiveBin + numberOfBinsToWithdraw ) { isInsideRange = true; } else { if (floorLiquidityBin > 0) { isInsideRange = false; numberOfBinsToWithdraw++; } } uint256[] memory amounts = new uint256[](numberOfBinsToWithdraw); uint256[] memory ids = new uint256[](numberOfBinsToWithdraw); for (uint256 i; i < numberOfBinsToWithdraw; i++) { ids[i] = lastRecordedActiveBin + i; } if (floorLiquidityBin != 0) { ids[ids.length - 1] = floorLiquidityBin; if (!isInsideRange) ids[numberOfBinsToWithdraw - 2] = tightLiqBin; } lastRecordedActiveBin = getActiveBinId(); for (uint256 i; i < numberOfBinsToWithdraw; i++) { uint256 LBTokenAmount = pair.balanceOf(address(this), ids[i]); amounts[i] = LBTokenAmount; } pair.burn(address(this), address(this), ids, amounts); } function addLiquidity( int256[] memory deltaIds, uint256[] memory distributionX, uint256[] memory distributionY, uint24 activeIdDesired ) internal { uint256 amountX = balanceOf[address(this)]; uint256 amountY = IERC20(NATIVE).balanceOf(address(this)); uint256 amountXmin = (amountX * slippageToleranceMultiplier) / 100; // We allow 1% amount slippage uint256 amountYmin = (amountY * slippageToleranceMultiplier) / 100; // We allow 1% amount slippage uint256 idSlippage = 0; ILBRouter.LiquidityParameters memory liquidityParameters = ILBRouter .LiquidityParameters( IERC20(address(this)), IERC20(NATIVE), binStep, amountX, amountY, amountXmin, amountYmin, activeIdDesired, //activeIdDesired idSlippage, deltaIds, distributionX, distributionY, address(this), address(this), block.timestamp ); joeRouter.addLiquidity(liquidityParameters); } //============================================================================= // Tax and transfer mechanism //============================================================================= /** * @notice charge tax on sells and buys functions. * @return _amount remaining to the sender */ function chargeTax( address from, address to, uint256 amount ) internal returns (uint256 _amount) { _amount = amount; if (feesEnabled && !isRebalancing) { // buy tax if (from == address(pair) && to != (address(this))) { // todo: figure out fee split uint256 devFee = calculateFee(_amount, 15); // 1.5% uint256 founderFee = calculateFee(_amount, 10); // 1% balanceOf[devWallet] += devFee; emit Transfer(from, devWallet, devFee); balanceOf[founderWallet] += founderFee; emit Transfer(from, founderWallet, founderFee); _amount -= devFee; _amount -= founderFee; } // sell tax if (from == address(joeRouter) && to == address(pair)) { uint256 sendToVault; if (getActiveBinId() == floorLiquidityBin) { sendToVault = calculateFee(_amount, stakeFee); balanceOf[vault] += sendToVault; emit Transfer(from, vault, sendToVault); _amount -= sendToVault; } else { sendToVault = calculateFee(_amount, stakeFee); balanceOf[vault] += sendToVault; emit Transfer(from, vault, sendToVault); _amount -= (sendToVault); } } } } function transfer( address to, uint256 amount ) public virtual override returns (bool) { if (tradingEnabled == false) { revert("Trading is not enabled"); } balanceOf[msg.sender] -= amount; uint256 _amount = chargeTax(msg.sender, to, amount); // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += _amount; } emit Transfer(msg.sender, to, _amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { if (tradingEnabled == false) { require(from == address(this)); } // @dev check that to and from aren't on blacklist require( !blacklist[to] && !blacklist[from], "error: invalid liquidity pool" ); uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) { allowance[from][msg.sender] = allowed - amount; } balanceOf[from] -= amount; uint256 _amount = chargeTax(msg.sender, to, amount); // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += _amount; } emit Transfer(from, to, _amount); return true; } //============================================================================= // Helpers //============================================================================= function calculateFee( uint256 amount, uint256 pct ) public pure returns (uint256) { uint256 feePercentage = Constants.PRECISION.mul(pct).div(1000); // x pct return amount.mul(feePercentage).div(Constants.PRECISION); } /** * @notice Helper func. */ function getAverageTokenPrice( uint256 totalETH, uint256 totalTokens ) public pure returns (uint256) { require(totalETH < totalTokens, "ETH must be less than total tokens"); return (totalETH * Constants.PRECISION) / (totalTokens); } /** * @notice returns the current floor price */ function getFloorPrice() public view returns (uint256) { return joeRouter.getPriceFromId(pair, floorLiquidityBin); } /** * @notice Get's the pool active bin id. */ function getActiveBinId() public view returns (uint24) { return pair.getActiveId(); } function feeReceiver() public view returns (address) { return owner(); } //============================================================================= // ADMIN //============================================================================= /** * @notice approvals for joe router. */ function approvals() public onlyOwner { allowance[address(this)][address(joeRouter)] = 2 ** 256 - 1; IERC20(NATIVE).approve(address(joeRouter), 2 ** 256 - 1); ILBToken(address(pair)).approveForAll(address(joeRouter), true); ILBToken(address(pair)).approveForAll(address(pair), true); } /** * @notice only admin function to disable rebalances and fees in case of bugs. * @param rebalances bool rebalances enabled?. * @param fees bool fees enabled? */ function disableRebalances(bool rebalances, bool fees) external onlyOwner { rebalancesEnabled = rebalances; feesEnabled = fees; } // in case of bugs in the staking contract we send to a new vault function setNewVault(address newVault) external onlyOwner { vault = newVault; } function openTrading() external onlyOwner { tradingEnabled = true; } function setSlippageToleranceMultiplier( uint256 newSlippageTolerance ) external onlyOwner { require( newSlippageTolerance > 0 && newSlippageTolerance <= 99, "out of slippage range (1-99)" ); slippageToleranceMultiplier = newSlippageTolerance; } receive() external payable {}}
File 1 of 26: BitMath.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;/** * @title Liquidity Book Bit Math Library * @author Trader Joe * @notice Helper contract used for bit calculations */library BitMath { /** * @dev Returns the index of the closest bit on the right of x that is non null * @param x The value as a uint256 * @param bit The index of the bit to start searching at * @return id The index of the closest non null bit on the right of x. * If there is no closest bit, it returns max(uint256) */ function closestBitRight(uint256 x, uint8 bit) internal pure returns (uint256 id) { unchecked { uint256 shift = 255 - bit; x <<= shift; // can't overflow as it's non-zero and we shifted it by `_shift` return (x == 0) ? type(uint256).max : mostSignificantBit(x) - shift; } } /** * @dev Returns the index of the closest bit on the left of x that is non null * @param x The value as a uint256 * @param bit The index of the bit to start searching at * @return id The index of the closest non null bit on the left of x. * If there is no closest bit, it returns max(uint256) */ function closestBitLeft(uint256 x, uint8 bit) internal pure returns (uint256 id) { unchecked { x >>= bit; return (x == 0) ? type(uint256).max : leastSignificantBit(x) + bit; } } /** * @dev Returns the index of the most significant bit of x * This function returns 0 if x is 0 * @param x The value as a uint256 * @return msb The index of the most significant bit of x */ function mostSignificantBit(uint256 x) internal pure returns (uint8 msb) { assembly { if gt(x, 0xffffffffffffffffffffffffffffffff) { x := shr(128, x) msb := 128 } if gt(x, 0xffffffffffffffff) { x := shr(64, x) msb := add(msb, 64) } if gt(x, 0xffffffff) { x := shr(32, x) msb := add(msb, 32) } if gt(x, 0xffff) { x := shr(16, x) msb := add(msb, 16) } if gt(x, 0xff) { x := shr(8, x) msb := add(msb, 8) } if gt(x, 0xf) { x := shr(4, x) msb := add(msb, 4) } if gt(x, 0x3) { x := shr(2, x) msb := add(msb, 2) } if gt(x, 0x1) { msb := add(msb, 1) } } } /** * @dev Returns the index of the least significant bit of x * This function returns 255 if x is 0 * @param x The value as a uint256 * @return lsb The index of the least significant bit of x */ function leastSignificantBit(uint256 x) internal pure returns (uint8 lsb) { assembly { let sx := shl(128, x) if iszero(iszero(sx)) { lsb := 128 x := sx } sx := shl(64, x) if iszero(iszero(sx)) { x := sx lsb := add(lsb, 64) } sx := shl(32, x) if iszero(iszero(sx)) { x := sx lsb := add(lsb, 32) } sx := shl(16, x) if iszero(iszero(sx)) { x := sx lsb := add(lsb, 16) } sx := shl(8, x) if iszero(iszero(sx)) { x := sx lsb := add(lsb, 8) } sx := shl(4, x) if iszero(iszero(sx)) { x := sx lsb := add(lsb, 4) } sx := shl(2, x) if iszero(iszero(sx)) { x := sx lsb := add(lsb, 2) } if iszero(iszero(shl(1, x))) { lsb := add(lsb, 1) } lsb := sub(255, lsb) } }}
File 2 of 26: Constants.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;/** * @title Liquidity Book Constants Library * @author Trader Joe * @notice Set of constants for Liquidity Book contracts */library Constants { uint8 internal constant SCALE_OFFSET = 128; uint256 internal constant SCALE = 1 << SCALE_OFFSET; uint256 internal constant PRECISION = 1e18; uint256 internal constant SQUARED_PRECISION = PRECISION * PRECISION; uint256 internal constant MAX_FEE = 0.1e18; // 10% uint256 internal constant MAX_PROTOCOL_SHARE = 2_500; // 25% of the fee uint256 internal constant BASIS_POINT_MAX = 10_000; /// @dev The expected return after a successful flash loan bytes32 internal constant CALLBACK_SUCCESS = keccak256("LBPair.onFlashLoan");}
File 3 of 26: Context.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragma solidity ^0.8.0;/** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; }}
File 4 of 26: ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity >=0.8.0;/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation./// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol, uint8 _decimals) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); }}
File 5 of 26: IERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)pragma solidity ^0.8.0;/** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool);}
File 6 of 26: IERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.0;/** * @dev Interface of the ERC20 standard as defined in the EIP. */interface IERC20 { /** * @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); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);}
File 7 of 26: IJoeFactory.sol
// SPDX-License-Identifier: GPL-3.0pragma solidity 0.8.10;/// @title Joe V1 Factory Interface/// @notice Interface to interact with Joe V1 Factoryinterface IJoeFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint256); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function migrator() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; function setMigrator(address) external;}
File 8 of 26: ILBFactory.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {IERC20} from "./IERC20.sol";import {ILBPair} from "./ILBPair.sol";import {IPendingOwnable} from "./IPendingOwnable.sol";/** * @title Liquidity Book Factory Interface * @author Trader Joe * @notice Required interface of LBFactory contract */interface ILBFactory is IPendingOwnable { error LBFactory__IdenticalAddresses(IERC20 token); error LBFactory__QuoteAssetNotWhitelisted(IERC20 quoteAsset); error LBFactory__QuoteAssetAlreadyWhitelisted(IERC20 quoteAsset); error LBFactory__AddressZero(); error LBFactory__LBPairAlreadyExists(IERC20 tokenX, IERC20 tokenY, uint256 _binStep); error LBFactory__LBPairDoesNotExist(IERC20 tokenX, IERC20 tokenY, uint256 binStep); error LBFactory__LBPairNotCreated(IERC20 tokenX, IERC20 tokenY, uint256 binStep); error LBFactory__FlashLoanFeeAboveMax(uint256 fees, uint256 maxFees); error LBFactory__BinStepTooLow(uint256 binStep); error LBFactory__PresetIsLockedForUsers(address user, uint256 binStep); error LBFactory__LBPairIgnoredIsAlreadyInTheSameState(); error LBFactory__BinStepHasNoPreset(uint256 binStep); error LBFactory__PresetOpenStateIsAlreadyInTheSameState(); error LBFactory__SameFeeRecipient(address feeRecipient); error LBFactory__SameFlashLoanFee(uint256 flashLoanFee); error LBFactory__LBPairSafetyCheckFailed(address LBPairImplementation); error LBFactory__SameImplementation(address LBPairImplementation); error LBFactory__ImplementationNotSet(); /** * @dev Structure to store the LBPair information, such as: * binStep: The bin step of the LBPair * LBPair: The address of the LBPair * createdByOwner: Whether the pair was created by the owner of the factory * ignoredForRouting: Whether the pair is ignored for routing or not. An ignored pair will not be explored during routes finding */ struct LBPairInformation { uint16 binStep; ILBPair LBPair; bool createdByOwner; bool ignoredForRouting; } event LBPairCreated( IERC20 indexed tokenX, IERC20 indexed tokenY, uint256 indexed binStep, ILBPair LBPair, uint256 pid ); event FeeRecipientSet(address oldRecipient, address newRecipient); event FlashLoanFeeSet(uint256 oldFlashLoanFee, uint256 newFlashLoanFee); event LBPairImplementationSet(address oldLBPairImplementation, address LBPairImplementation); event LBPairIgnoredStateChanged(ILBPair indexed LBPair, bool ignored); event PresetSet( uint256 indexed binStep, uint256 baseFactor, uint256 filterPeriod, uint256 decayPeriod, uint256 reductionFactor, uint256 variableFeeControl, uint256 protocolShare, uint256 maxVolatilityAccumulator ); event PresetOpenStateChanged(uint256 indexed binStep, bool indexed isOpen); event PresetRemoved(uint256 indexed binStep); event QuoteAssetAdded(IERC20 indexed quoteAsset); event QuoteAssetRemoved(IERC20 indexed quoteAsset); function getMinBinStep() external pure returns (uint256); function getFeeRecipient() external view returns (address); function getMaxFlashLoanFee() external pure returns (uint256); function getFlashLoanFee() external view returns (uint256); function getLBPairImplementation() external view returns (address); function getNumberOfLBPairs() external view returns (uint256); function getLBPairAtIndex(uint256 id) external returns (ILBPair); function getNumberOfQuoteAssets() external view returns (uint256); function getQuoteAssetAtIndex(uint256 index) external view returns (IERC20); function isQuoteAsset(IERC20 token) external view returns (bool); function getLBPairInformation(IERC20 tokenX, IERC20 tokenY, uint256 binStep) external view returns (LBPairInformation memory); function getPreset(uint256 binStep) external view returns ( uint256 baseFactor, uint256 filterPeriod, uint256 decayPeriod, uint256 reductionFactor, uint256 variableFeeControl, uint256 protocolShare, uint256 maxAccumulator, bool isOpen ); function getAllBinSteps() external view returns (uint256[] memory presetsBinStep); function getOpenBinSteps() external view returns (uint256[] memory openBinStep); function getAllLBPairs(IERC20 tokenX, IERC20 tokenY) external view returns (LBPairInformation[] memory LBPairsBinStep); function setLBPairImplementation(address lbPairImplementation) external; function createLBPair(IERC20 tokenX, IERC20 tokenY, uint24 activeId, uint16 binStep) external returns (ILBPair pair); function setLBPairIgnored(IERC20 tokenX, IERC20 tokenY, uint16 binStep, bool ignored) external; function setPreset( uint16 binStep, uint16 baseFactor, uint16 filterPeriod, uint16 decayPeriod, uint16 reductionFactor, uint24 variableFeeControl, uint16 protocolShare, uint24 maxVolatilityAccumulator, bool isOpen ) external; function setPresetOpenState(uint16 binStep, bool isOpen) external; function removePreset(uint16 binStep) external; function setFeesParametersOnPair( IERC20 tokenX, IERC20 tokenY, uint16 binStep, uint16 baseFactor, uint16 filterPeriod, uint16 decayPeriod, uint16 reductionFactor, uint24 variableFeeControl, uint16 protocolShare, uint24 maxVolatilityAccumulator ) external; function setFeeRecipient(address feeRecipient) external; function setFlashLoanFee(uint256 flashLoanFee) external; function addQuoteAsset(IERC20 quoteAsset) external; function removeQuoteAsset(IERC20 quoteAsset) external; function forceDecay(ILBPair lbPair) external;}
File 9 of 26: ILBFlashLoanCallback.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {IERC20} from "./IERC20.sol";/// @title Liquidity Book Flashloan Callback Interface/// @author Trader Joe/// @notice Required interface to interact with LB flash loansinterface ILBFlashLoanCallback { function LBFlashLoanCallback( address sender, IERC20 tokenX, IERC20 tokenY, bytes32 amounts, bytes32 totalFees, bytes calldata data ) external returns (bytes32);}
File 10 of 26: ILBLegacyFactory.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {IERC20} from "./IERC20.sol";import {ILBLegacyPair} from "./ILBLegacyPair.sol";import {IPendingOwnable} from "./IPendingOwnable.sol";/// @title Liquidity Book Factory Interface/// @author Trader Joe/// @notice Required interface of LBFactory contractinterface ILBLegacyFactory is IPendingOwnable { /// @dev Structure to store the LBPair information, such as: /// - binStep: The bin step of the LBPair /// - LBPair: The address of the LBPair /// - createdByOwner: Whether the pair was created by the owner of the factory /// - ignoredForRouting: Whether the pair is ignored for routing or not. An ignored pair will not be explored during routes finding struct LBPairInformation { uint16 binStep; ILBLegacyPair LBPair; bool createdByOwner; bool ignoredForRouting; } event LBPairCreated( IERC20 indexed tokenX, IERC20 indexed tokenY, uint256 indexed binStep, ILBLegacyPair LBPair, uint256 pid ); event FeeRecipientSet(address oldRecipient, address newRecipient); event FlashLoanFeeSet(uint256 oldFlashLoanFee, uint256 newFlashLoanFee); event FeeParametersSet( address indexed sender, ILBLegacyPair indexed LBPair, uint256 binStep, uint256 baseFactor, uint256 filterPeriod, uint256 decayPeriod, uint256 reductionFactor, uint256 variableFeeControl, uint256 protocolShare, uint256 maxVolatilityAccumulator ); event FactoryLockedStatusUpdated(bool unlocked); event LBPairImplementationSet(address oldLBPairImplementation, address LBPairImplementation); event LBPairIgnoredStateChanged(ILBLegacyPair indexed LBPair, bool ignored); event PresetSet( uint256 indexed binStep, uint256 baseFactor, uint256 filterPeriod, uint256 decayPeriod, uint256 reductionFactor, uint256 variableFeeControl, uint256 protocolShare, uint256 maxVolatilityAccumulator, uint256 sampleLifetime ); event PresetRemoved(uint256 indexed binStep); event QuoteAssetAdded(IERC20 indexed quoteAsset); event QuoteAssetRemoved(IERC20 indexed quoteAsset); function MAX_FEE() external pure returns (uint256); function MIN_BIN_STEP() external pure returns (uint256); function MAX_BIN_STEP() external pure returns (uint256); function MAX_PROTOCOL_SHARE() external pure returns (uint256); function LBPairImplementation() external view returns (address); function getNumberOfQuoteAssets() external view returns (uint256); function getQuoteAsset(uint256 index) external view returns (IERC20); function isQuoteAsset(IERC20 token) external view returns (bool); function feeRecipient() external view returns (address); function flashLoanFee() external view returns (uint256); function creationUnlocked() external view returns (bool); function allLBPairs(uint256 id) external returns (ILBLegacyPair); function getNumberOfLBPairs() external view returns (uint256); function getLBPairInformation(IERC20 tokenX, IERC20 tokenY, uint256 binStep) external view returns (LBPairInformation memory); function getPreset(uint16 binStep) external view returns ( uint256 baseFactor, uint256 filterPeriod, uint256 decayPeriod, uint256 reductionFactor, uint256 variableFeeControl, uint256 protocolShare, uint256 maxAccumulator, uint256 sampleLifetime ); function getAllBinSteps() external view returns (uint256[] memory presetsBinStep); function getAllLBPairs(IERC20 tokenX, IERC20 tokenY) external view returns (LBPairInformation[] memory LBPairsBinStep); function setLBPairImplementation(address LBPairImplementation) external; function createLBPair(IERC20 tokenX, IERC20 tokenY, uint24 activeId, uint16 binStep) external returns (ILBLegacyPair pair); function setLBPairIgnored(IERC20 tokenX, IERC20 tokenY, uint256 binStep, bool ignored) external; function setPreset( uint16 binStep, uint16 baseFactor, uint16 filterPeriod, uint16 decayPeriod, uint16 reductionFactor, uint24 variableFeeControl, uint16 protocolShare, uint24 maxVolatilityAccumulator, uint16 sampleLifetime ) external; function removePreset(uint16 binStep) external; function setFeesParametersOnPair( IERC20 tokenX, IERC20 tokenY, uint16 binStep, uint16 baseFactor, uint16 filterPeriod, uint16 decayPeriod, uint16 reductionFactor, uint24 variableFeeControl, uint16 protocolShare, uint24 maxVolatilityAccumulator ) external; function setFeeRecipient(address feeRecipient) external; function setFlashLoanFee(uint256 flashLoanFee) external; function setFactoryLockedState(bool locked) external; function addQuoteAsset(IERC20 quoteAsset) external; function removeQuoteAsset(IERC20 quoteAsset) external; function forceDecay(ILBLegacyPair LBPair) external;}
File 11 of 26: ILBLegacyPair.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {IERC20} from "./IERC20.sol";import {ILBLegacyToken} from "./ILBLegacyToken.sol";/// @title Liquidity Book Pair V2 Interface/// @author Trader Joe/// @notice Required interface of LBPair contractinterface ILBLegacyPair is ILBLegacyToken { /// @dev Structure to store the protocol fees: /// - binStep: The bin step /// - baseFactor: The base factor /// - filterPeriod: The filter period, where the fees stays constant /// - decayPeriod: The decay period, where the fees are halved /// - reductionFactor: The reduction factor, used to calculate the reduction of the accumulator /// - variableFeeControl: The variable fee control, used to control the variable fee, can be 0 to disable them /// - protocolShare: The share of fees sent to protocol /// - maxVolatilityAccumulated: The max value of volatility accumulated /// - volatilityAccumulated: The value of volatility accumulated /// - volatilityReference: The value of volatility reference /// - indexRef: The index reference /// - time: The last time the accumulator was called struct FeeParameters { // 144 lowest bits in slot uint16 binStep; uint16 baseFactor; uint16 filterPeriod; uint16 decayPeriod; uint16 reductionFactor; uint24 variableFeeControl; uint16 protocolShare; uint24 maxVolatilityAccumulated; // 112 highest bits in slot uint24 volatilityAccumulated; uint24 volatilityReference; uint24 indexRef; uint40 time; } /// @dev Structure used during swaps to distributes the fees: /// - total: The total amount of fees /// - protocol: The amount of fees reserved for protocol struct FeesDistribution { uint128 total; uint128 protocol; } /// @dev Structure to store the reserves of bins: /// - reserveX: The current reserve of tokenX of the bin /// - reserveY: The current reserve of tokenY of the bin struct Bin { uint112 reserveX; uint112 reserveY; uint256 accTokenXPerShare; uint256 accTokenYPerShare; } /// @dev Structure to store the information of the pair such as: /// slot0: /// - activeId: The current id used for swaps, this is also linked with the price /// - reserveX: The sum of amounts of tokenX across all bins /// slot1: /// - reserveY: The sum of amounts of tokenY across all bins /// - oracleSampleLifetime: The lifetime of an oracle sample /// - oracleSize: The current size of the oracle, can be increase by users /// - oracleActiveSize: The current active size of the oracle, composed only from non empty data sample /// - oracleLastTimestamp: The current last timestamp at which a sample was added to the circular buffer /// - oracleId: The current id of the oracle /// slot2: /// - feesX: The current amount of fees to distribute in tokenX (total, protocol) /// slot3: /// - feesY: The current amount of fees to distribute in tokenY (total, protocol) struct PairInformation { uint24 activeId; uint136 reserveX; uint136 reserveY; uint16 oracleSampleLifetime; uint16 oracleSize; uint16 oracleActiveSize; uint40 oracleLastTimestamp; uint16 oracleId; FeesDistribution feesX; FeesDistribution feesY; } /// @dev Structure to store the debts of users /// - debtX: The tokenX's debt /// - debtY: The tokenY's debt struct Debts { uint256 debtX; uint256 debtY; } /// @dev Structure to store fees: /// - tokenX: The amount of fees of token X /// - tokenY: The amount of fees of token Y struct Fees { uint128 tokenX; uint128 tokenY; } /// @dev Structure to minting informations: /// - amountXIn: The amount of token X sent /// - amountYIn: The amount of token Y sent /// - amountXAddedToPair: The amount of token X that have been actually added to the pair /// - amountYAddedToPair: The amount of token Y that have been actually added to the pair /// - activeFeeX: Fees X currently generated /// - activeFeeY: Fees Y currently generated /// - totalDistributionX: Total distribution of token X. Should be 1e18 (100%) or 0 (0%) /// - totalDistributionY: Total distribution of token Y. Should be 1e18 (100%) or 0 (0%) /// - id: Id of the current working bin when looping on the distribution array /// - amountX: The amount of token X deposited in the current bin /// - amountY: The amount of token Y deposited in the current bin /// - distributionX: Distribution of token X for the current working bin /// - distributionY: Distribution of token Y for the current working bin struct MintInfo { uint256 amountXIn; uint256 amountYIn; uint256 amountXAddedToPair; uint256 amountYAddedToPair; uint256 activeFeeX; uint256 activeFeeY; uint256 totalDistributionX; uint256 totalDistributionY; uint256 id; uint256 amountX; uint256 amountY; uint256 distributionX; uint256 distributionY; } event Swap( address indexed sender, address indexed recipient, uint256 indexed id, bool swapForY, uint256 amountIn, uint256 amountOut, uint256 volatilityAccumulated, uint256 fees ); event FlashLoan(address indexed sender, address indexed receiver, IERC20 token, uint256 amount, uint256 fee); event CompositionFee( address indexed sender, address indexed recipient, uint256 indexed id, uint256 feesX, uint256 feesY ); event DepositedToBin( address indexed sender, address indexed recipient, uint256 indexed id, uint256 amountX, uint256 amountY ); event WithdrawnFromBin( address indexed sender, address indexed recipient, uint256 indexed id, uint256 amountX, uint256 amountY ); event FeesCollected(address indexed sender, address indexed recipient, uint256 amountX, uint256 amountY); event ProtocolFeesCollected(address indexed sender, address indexed recipient, uint256 amountX, uint256 amountY); event OracleSizeIncreased(uint256 previousSize, uint256 newSize); function tokenX() external view returns (IERC20); function tokenY() external view returns (IERC20); function factory() external view returns (address); function getReservesAndId() external view returns (uint256 reserveX, uint256 reserveY, uint256 activeId); function getGlobalFees() external view returns (uint128 feesXTotal, uint128 feesYTotal, uint128 feesXProtocol, uint128 feesYProtocol); function getOracleParameters() external view returns ( uint256 oracleSampleLifetime, uint256 oracleSize, uint256 oracleActiveSize, uint256 oracleLastTimestamp, uint256 oracleId, uint256 min, uint256 max ); function getOracleSampleFrom(uint256 timeDelta) external view returns (uint256 cumulativeId, uint256 cumulativeAccumulator, uint256 cumulativeBinCrossed); function feeParameters() external view returns (FeeParameters memory); function findFirstNonEmptyBinId(uint24 id_, bool sentTokenY) external view returns (uint24 id); function getBin(uint24 id) external view returns (uint256 reserveX, uint256 reserveY); function pendingFees(address account, uint256[] memory ids) external view returns (uint256 amountX, uint256 amountY); function swap(bool sentTokenY, address to) external returns (uint256 amountXOut, uint256 amountYOut); function flashLoan(address receiver, IERC20 token, uint256 amount, bytes calldata data) external; function mint( uint256[] calldata ids, uint256[] calldata distributionX, uint256[] calldata distributionY, address to ) external returns (uint256 amountXAddedToPair, uint256 amountYAddedToPair, uint256[] memory liquidityMinted); function burn(uint256[] calldata ids, uint256[] calldata amounts, address to) external returns (uint256 amountX, uint256 amountY); function increaseOracleLength(uint16 newSize) external; function collectFees(address account, uint256[] calldata ids) external returns (uint256 amountX, uint256 amountY); function collectProtocolFees() external returns (uint128 amountX, uint128 amountY); function setFeesParameters(bytes32 packedFeeParameters) external; function forceDecay() external; function initialize( IERC20 tokenX, IERC20 tokenY, uint24 activeId, uint16 sampleLifetime, bytes32 packedFeeParameters ) external;}
File 12 of 26: ILBLegacyRouter.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {IERC20} from "./IERC20.sol";import {ILBFactory} from "./ILBFactory.sol";import {IJoeFactory} from "./IJoeFactory.sol";import {ILBLegacyPair} from "./ILBLegacyPair.sol";import {ILBToken} from "./ILBToken.sol";import {IWNATIVE} from "./IWNATIVE.sol";/// @title Liquidity Book Router Interface/// @author Trader Joe/// @notice Required interface of LBRouter contractinterface ILBLegacyRouter { struct LiquidityParameters { IERC20 tokenX; IERC20 tokenY; uint256 binStep; uint256 amountX; uint256 amountY; uint256 amountXMin; uint256 amountYMin; uint256 activeIdDesired; uint256 idSlippage; int256[] deltaIds; uint256[] distributionX; uint256[] distributionY; address to; uint256 deadline; } function factory() external view returns (address); function wavax() external view returns (address); function oldFactory() external view returns (address); function getIdFromPrice(ILBLegacyPair LBPair, uint256 price) external view returns (uint24); function getPriceFromId(ILBLegacyPair LBPair, uint24 id) external view returns (uint256); function getSwapIn(ILBLegacyPair lbPair, uint256 amountOut, bool swapForY) external view returns (uint256 amountIn, uint256 feesIn); function getSwapOut(ILBLegacyPair lbPair, uint256 amountIn, bool swapForY) external view returns (uint256 amountOut, uint256 feesIn); function createLBPair(IERC20 tokenX, IERC20 tokenY, uint24 activeId, uint16 binStep) external returns (ILBLegacyPair pair); function addLiquidity(LiquidityParameters calldata liquidityParameters) external returns (uint256[] memory depositIds, uint256[] memory liquidityMinted); function addLiquidityAVAX(LiquidityParameters calldata liquidityParameters) external payable returns (uint256[] memory depositIds, uint256[] memory liquidityMinted); function removeLiquidity( IERC20 tokenX, IERC20 tokenY, uint16 binStep, uint256 amountXMin, uint256 amountYMin, uint256[] memory ids, uint256[] memory amounts, address to, uint256 deadline ) external returns (uint256 amountX, uint256 amountY); function removeLiquidityAVAX( IERC20 token, uint16 binStep, uint256 amountTokenMin, uint256 amountAVAXMin, uint256[] memory ids, uint256[] memory amounts, address payable to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountAVAX); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address to, uint256 deadline ) external returns (uint256 amountOut); function swapExactTokensForAVAX( uint256 amountIn, uint256 amountOutMinAVAX, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address payable to, uint256 deadline ) external returns (uint256 amountOut); function swapExactAVAXForTokens( uint256 amountOutMin, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address to, uint256 deadline ) external payable returns (uint256 amountOut); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address to, uint256 deadline ) external returns (uint256[] memory amountsIn); function swapTokensForExactAVAX( uint256 amountOut, uint256 amountInMax, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address payable to, uint256 deadline ) external returns (uint256[] memory amountsIn); function swapAVAXForExactTokens( uint256 amountOut, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address to, uint256 deadline ) external payable returns (uint256[] memory amountsIn); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address to, uint256 deadline ) external returns (uint256 amountOut); function swapExactTokensForAVAXSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMinAVAX, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address payable to, uint256 deadline ) external returns (uint256 amountOut); function swapExactAVAXForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, uint256[] memory pairBinSteps, IERC20[] memory tokenPath, address to, uint256 deadline ) external payable returns (uint256 amountOut); function sweep(IERC20 token, address to, uint256 amount) external; function sweepLBToken(ILBToken _lbToken, address _to, uint256[] calldata _ids, uint256[] calldata _amounts) external;}
File 13 of 26: ILBLegacyToken.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import "./IERC165.sol";/// @title Liquidity Book V2 Token Interface/// @author Trader Joe/// @notice Required interface of LBToken contractinterface ILBLegacyToken is IERC165 { event TransferSingle(address indexed sender, address indexed from, address indexed to, uint256 id, uint256 amount); event TransferBatch( address indexed sender, address indexed from, address indexed to, uint256[] ids, uint256[] amounts ); event ApprovalForAll(address indexed account, address indexed sender, bool approved); function name() external view returns (string memory); function symbol() external view returns (string memory); function balanceOf(address account, uint256 id) external view returns (uint256); function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory batchBalances); function totalSupply(uint256 id) external view returns (uint256); function isApprovedForAll(address owner, address spender) external view returns (bool); function setApprovalForAll(address sender, bool approved) external; function safeTransferFrom(address from, address to, uint256 id, uint256 amount) external; function safeBatchTransferFrom(address from, address to, uint256[] calldata id, uint256[] calldata amount) external;}
File 14 of 26: ILBPair.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {IERC20} from "./IERC20.sol";import {ILBFactory} from "./ILBFactory.sol";import {ILBFlashLoanCallback} from "./ILBFlashLoanCallback.sol";import {ILBToken} from "./ILBToken.sol";interface ILBPair is ILBToken { error LBPair__ZeroBorrowAmount(); error LBPair__AddressZero(); error LBPair__AlreadyInitialized(); error LBPair__EmptyMarketConfigs(); error LBPair__FlashLoanCallbackFailed(); error LBPair__FlashLoanInsufficientAmount(); error LBPair__InsufficientAmountIn(); error LBPair__InsufficientAmountOut(); error LBPair__InvalidInput(); error LBPair__InvalidStaticFeeParameters(); error LBPair__OnlyFactory(); error LBPair__OnlyProtocolFeeRecipient(); error LBPair__OutOfLiquidity(); error LBPair__TokenNotSupported(); error LBPair__ZeroAmount(uint24 id); error LBPair__ZeroAmountsOut(uint24 id); error LBPair__ZeroShares(uint24 id); error LBPair__MaxTotalFeeExceeded(); struct MintArrays { uint256[] ids; bytes32[] amounts; uint256[] liquidityMinted; } event DepositedToBins(address indexed sender, address indexed to, uint256[] ids, bytes32[] amounts); event WithdrawnFromBins(address indexed sender, address indexed to, uint256[] ids, bytes32[] amounts); event CompositionFees(address indexed sender, uint24 id, bytes32 totalFees, bytes32 protocolFees); event CollectedProtocolFees(address indexed feeRecipient, bytes32 protocolFees); event Swap( address indexed sender, address indexed to, uint24 id, bytes32 amountsIn, bytes32 amountsOut, uint24 volatilityAccumulator, bytes32 totalFees, bytes32 protocolFees ); event StaticFeeParametersSet( address indexed sender, uint16 baseFactor, uint16 filterPeriod, uint16 decayPeriod, uint16 reductionFactor, uint24 variableFeeControl, uint16 protocolShare, uint24 maxVolatilityAccumulator ); event FlashLoan( address indexed sender, ILBFlashLoanCallback indexed receiver, uint24 activeId, bytes32 amounts, bytes32 totalFees, bytes32 protocolFees ); event OracleLengthIncreased(address indexed sender, uint16 oracleLength); event ForcedDecay(address indexed sender, uint24 idReference, uint24 volatilityReference); function initialize( uint16 baseFactor, uint16 filterPeriod, uint16 decayPeriod, uint16 reductionFactor, uint24 variableFeeControl, uint16 protocolShare, uint24 maxVolatilityAccumulator, uint24 activeId ) external; function getFactory() external view returns (ILBFactory factory); function getTokenX() external view returns (IERC20 tokenX); function getTokenY() external view returns (IERC20 tokenY); function getBinStep() external view returns (uint16 binStep); function getReserves() external view returns (uint128 reserveX, uint128 reserveY); function getActiveId() external view returns (uint24 activeId); function getBin(uint24 id) external view returns (uint128 binReserveX, uint128 binReserveY); function getNextNonEmptyBin(bool swapForY, uint24 id) external view returns (uint24 nextId); function getProtocolFees() external view returns (uint128 protocolFeeX, uint128 protocolFeeY); function getStaticFeeParameters() external view returns ( uint16 baseFactor, uint16 filterPeriod, uint16 decayPeriod, uint16 reductionFactor, uint24 variableFeeControl, uint16 protocolShare, uint24 maxVolatilityAccumulator ); function getVariableFeeParameters() external view returns (uint24 volatilityAccumulator, uint24 volatilityReference, uint24 idReference, uint40 timeOfLastUpdate); function getOracleParameters() external view returns (uint8 sampleLifetime, uint16 size, uint16 activeSize, uint40 lastUpdated, uint40 firstTimestamp); function getOracleSampleAt(uint40 lookupTimestamp) external view returns (uint64 cumulativeId, uint64 cumulativeVolatility, uint64 cumulativeBinCrossed); function getPriceFromId(uint24 id) external view returns (uint256 price); function getIdFromPrice(uint256 price) external view returns (uint24 id); function getSwapIn(uint128 amountOut, bool swapForY) external view returns (uint128 amountIn, uint128 amountOutLeft, uint128 fee); function getSwapOut(uint128 amountIn, bool swapForY) external view returns (uint128 amountInLeft, uint128 amountOut, uint128 fee); function swap(bool swapForY, address to) external returns (bytes32 amountsOut); function flashLoan(ILBFlashLoanCallback receiver, bytes32 amounts, bytes calldata data) external; function mint(address to, bytes32[] calldata liquidityConfigs, address refundTo) external returns (bytes32 amountsReceived, bytes32 amountsLeft, uint256[] memory liquidityMinted); function burn(address from, address to, uint256[] calldata ids, uint256[] calldata amountsToBurn) external returns (bytes32[] memory amounts); function collectProtocolFees() external returns (bytes32 collectedProtocolFees); function increaseOracleLength(uint16 newLength) external; function setStaticFeeParameters( uint16 baseFactor, uint16 filterPeriod, uint16 decayPeriod, uint16 reductionFactor, uint24 variableFeeControl, uint16 protocolShare, uint24 maxVolatilityAccumulator ) external; function forceDecay() external;}
File 15 of 26: ILBRouter.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {IERC20} from "./IERC20.sol";import {IJoeFactory} from "./IJoeFactory.sol";import {ILBFactory} from "./ILBFactory.sol";import {ILBLegacyFactory} from "./ILBLegacyFactory.sol";import {ILBLegacyRouter} from "./ILBLegacyRouter.sol";import {ILBPair} from "./ILBPair.sol";import {ILBToken} from "./ILBToken.sol";import {IWNATIVE} from "./IWNATIVE.sol";/** * @title Liquidity Book Router Interface * @author Trader Joe * @notice Required interface of LBRouter contract */interface ILBRouter { error LBRouter__SenderIsNotWNATIVE(); error LBRouter__PairNotCreated(address tokenX, address tokenY, uint256 binStep); error LBRouter__WrongAmounts(uint256 amount, uint256 reserve); error LBRouter__SwapOverflows(uint256 id); error LBRouter__BrokenSwapSafetyCheck(); error LBRouter__NotFactoryOwner(); error LBRouter__TooMuchTokensIn(uint256 excess); error LBRouter__BinReserveOverflows(uint256 id); error LBRouter__IdOverflows(int256 id); error LBRouter__LengthsMismatch(); error LBRouter__WrongTokenOrder(); error LBRouter__IdSlippageCaught(uint256 activeIdDesired, uint256 idSlippage, uint256 activeId); error LBRouter__AmountSlippageCaught(uint256 amountXMin, uint256 amountX, uint256 amountYMin, uint256 amountY); error LBRouter__IdDesiredOverflows(uint256 idDesired, uint256 idSlippage); error LBRouter__FailedToSendNATIVE(address recipient, uint256 amount); error LBRouter__DeadlineExceeded(uint256 deadline, uint256 currentTimestamp); error LBRouter__AmountSlippageBPTooBig(uint256 amountSlippage); error LBRouter__InsufficientAmountOut(uint256 amountOutMin, uint256 amountOut); error LBRouter__MaxAmountInExceeded(uint256 amountInMax, uint256 amountIn); error LBRouter__InvalidTokenPath(address wrongToken); error LBRouter__InvalidVersion(uint256 version); error LBRouter__WrongNativeLiquidityParameters( address tokenX, address tokenY, uint256 amountX, uint256 amountY, uint256 msgValue ); /** * @dev This enum represents the version of the pair requested * - V1: Joe V1 pair * - V2: LB pair V2. Also called legacyPair * - V2_1: LB pair V2.1 (current version) */ enum Version { V1, V2, V2_1 } /** * @dev The liquidity parameters, such as: * - tokenX: The address of token X * - tokenY: The address of token Y * - binStep: The bin step of the pair * - amountX: The amount to send of token X * - amountY: The amount to send of token Y * - amountXMin: The min amount of token X added to liquidity * - amountYMin: The min amount of token Y added to liquidity * - activeIdDesired: The active id that user wants to add liquidity from * - idSlippage: The number of id that are allowed to slip * - deltaIds: The list of delta ids to add liquidity (`deltaId = activeId - desiredId`) * - distributionX: The distribution of tokenX with sum(distributionX) = 100e18 (100%) or 0 (0%) * - distributionY: The distribution of tokenY with sum(distributionY) = 100e18 (100%) or 0 (0%) * - to: The address of the recipient * - refundTo: The address of the recipient of the refunded tokens if too much tokens are sent * - deadline: The deadline of the transaction */ struct LiquidityParameters { IERC20 tokenX; IERC20 tokenY; uint256 binStep; uint256 amountX; uint256 amountY; uint256 amountXMin; uint256 amountYMin; uint256 activeIdDesired; uint256 idSlippage; int256[] deltaIds; uint256[] distributionX; uint256[] distributionY; address to; address refundTo; uint256 deadline; } /** * @dev The path parameters, such as: * - pairBinSteps: The list of bin steps of the pairs to go through * - versions: The list of versions of the pairs to go through * - tokenPath: The list of tokens in the path to go through */ struct Path { uint256[] pairBinSteps; Version[] versions; IERC20[] tokenPath; } function getFactory() external view returns (ILBFactory); function getLegacyFactory() external view returns (ILBLegacyFactory); function getV1Factory() external view returns (IJoeFactory); function getLegacyRouter() external view returns (ILBLegacyRouter); function getWNATIVE() external view returns (IWNATIVE); function getIdFromPrice(ILBPair LBPair, uint256 price) external view returns (uint24); function getPriceFromId(ILBPair LBPair, uint24 id) external view returns (uint256); function getSwapIn(ILBPair LBPair, uint128 amountOut, bool swapForY) external view returns (uint128 amountIn, uint128 amountOutLeft, uint128 fee); function getSwapOut(ILBPair LBPair, uint128 amountIn, bool swapForY) external view returns (uint128 amountInLeft, uint128 amountOut, uint128 fee); function createLBPair(IERC20 tokenX, IERC20 tokenY, uint24 activeId, uint16 binStep) external returns (ILBPair pair); function addLiquidity(LiquidityParameters calldata liquidityParameters) external returns ( uint256 amountXAdded, uint256 amountYAdded, uint256 amountXLeft, uint256 amountYLeft, uint256[] memory depositIds, uint256[] memory liquidityMinted ); function addLiquidityNATIVE(LiquidityParameters calldata liquidityParameters) external payable returns ( uint256 amountXAdded, uint256 amountYAdded, uint256 amountXLeft, uint256 amountYLeft, uint256[] memory depositIds, uint256[] memory liquidityMinted ); function removeLiquidity( IERC20 tokenX, IERC20 tokenY, uint16 binStep, uint256 amountXMin, uint256 amountYMin, uint256[] memory ids, uint256[] memory amounts, address to, uint256 deadline ) external returns (uint256 amountX, uint256 amountY); function removeLiquidityNATIVE( IERC20 token, uint16 binStep, uint256 amountTokenMin, uint256 amountNATIVEMin, uint256[] memory ids, uint256[] memory amounts, address payable to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountNATIVE); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, Path memory path, address to, uint256 deadline ) external returns (uint256 amountOut); function swapExactTokensForNATIVE( uint256 amountIn, uint256 amountOutMinNATIVE, Path memory path, address payable to, uint256 deadline ) external returns (uint256 amountOut); function swapExactNATIVEForTokens(uint256 amountOutMin, Path memory path, address to, uint256 deadline) external payable returns (uint256 amountOut); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, Path memory path, address to, uint256 deadline ) external returns (uint256[] memory amountsIn); function swapTokensForExactNATIVE( uint256 amountOut, uint256 amountInMax, Path memory path, address payable to, uint256 deadline ) external returns (uint256[] memory amountsIn); function swapNATIVEForExactTokens(uint256 amountOut, Path memory path, address to, uint256 deadline) external payable returns (uint256[] memory amountsIn); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, Path memory path, address to, uint256 deadline ) external returns (uint256 amountOut); function swapExactTokensForNATIVESupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMinNATIVE, Path memory path, address payable to, uint256 deadline ) external returns (uint256 amountOut); function swapExactNATIVEForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, Path memory path, address to, uint256 deadline ) external payable returns (uint256 amountOut); function sweep(IERC20 token, address to, uint256 amount) external; function sweepLBToken(ILBToken _lbToken, address _to, uint256[] calldata _ids, uint256[] calldata _amounts) external;}
File 16 of 26: ILBToken.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;/** * @title Liquidity Book Token Interface * @author Trader Joe * @notice Interface to interact with the LBToken. */interface ILBToken { error LBToken__AddressThisOrZero(); error LBToken__InvalidLength(); error LBToken__SelfApproval(address owner); error LBToken__SpenderNotApproved(address from, address spender); error LBToken__TransferExceedsBalance(address from, uint256 id, uint256 amount); error LBToken__BurnExceedsBalance(address from, uint256 id, uint256 amount); event TransferBatch( address indexed sender, address indexed from, address indexed to, uint256[] ids, uint256[] amounts ); event ApprovalForAll(address indexed account, address indexed sender, bool approved); function name() external view returns (string memory); function symbol() external view returns (string memory); function totalSupply(uint256 id) external view returns (uint256); function balanceOf(address account, uint256 id) external view returns (uint256); function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); function isApprovedForAll(address owner, address spender) external view returns (bool); function approveForAll(address spender, bool approved) external; function batchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts) external;}
File 17 of 26: IPendingOwnable.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;/** * @title Liquidity Book Pending Ownable Interface * @author Trader Joe * @notice Required interface of Pending Ownable contract used for LBFactory */interface IPendingOwnable { error PendingOwnable__AddressZero(); error PendingOwnable__NoPendingOwner(); error PendingOwnable__NotOwner(); error PendingOwnable__NotPendingOwner(); error PendingOwnable__PendingOwnerAlreadySet(); event PendingOwnerSet(address indexed pendingOwner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function owner() external view returns (address); function pendingOwner() external view returns (address); function setPendingOwner(address pendingOwner) external; function revokePendingOwner() external; function becomeOwner() external; function renounceOwnership() external;}
File 18 of 26: IWNATIVE.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {IERC20} from "./IERC20.sol";/** * @title WNATIVE Interface * @notice Required interface of Wrapped NATIVE contract */interface IWNATIVE is IERC20 { function deposit() external payable; function withdraw(uint256) external;}
File 20 of 26: Ownable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)pragma solidity ^0.8.0;import "./Context.sol";/** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); }}
File 21 of 26: PriceHelper.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {Uint128x128Math} from "./Uint128x128Math.sol";import {Uint256x256Math} from "./Uint256x256Math.sol";import {SafeCast} from "./SafeCast.sol";import {Constants} from "./Constants.sol";/** * @title Liquidity Book Price Helper Library * @author Trader Joe * @notice This library contains functions to calculate prices */library PriceHelper { using Uint128x128Math for uint256; using Uint256x256Math for uint256; using SafeCast for uint256; int256 private constant REAL_ID_SHIFT = 1 << 23; /** * @dev Calculates the price from the id and the bin step * @param id The id * @param binStep The bin step * @return price The price as a 128.128-binary fixed-point number */ function getPriceFromId(uint24 id, uint16 binStep) internal pure returns (uint256 price) { uint256 base = getBase(binStep); int256 exponent = getExponent(id); price = base.pow(exponent); } /** * @dev Calculates the id from the price and the bin step * @param price The price as a 128.128-binary fixed-point number * @param binStep The bin step * @return id The id */ function getIdFromPrice(uint256 price, uint16 binStep) internal pure returns (uint24 id) { uint256 base = getBase(binStep); int256 realId = price.log2() / base.log2(); unchecked { id = uint256(REAL_ID_SHIFT + realId).safe24(); } } /** * @dev Calculates the base from the bin step, which is `1 + binStep / BASIS_POINT_MAX` * @param binStep The bin step * @return base The base */ function getBase(uint16 binStep) internal pure returns (uint256) { unchecked { return Constants.SCALE + (uint256(binStep) << Constants.SCALE_OFFSET) / Constants.BASIS_POINT_MAX; } } /** * @dev Calculates the exponent from the id, which is `id - REAL_ID_SHIFT` * @param id The id * @return exponent The exponent */ function getExponent(uint24 id) internal pure returns (int256) { unchecked { return int256(uint256(id)) - REAL_ID_SHIFT; } } /** * @dev Converts a price with 18 decimals to a 128.128-binary fixed-point number * @param price The price with 18 decimals * @return price128x128 The 128.128-binary fixed-point number */ function convertDecimalPriceTo128x128(uint256 price) internal pure returns (uint256) { return price.shiftDivRoundDown(Constants.SCALE_OFFSET, Constants.PRECISION); } /** * @dev Converts a 128.128-binary fixed-point number to a price with 18 decimals * @param price128x128 The 128.128-binary fixed-point number * @return price The price with 18 decimals */ function convert128x128PriceToDecimal(uint256 price128x128) internal pure returns (uint256) { return price128x128.mulShiftRoundDown(Constants.PRECISION, Constants.SCALE_OFFSET); }}
File 22 of 26: SafeCast.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;/** * @title Liquidity Book Safe Cast Library * @author Trader Joe * @notice This library contains functions to safely cast uint256 to different uint types. */library SafeCast { error SafeCast__Exceeds248Bits(); error SafeCast__Exceeds240Bits(); error SafeCast__Exceeds232Bits(); error SafeCast__Exceeds224Bits(); error SafeCast__Exceeds216Bits(); error SafeCast__Exceeds208Bits(); error SafeCast__Exceeds200Bits(); error SafeCast__Exceeds192Bits(); error SafeCast__Exceeds184Bits(); error SafeCast__Exceeds176Bits(); error SafeCast__Exceeds168Bits(); error SafeCast__Exceeds160Bits(); error SafeCast__Exceeds152Bits(); error SafeCast__Exceeds144Bits(); error SafeCast__Exceeds136Bits(); error SafeCast__Exceeds128Bits(); error SafeCast__Exceeds120Bits(); error SafeCast__Exceeds112Bits(); error SafeCast__Exceeds104Bits(); error SafeCast__Exceeds96Bits(); error SafeCast__Exceeds88Bits(); error SafeCast__Exceeds80Bits(); error SafeCast__Exceeds72Bits(); error SafeCast__Exceeds64Bits(); error SafeCast__Exceeds56Bits(); error SafeCast__Exceeds48Bits(); error SafeCast__Exceeds40Bits(); error SafeCast__Exceeds32Bits(); error SafeCast__Exceeds24Bits(); error SafeCast__Exceeds16Bits(); error SafeCast__Exceeds8Bits(); /** * @dev Returns x on uint248 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint248 */ function safe248(uint256 x) internal pure returns (uint248 y) { if ((y = uint248(x)) != x) revert SafeCast__Exceeds248Bits(); } /** * @dev Returns x on uint240 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint240 */ function safe240(uint256 x) internal pure returns (uint240 y) { if ((y = uint240(x)) != x) revert SafeCast__Exceeds240Bits(); } /** * @dev Returns x on uint232 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint232 */ function safe232(uint256 x) internal pure returns (uint232 y) { if ((y = uint232(x)) != x) revert SafeCast__Exceeds232Bits(); } /** * @dev Returns x on uint224 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint224 */ function safe224(uint256 x) internal pure returns (uint224 y) { if ((y = uint224(x)) != x) revert SafeCast__Exceeds224Bits(); } /** * @dev Returns x on uint216 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint216 */ function safe216(uint256 x) internal pure returns (uint216 y) { if ((y = uint216(x)) != x) revert SafeCast__Exceeds216Bits(); } /** * @dev Returns x on uint208 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint208 */ function safe208(uint256 x) internal pure returns (uint208 y) { if ((y = uint208(x)) != x) revert SafeCast__Exceeds208Bits(); } /** * @dev Returns x on uint200 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint200 */ function safe200(uint256 x) internal pure returns (uint200 y) { if ((y = uint200(x)) != x) revert SafeCast__Exceeds200Bits(); } /** * @dev Returns x on uint192 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint192 */ function safe192(uint256 x) internal pure returns (uint192 y) { if ((y = uint192(x)) != x) revert SafeCast__Exceeds192Bits(); } /** * @dev Returns x on uint184 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint184 */ function safe184(uint256 x) internal pure returns (uint184 y) { if ((y = uint184(x)) != x) revert SafeCast__Exceeds184Bits(); } /** * @dev Returns x on uint176 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint176 */ function safe176(uint256 x) internal pure returns (uint176 y) { if ((y = uint176(x)) != x) revert SafeCast__Exceeds176Bits(); } /** * @dev Returns x on uint168 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint168 */ function safe168(uint256 x) internal pure returns (uint168 y) { if ((y = uint168(x)) != x) revert SafeCast__Exceeds168Bits(); } /** * @dev Returns x on uint160 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint160 */ function safe160(uint256 x) internal pure returns (uint160 y) { if ((y = uint160(x)) != x) revert SafeCast__Exceeds160Bits(); } /** * @dev Returns x on uint152 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint152 */ function safe152(uint256 x) internal pure returns (uint152 y) { if ((y = uint152(x)) != x) revert SafeCast__Exceeds152Bits(); } /** * @dev Returns x on uint144 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint144 */ function safe144(uint256 x) internal pure returns (uint144 y) { if ((y = uint144(x)) != x) revert SafeCast__Exceeds144Bits(); } /** * @dev Returns x on uint136 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint136 */ function safe136(uint256 x) internal pure returns (uint136 y) { if ((y = uint136(x)) != x) revert SafeCast__Exceeds136Bits(); } /** * @dev Returns x on uint128 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint128 */ function safe128(uint256 x) internal pure returns (uint128 y) { if ((y = uint128(x)) != x) revert SafeCast__Exceeds128Bits(); } /** * @dev Returns x on uint120 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint120 */ function safe120(uint256 x) internal pure returns (uint120 y) { if ((y = uint120(x)) != x) revert SafeCast__Exceeds120Bits(); } /** * @dev Returns x on uint112 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint112 */ function safe112(uint256 x) internal pure returns (uint112 y) { if ((y = uint112(x)) != x) revert SafeCast__Exceeds112Bits(); } /** * @dev Returns x on uint104 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint104 */ function safe104(uint256 x) internal pure returns (uint104 y) { if ((y = uint104(x)) != x) revert SafeCast__Exceeds104Bits(); } /** * @dev Returns x on uint96 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint96 */ function safe96(uint256 x) internal pure returns (uint96 y) { if ((y = uint96(x)) != x) revert SafeCast__Exceeds96Bits(); } /** * @dev Returns x on uint88 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint88 */ function safe88(uint256 x) internal pure returns (uint88 y) { if ((y = uint88(x)) != x) revert SafeCast__Exceeds88Bits(); } /** * @dev Returns x on uint80 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint80 */ function safe80(uint256 x) internal pure returns (uint80 y) { if ((y = uint80(x)) != x) revert SafeCast__Exceeds80Bits(); } /** * @dev Returns x on uint72 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint72 */ function safe72(uint256 x) internal pure returns (uint72 y) { if ((y = uint72(x)) != x) revert SafeCast__Exceeds72Bits(); } /** * @dev Returns x on uint64 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint64 */ function safe64(uint256 x) internal pure returns (uint64 y) { if ((y = uint64(x)) != x) revert SafeCast__Exceeds64Bits(); } /** * @dev Returns x on uint56 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint56 */ function safe56(uint256 x) internal pure returns (uint56 y) { if ((y = uint56(x)) != x) revert SafeCast__Exceeds56Bits(); } /** * @dev Returns x on uint48 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint48 */ function safe48(uint256 x) internal pure returns (uint48 y) { if ((y = uint48(x)) != x) revert SafeCast__Exceeds48Bits(); } /** * @dev Returns x on uint40 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint40 */ function safe40(uint256 x) internal pure returns (uint40 y) { if ((y = uint40(x)) != x) revert SafeCast__Exceeds40Bits(); } /** * @dev Returns x on uint32 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint32 */ function safe32(uint256 x) internal pure returns (uint32 y) { if ((y = uint32(x)) != x) revert SafeCast__Exceeds32Bits(); } /** * @dev Returns x on uint24 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint24 */ function safe24(uint256 x) internal pure returns (uint24 y) { if ((y = uint24(x)) != x) revert SafeCast__Exceeds24Bits(); } /** * @dev Returns x on uint16 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint16 */ function safe16(uint256 x) internal pure returns (uint16 y) { if ((y = uint16(x)) != x) revert SafeCast__Exceeds16Bits(); } /** * @dev Returns x on uint8 and check that it does not overflow * @param x The value as an uint256 * @return y The value as an uint8 */ function safe8(uint256 x) internal pure returns (uint8 y) { if ((y = uint8(x)) != x) revert SafeCast__Exceeds8Bits(); }}
File 23 of 26: SafeMath.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)pragma solidity ^0.8.0;// CAUTION// This version of SafeMath should only be used with Solidity 0.8 or later,// because it relies on the compiler's built in overflow checks./** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } }}
File 24 of 26: SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-onlypragma solidity >=0.8.0;import {ERC20} from "./ERC20.sol";/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values./// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer./// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom(ERC20 token, address from, address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument. mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) ) } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer(ERC20 token, address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "TRANSFER_FAILED"); } function safeApprove(ERC20 token, address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "APPROVE_FAILED"); }}
File 25 of 26: Uint128x128Math.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;import {Constants} from "./Constants.sol";import {BitMath} from "./BitMath.sol";/** * @title Liquidity Book Uint128x128 Math Library * @author Trader Joe * @notice Helper contract used for power and log calculations */library Uint128x128Math { using BitMath for uint256; error Uint128x128Math__LogUnderflow(); error Uint128x128Math__PowUnderflow(uint256 x, int256 y); uint256 constant LOG_SCALE_OFFSET = 127; uint256 constant LOG_SCALE = 1 << LOG_SCALE_OFFSET; uint256 constant LOG_SCALE_SQUARED = LOG_SCALE * LOG_SCALE; /** * @notice Calculates the binary logarithm of x. * @dev Based on the iterative approximation algorithm. * https://en.wikipedia.org/wiki/Binary_logarithm#Iterative_approximation * Requirements: * - x must be greater than zero. * Caveats: * - The results are not perfectly accurate to the last decimal, due to the lossy precision of the iterative approximation * Also because x is converted to an unsigned 129.127-binary fixed-point number during the operation to optimize the multiplication * @param x The unsigned 128.128-binary fixed-point number for which to calculate the binary logarithm. * @return result The binary logarithm as a signed 128.128-binary fixed-point number. */ function log2(uint256 x) internal pure returns (int256 result) { // Convert x to a unsigned 129.127-binary fixed-point number to optimize the multiplication. // If we use an offset of 128 bits, y would need 129 bits and y**2 would would overflow and we would have to // use mulDiv, by reducing x to 129.127-binary fixed-point number we assert that y will use 128 bits, and we // can use the regular multiplication if (x == 1) return -128; if (x == 0) revert Uint128x128Math__LogUnderflow(); x >>= 1; unchecked { // This works because log2(x) = -log2(1/x). int256 sign; if (x >= LOG_SCALE) { sign = 1; } else { sign = -1; // Do the fixed-point inversion inline to save gas x = LOG_SCALE_SQUARED / x; } // Calculate the integer part of the logarithm and add it to the result and finally calculate y = x * 2^(-n). uint256 n = (x >> LOG_SCALE_OFFSET).mostSignificantBit(); // The integer part of the logarithm as a signed 129.127-binary fixed-point number. The operation can't overflow // because n is maximum 255, LOG_SCALE_OFFSET is 127 bits and sign is either 1 or -1. result = int256(n) << LOG_SCALE_OFFSET; // This is y = x * 2^(-n). uint256 y = x >> n; // If y = 1, the fractional part is zero. if (y != LOG_SCALE) { // Calculate the fractional part via the iterative approximation. // The "delta >>= 1" part is equivalent to "delta /= 2", but shifting bits is faster. for (int256 delta = int256(1 << (LOG_SCALE_OFFSET - 1)); delta > 0; delta >>= 1) { y = (y * y) >> LOG_SCALE_OFFSET; // Is y^2 > 2 and so in the range [2,4)? if (y >= 1 << (LOG_SCALE_OFFSET + 1)) { // Add the 2^(-m) factor to the logarithm. result += delta; // Corresponds to z/2 on Wikipedia. y >>= 1; } } } // Convert x back to unsigned 128.128-binary fixed-point number result = (result * sign) << 1; } } /** * @notice Returns the value of x^y. It calculates `1 / x^abs(y)` if x is bigger than 2^128. * At the end of the operations, we invert the result if needed. * @param x The unsigned 128.128-binary fixed-point number for which to calculate the power * @param y A relative number without any decimals, needs to be between ]2^21; 2^21[ */ function pow(uint256 x, int256 y) internal pure returns (uint256 result) { bool invert; uint256 absY; if (y == 0) return Constants.SCALE; assembly { absY := y if slt(absY, 0) { absY := sub(0, absY) invert := iszero(invert) } } if (absY < 0x100000) { result = Constants.SCALE; assembly { let squared := x if gt(x, 0xffffffffffffffffffffffffffffffff) { squared := div(not(0), squared) invert := iszero(invert) } if and(absY, 0x1) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x2) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x4) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x8) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x10) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x20) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x40) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x80) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x100) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x200) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x400) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x800) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x1000) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x2000) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x4000) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x8000) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x10000) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x20000) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x40000) { result := shr(128, mul(result, squared)) } squared := shr(128, mul(squared, squared)) if and(absY, 0x80000) { result := shr(128, mul(result, squared)) } } } // revert if y is too big or if x^y underflowed if (result == 0) revert Uint128x128Math__PowUnderflow(x, y); return invert ? type(uint256).max / result : result; }}
File 26 of 26: Uint256x256Math.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.10;/** * @title Liquidity Book Uint256x256 Math Library * @author Trader Joe * @notice Helper contract used for full precision calculations */library Uint256x256Math { error Uint256x256Math__MulShiftOverflow(); error Uint256x256Math__MulDivOverflow(); /** * @notice Calculates floor(x*y/denominator) with full precision * The result will be rounded down * @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv * Requirements: * - The denominator cannot be zero * - The result must fit within uint256 * Caveats: * - This function does not work with fixed-point numbers * @param x The multiplicand as an uint256 * @param y The multiplier as an uint256 * @param denominator The divisor as an uint256 * @return result The result as an uint256 */ function mulDivRoundDown(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { (uint256 prod0, uint256 prod1) = _getMulProds(x, y); return _getEndOfDivRoundDown(x, y, denominator, prod0, prod1); } /** * @notice Calculates ceil(x*y/denominator) with full precision * The result will be rounded up * @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv * Requirements: * - The denominator cannot be zero * - The result must fit within uint256 * Caveats: * - This function does not work with fixed-point numbers * @param x The multiplicand as an uint256 * @param y The multiplier as an uint256 * @param denominator The divisor as an uint256 * @return result The result as an uint256 */ function mulDivRoundUp(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { result = mulDivRoundDown(x, y, denominator); if (mulmod(x, y, denominator) != 0) result += 1; } /** * @notice Calculates floor(x * y / 2**offset) with full precision * The result will be rounded down * @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv * Requirements: * - The offset needs to be strictly lower than 256 * - The result must fit within uint256 * Caveats: * - This function does not work with fixed-point numbers * @param x The multiplicand as an uint256 * @param y The multiplier as an uint256 * @param offset The offset as an uint256, can't be greater than 256 * @return result The result as an uint256 */ function mulShiftRoundDown(uint256 x, uint256 y, uint8 offset) internal pure returns (uint256 result) { (uint256 prod0, uint256 prod1) = _getMulProds(x, y); if (prod0 != 0) result = prod0 >> offset; if (prod1 != 0) { // Make sure the result is less than 2^256. if (prod1 >= 1 << offset) { revert Uint256x256Math__MulShiftOverflow(); } unchecked { result += prod1 << (256 - offset); } } } /** * @notice Calculates floor(x * y / 2**offset) with full precision * The result will be rounded down * @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv * Requirements: * - The offset needs to be strictly lower than 256 * - The result must fit within uint256 * Caveats: * - This function does not work with fixed-point numbers * @param x The multiplicand as an uint256 * @param y The multiplier as an uint256 * @param offset The offset as an uint256, can't be greater than 256 * @return result The result as an uint256 */ function mulShiftRoundUp(uint256 x, uint256 y, uint8 offset) internal pure returns (uint256 result) { result = mulShiftRoundDown(x, y, offset); if (mulmod(x, y, 1 << offset) != 0) result += 1; } /** * @notice Calculates floor(x << offset / y) with full precision * The result will be rounded down * @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv * Requirements: * - The offset needs to be strictly lower than 256 * - The result must fit within uint256 * Caveats: * - This function does not work with fixed-point numbers * @param x The multiplicand as an uint256 * @param offset The number of bit to shift x as an uint256 * @param denominator The divisor as an uint256 * @return result The result as an uint256 */ function shiftDivRoundDown(uint256 x, uint8 offset, uint256 denominator) internal pure returns (uint256 result) { uint256 prod0; uint256 prod1; prod0 = x << offset; // Least significant 256 bits of the product unchecked { prod1 = x >> (256 - offset); // Most significant 256 bits of the product } return _getEndOfDivRoundDown(x, 1 << offset, denominator, prod0, prod1); } /** * @notice Calculates ceil(x << offset / y) with full precision * The result will be rounded up * @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv * Requirements: * - The offset needs to be strictly lower than 256 * - The result must fit within uint256 * Caveats: * - This function does not work with fixed-point numbers * @param x The multiplicand as an uint256 * @param offset The number of bit to shift x as an uint256 * @param denominator The divisor as an uint256 * @return result The result as an uint256 */ function shiftDivRoundUp(uint256 x, uint8 offset, uint256 denominator) internal pure returns (uint256 result) { result = shiftDivRoundDown(x, offset, denominator); if (mulmod(x, 1 << offset, denominator) != 0) result += 1; } /** * @notice Helper function to return the result of `x * y` as 2 uint256 * @param x The multiplicand as an uint256 * @param y The multiplier as an uint256 * @return prod0 The least significant 256 bits of the product * @return prod1 The most significant 256 bits of the product */ function _getMulProds(uint256 x, uint256 y) private pure returns (uint256 prod0, uint256 prod1) { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } } /** * @notice Helper function to return the result of `x * y / denominator` with full precision * @param x The multiplicand as an uint256 * @param y The multiplier as an uint256 * @param denominator The divisor as an uint256 * @param prod0 The least significant 256 bits of the product * @param prod1 The most significant 256 bits of the product * @return result The result as an uint256 */ function _getEndOfDivRoundDown(uint256 x, uint256 y, uint256 denominator, uint256 prod0, uint256 prod1) private pure returns (uint256 result) { // Handle non-overflow cases, 256 by 256 division if (prod1 == 0) { unchecked { result = prod0 / denominator; } } else { // Make sure the result is less than 2^256. Also prevents denominator == 0 if (prod1 >= denominator) revert Uint256x256Math__MulDivOverflow(); // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1 // See https://cs.stackexchange.com/q/138556/92363 unchecked { // Does not overflow because the denominator cannot be zero at this stage in the function uint256 lpotdod = denominator & (~denominator + 1); assembly { // Divide denominator by lpotdod. denominator := div(denominator, lpotdod) // Divide [prod1 prod0] by lpotdod. prod0 := div(prod0, lpotdod) // Flip lpotdod such that it is 2^256 / lpotdod. If lpotdod is zero, then it becomes one lpotdod := add(div(sub(0, lpotdod), lpotdod), 1) } // Shift in bits from prod1 into prod0 prod0 |= prod1 * lpotdod; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4 uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; } } }}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
JSON Format RAW/Text Format
[{"inputs":[{"internalType":"contract ILBRouter","name":"joeRouter_","type":"address"},{"internalType":"address","name":"native_","type":"address"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"_xPerBin","type":"uint256"},{"internalType":"address","name":"devWallet_","type":"address"},{"internalType":"address","name":"founderWallet_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Uint256x256Math__MulDivOverflow","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"binStep","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"pct","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"rebalances","type":"bool"},{"internalType":"bool","name":"fees","type":"bool"}],"name":"disableRebalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"floorLiquidityBin","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveBinId","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalETH","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"}],"name":"getAverageTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getFloorPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair_","type":"address"},{"internalType":"int256[]","name":"deltaIds","type":"int256[]"},{"internalType":"uint256[]","name":"distributionX","type":"uint256[]"},{"internalType":"uint256[]","name":"distributionY","type":"uint256[]"},{"internalType":"address","name":"_vault","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"joeRouter","outputs":[{"internalType":"contract ILBRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRecordedActiveBin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBin","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract ILBPair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"punishFloorSellers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebalanceLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebalancesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seedLiquidityTimes","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newVault","type":"address"}],"name":"setNewVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSlippageTolerance","type":"uint256"}],"name":"setSlippageToleranceMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippageToleranceMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBin","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tightLiqBin","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xPerBin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
Decompile ByteCode Switch to Opcodes View
6101006040526063600f5560646011553480156200001c57600080fd5b50604051620067433803806200674383398181016040528101906200004291906200099d565b6040518060400160405280600681526020017f4c414444455200000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4c4144444552000000000000000000000000000000000000000000000000000081525060128260009080519060200190620000c892919062000803565b508160019080519060200190620000e192919062000803565b508060ff1660808160ff16815250504660a0818152505062000108620006a560201b60201c565b60c0818152505050505062000132620001266200073560201b60201c565b6200073d60201b60201c565b60007368b3465833fb72a70ecdf485e0e4c7bd8665fc4590506000731b02da8cb0d097eb8d57a175b88c7d8b479975069050600073d9988b4b5bbc53a794240496cfa9bf5b1f8e05239050600073ba12222222228d8ba445958a75a0704d566bf2c89050600073c873fecbd354f5a56e00e710b90ef4201db2448d9050600073dd94018f54e565dbfc939f7c44a16e163faab33190506000734c2af2df2a7e567b5155879720619ea06c5bb15d9050600073ae4ec9901c3076d0ddbe76a520f9e90a6227acb790506000737bfd7192e76d950832c77bb412aae841049d8d9b90506001601560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508e600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508d73ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250508a600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670de0b6b3a76400008d62000638919062000a68565b6013819055506001600b60146101000a81548160ff0219169083151502179055506001600b60156101000a81548160ff021916908315150217905550670de0b6b3a76400008c6200068a919062000a68565b600e8190555050505050505050505050505050505062000c8c565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620006d9919062000bd9565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200071a95949392919062000c2f565b60405160208183030381529060405280519060200120905090565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620008119062000af8565b90600052602060002090601f01602090048101928262000835576000855562000881565b82601f106200085057805160ff191683800117855562000881565b8280016001018555821562000881579182015b828111156200088057825182559160200191906001019062000863565b5b50905062000890919062000894565b5090565b5b80821115620008af57600081600090555060010162000895565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008e582620008b8565b9050919050565b6000620008f982620008d8565b9050919050565b6200090b81620008ec565b81146200091757600080fd5b50565b6000815190506200092b8162000900565b92915050565b6200093c81620008d8565b81146200094857600080fd5b50565b6000815190506200095c8162000931565b92915050565b6000819050919050565b620009778162000962565b81146200098357600080fd5b50565b60008151905062000997816200096c565b92915050565b60008060008060008060c08789031215620009bd57620009bc620008b3565b5b6000620009cd89828a016200091a565b9650506020620009e089828a016200094b565b9550506040620009f389828a0162000986565b945050606062000a0689828a0162000986565b935050608062000a1989828a016200094b565b92505060a062000a2c89828a016200094b565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000a758262000962565b915062000a828362000962565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000abe5762000abd62000a39565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b1157607f821691505b6020821081141562000b285762000b2762000ac9565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815462000b5d8162000af8565b62000b69818662000b2e565b9450600182166000811462000b87576001811462000b995762000bd0565b60ff1983168652818601935062000bd0565b62000ba48562000b39565b60005b8381101562000bc85781548189015260018201915060208101905062000ba7565b838801955050505b50505092915050565b600062000be7828462000b4e565b915081905092915050565b6000819050919050565b62000c078162000bf2565b82525050565b62000c188162000962565b82525050565b62000c2981620008d8565b82525050565b600060a08201905062000c46600083018862000bfc565b62000c55602083018762000bfc565b62000c64604083018662000bfc565b62000c73606083018562000c0d565b62000c82608083018462000c1e565b9695505050505050565b60805160a05160c05160e051615a6162000ce26000396000818161162101528181611d0501528181611fa7015281816137f901526138fc0152600061116401526000611130015260006110a00152615a616000f3fe60806040526004361061028c5760003560e01c80639ed975f71161015a578063d505accf116100c1578063f2fde38b1161007a578063f2fde38b14610990578063f4a0f916146109b9578063f9f92be4146109e4578063fbfa77cf14610a21578063fd8c4af014610a4c578063ff94e67414610a7757610293565b8063d505accf14610891578063d5abeb01146108ba578063dd62ed3e146108e5578063e7b77f7014610922578063eff260b31461094b578063f117f0031461097457610293565b8063b3f0067411610113578063b3f00674146107a3578063b99ef9a3146107ce578063bacbbfd4146107f9578063bc1fdc8c14610824578063c5bf38321461084f578063c9567bf91461087a57610293565b80639ed975f7146106a5578063a0cf0aea146106ce578063a64e4f8a146106f9578063a8aa1b3114610724578063a9059cbb1461074f578063b05dba961461078c57610293565b80635948a60f116101fe5780637ddbda4b116101b75780637ddbda4b146105935780637ecebe00146105be5780637f4aeb1a146105fb578063810fa0d3146106125780638da5cb5b1461064f57806395d89b411461067a57610293565b80635948a60f146104a757806359f571e8146104d25780635bd87291146104fd57806370a0823114610514578063715018a6146105515780637be8021a1461056857610293565b806323b872dd1161025057806323b872dd146103815780632a33d6b2146103be578063313ce567146103e957806334e73122146104145780633644e515146104515780634ada218b1461047c57610293565b806306fdde0314610298578063095ea7b3146102c357806318160ddd1461030057806321a21fe11461032b578063222c97771461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610aa2565b6040516102ba9190613d1c565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190613de6565b610b30565b6040516102f79190613e41565b60405180910390f35b34801561030c57600080fd5b50610315610c22565b6040516103229190613e6b565b60405180910390f35b34801561033757600080fd5b50610340610c28565b60405161034d9190613e6b565b60405180910390f35b34801561036257600080fd5b5061036b610c2e565b6040516103789190613e6b565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190613e86565b610c34565b6040516103b59190613e41565b60405180910390f35b3480156103ca57600080fd5b506103d3610fc6565b6040516103e09190613e6b565b60405180910390f35b3480156103f557600080fd5b506103fe61109e565b60405161040b9190613ef5565b60405180910390f35b34801561042057600080fd5b5061043b60048036038101906104369190613f10565b6110c2565b6040516104489190613e6b565b60405180910390f35b34801561045d57600080fd5b5061046661112c565b6040516104739190613f69565b60405180910390f35b34801561048857600080fd5b50610491611189565b60405161049e9190613e41565b60405180910390f35b3480156104b357600080fd5b506104bc61119c565b6040516104c99190613e41565b60405180910390f35b3480156104de57600080fd5b506104e76111af565b6040516104f49190613fe3565b60405180910390f35b34801561050957600080fd5b506105126111d5565b005b34801561052057600080fd5b5061053b60048036038101906105369190613ffe565b6114dd565b6040516105489190613e6b565b60405180910390f35b34801561055d57600080fd5b506105666114f5565b005b34801561057457600080fd5b5061057d611509565b60405161058a9190614049565b60405180910390f35b34801561059f57600080fd5b506105a861151e565b6040516105b59190613e6b565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e09190613ffe565b611524565b6040516105f29190613e6b565b60405180910390f35b34801561060757600080fd5b5061061061153c565b005b34801561061e57600080fd5b5061063960048036038101906106349190613f10565b611b7e565b6040516106469190613e6b565b60405180910390f35b34801561065b57600080fd5b50610664611be9565b6040516106719190614073565b60405180910390f35b34801561068657600080fd5b5061068f611c13565b60405161069c9190613d1c565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c7919061408e565b611ca1565b005b3480156106da57600080fd5b506106e3611d03565b6040516106f09190614073565b60405180910390f35b34801561070557600080fd5b5061070e611d27565b60405161071b9190613e41565b60405180910390f35b34801561073057600080fd5b50610739611d3a565b60405161074691906140dc565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190613de6565b611d60565b6040516107839190613e41565b60405180910390f35b34801561079857600080fd5b506107a1611eda565b005b3480156107af57600080fd5b506107b86121ec565b6040516107c59190614073565b60405180910390f35b3480156107da57600080fd5b506107e36121fb565b6040516107f09190614049565b60405180910390f35b34801561080557600080fd5b5061080e612210565b60405161081b9190614049565b60405180910390f35b34801561083057600080fd5b50610839612225565b6040516108469190614049565b60405180910390f35b34801561085b57600080fd5b5061086461223a565b6040516108719190614114565b60405180910390f35b34801561088657600080fd5b5061088f61224e565b005b34801561089d57600080fd5b506108b860048036038101906108b39190614187565b612273565b005b3480156108c657600080fd5b506108cf61256c565b6040516108dc9190613e6b565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190614229565b612572565b6040516109199190613e6b565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613ffe565b612597565b005b34801561095757600080fd5b50610972600480360381019061096d9190614295565b6125e3565b005b61098e60048036038101906109899190614516565b612623565b005b34801561099c57600080fd5b506109b760048036038101906109b29190613ffe565b6128f7565b005b3480156109c557600080fd5b506109ce61297b565b6040516109db9190614049565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a069190613ffe565b612990565b604051610a189190613e41565b60405180910390f35b348015610a2d57600080fd5b50610a366129b0565b604051610a439190614073565b60405180910390f35b348015610a5857600080fd5b50610a616129d6565b604051610a6e9190613e6b565b60405180910390f35b348015610a8357600080fd5b50610a8c6129dc565b604051610a999190614049565b60405180910390f35b60008054610aaf90614614565b80601f0160208091040260200160405190810160405280929190818152602001828054610adb90614614565b8015610b285780601f10610afd57610100808354040283529160200191610b28565b820191906000526020600020905b815481529060010190602001808311610b0b57829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c109190613e6b565b60405180910390a36001905092915050565b60025481565b600f5481565b60115481565b6000801515601460009054906101000a900460ff1615151415610c8a573073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610c8957600080fd5b5b601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015610d2e5750601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490614692565b60405180910390fd5b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ea2578281610e2191906146e1565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ef191906146e1565b925050819055506000610f05338686612a74565b905080600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fb19190613e6b565b60405180910390a36001925050509392505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e380f2600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900462ffffff166040518363ffffffff1660e01b8152600401611058929190614715565b602060405180830381865afa158015611075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110999190614753565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806110f46103e86110e685670de0b6b3a764000061309190919063ffffffff16565b6130a790919063ffffffff16565b9050611123670de0b6b3a7640000611115838761309190919063ffffffff16565b6130a790919063ffffffff16565b91505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000046146111625761115d6130bd565b611184565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b601460009054906101000a900460ff1681565b600b60149054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900462ffffff1662ffffff166111f46129dc565b62ffffff1614611239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611230906147cc565b60405180910390fd5b6000600167ffffffffffffffff811115611256576112556142da565b5b6040519080825280602002602001820160405280156112845781602001602082028036833780820191505090505b5090506000600167ffffffffffffffff8111156112a4576112a36142da565b5b6040519080825280602002602001820160405280156112d25781602001602082028036833780820191505090505b509050601060039054906101000a900462ffffff1662ffffff1681600081518110611300576112ff6147ec565b5b6020026020010181815250506001600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e30601060039054906101000a900462ffffff166040518363ffffffff1660e01b815260040161137b92919061484c565b602060405180830381865afa158015611398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bc9190614753565b6113c691906146e1565b826000815181106113da576113d96147ec565b5b602002602001018181525050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9939f5e303084866040518563ffffffff1660e01b81526004016114479493929190614933565b6000604051808303816000875af1158015611466573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061148f9190614a5e565b506114d930600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613149565b5050565b60036020528060005260406000206000915090505481565b6114fd613219565b6115076000613297565b565b601260009054906101000a900462ffffff1681565b600e5481565b60056020528060005260406000206000915090505481565b6000600b60179054906101000a900461ffff1661ffff16148061158057506115626129dc565b62ffffff16601060009054906101000a900462ffffff1662ffffff16145b156115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b790614af3565b60405180910390fd5b6013600c546115cd6129dc565b62ffffff166115dc91906146e1565b1180156115f55750600b60149054906101000a900460ff165b15611b41576001600b60166101000a81548160ff02191690831515021790555061161d61335d565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116789190614073565b602060405180830381865afa158015611695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b99190614753565b90506000600e5460016116ca6129dc565b6116d49190614b13565b600d60009054906101000a900462ffffff166116f09190614b4c565b62ffffff166116ff9190614b80565b905060006003600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826117509190614bda565b60025461175d91906146e1565b9050600061176b8483611b7e565b90506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f96fe925600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166117d98561378a565b6040518363ffffffff1660e01b81526004016117f6929190614c30565b602060405180830381865afa158015611813573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118379190614c85565b90506118416129dc565b62ffffff168162ffffff1611611857578061186c565b60016118616129dc565b61186b9190614b4c565b5b601060006101000a81548162ffffff021916908362ffffff1602179055506000601060009054906101000a900462ffffff1660020b6118a96129dc565b60020b6118b69190614cb2565b6118bf90614d46565b905060016118cb6129dc565b6118d59190614b4c565b601060036101000a81548162ffffff021916908362ffffff1602179055506000600267ffffffffffffffff8111156119105761190f6142da565b5b60405190808252806020026020018201604052801561193e5781602001602082028036833780820191505090505b5090508181600081518110611956576119556147ec565b5b6020026020010181815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81600181518110611997576119966147ec565b5b6020026020010181815250506000600267ffffffffffffffff8111156119c0576119bf6142da565b5b6040519080825280602002602001820160405280156119ee5781602001602082028036833780820191505090505b509050600081600081518110611a0757611a066147ec565b5b602002602001018181525050600081600181518110611a2957611a286147ec565b5b6020026020010181815250506000600267ffffffffffffffff811115611a5257611a516142da565b5b604051908082528060200260200182016040528015611a805781602001602082028036833780820191505090505b50905060646050670de0b6b3a7640000611a9a9190614b80565b611aa49190614dbe565b81600081518110611ab857611ab76147ec565b5b60200260200101818152505060646014670de0b6b3a7640000611adb9190614b80565b611ae59190614dbe565b81600181518110611af957611af86147ec565b5b602002602001018181525050611b18838383611b136129dc565b6137b1565b6000600b60166101000a81548160ff021916908315150217905550505050505050505050611b7c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390614e3b565b60405180910390fd5b565b6000818310611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990614ecd565b60405180910390fd5b81670de0b6b3a764000084611bd79190614b80565b611be19190614dbe565b905092915050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60018054611c2090614614565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4c90614614565b8015611c995780601f10611c6e57610100808354040283529160200191611c99565b820191906000526020600020905b815481529060010190602001808311611c7c57829003601f168201915b505050505081565b611ca9613219565b600081118015611cba575060638111155b611cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf090614f39565b60405180910390fd5b80600f8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b60159054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000801515601460009054906101000a900460ff1615151415611db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daf90614fa5565b60405180910390fd5b81600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0791906146e1565b925050819055506000611e1b338585612a74565b905080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611ec79190613e6b565b60405180910390a3600191505092915050565b611ee2613219565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612042929190615000565b6020604051808303816000875af1158015612061573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612085919061503e565b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e584b654600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016040518363ffffffff1660e01b815260040161210692919061506b565b600060405180830381600087803b15801561212057600080fd5b505af1158015612134573d6000803e3d6000fd5b50505050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e584b654600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016040518363ffffffff1660e01b81526004016121b892919061506b565b600060405180830381600087803b1580156121d257600080fd5b505af11580156121e6573d6000803e3d6000fd5b50505050565b60006121f6611be9565b905090565b600b60199054906101000a900462ffffff1681565b601060039054906101000a900462ffffff1681565b601060009054906101000a900462ffffff1681565b600b60179054906101000a900461ffff1681565b612256613219565b6001601460006101000a81548160ff021916908315150217905550565b428410156122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad906150e0565b60405180910390fd5b600060016122c261112c565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600560008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b60405160200161234a96959493929190615100565b604051602081830303815290604052805190602001206040516020016123719291906151d9565b60405160208183030381529060405280519060200120858585604051600081526020016040526040516123a79493929190615210565b6020604051602081039080840390855afa1580156123c9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561243d57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61247c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612473906152a1565b60405180910390fd5b85600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258760405161255b9190613e6b565b60405180910390a350505050505050565b60135481565b6004602052816000526040600020602052806000526040600020600091509150505481565b61259f613219565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6125eb613219565b81600b60146101000a81548160ff02191690831515021790555080600b60156101000a81548160ff0219169083151502179055505050565b61262b613219565b600c601260009054906101000a900462ffffff1662ffffff1610612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267b9061530d565b60405180910390fd5b6000601260009054906101000a900462ffffff1662ffffff1614156128535780600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317f11ecc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b69190615359565b600b60176101000a81548161ffff021916908361ffff1602179055506127da6129dc565b600b60196101000a81548162ffffff021916908362ffffff16021790555060016128026129dc565b61280c9190614b13565b62ffffff16600c8190555061281f611eda565b6104b061282a6129dc565b6128349190614b13565b600d60006101000a81548162ffffff021916908362ffffff1602179055505b61286b30600c6013546128669190614dbe565b613a7e565b6001600b60166101000a81548160ff0219169083151502179055506128998484846128946129dc565b6137b1565b6000600b60166101000a81548160ff0219169083151502179055506001601260009054906101000a900462ffffff166128d29190614b13565b601260006101000a81548162ffffff021916908362ffffff1602179055505050505050565b6128ff613219565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561296f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612966906153f8565b60405180910390fd5b61297881613297565b50565b600d60009054906101000a900462ffffff1681565b60156020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbe65edc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190614c85565b905090565b6000819050600b60159054906101000a900460ff168015612aa25750600b60169054906101000a900460ff16155b1561308a57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612b3057503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612d70576000612b4282600f6110c2565b90506000612b5183600a6110c2565b90508160036000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc49190614bda565b92505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612c4a9190613e6b565b60405180910390a38060036000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cc39190614bda565b92505081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612d499190613e6b565b60405180910390a38183612d5d91906146e1565b92508083612d6b91906146e1565b925050505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612e1a5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15613089576000601060009054906101000a900462ffffff1662ffffff16612e406129dc565b62ffffff161415612f6b57612e57826011546110c2565b90508060036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eca9190614bda565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f509190613e6b565b60405180910390a38082612f6491906146e1565b9150613087565b612f77826011546110c2565b90508060036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fea9190614bda565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130709190613e6b565b60405180910390a3808261308491906146e1565b91505b505b5b9392505050565b6000818361309f9190614b80565b905092915050565b600081836130b59190614dbe565b905092915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516130ef91906154b7565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161312e9594939291906154ce565b60405160208183030381529060405280519060200120905090565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461319891906146e1565b9250508190555080600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161320d9190613e6b565b60405180910390a35050565b613221613b4e565b73ffffffffffffffffffffffffffffffffffffffff1661323f611be9565b73ffffffffffffffffffffffffffffffffffffffff1614613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328c9061556d565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600c5461336b6129dc565b62ffffff1661337a91906146e1565b90506000601060009054906101000a900462ffffff1662ffffff16146133ac576001816133a79190614bda565b6133ae565b805b9050600c54601060039054906101000a900462ffffff1662ffffff16101580156133fb575080600c546133e19190614bda565b601060039054906101000a900462ffffff1662ffffff1611155b15613409576001915061343c565b6000601060009054906101000a900462ffffff1662ffffff16111561343b576000915080806134379061558d565b9150505b5b60008167ffffffffffffffff811115613458576134576142da565b5b6040519080825280602002602001820160405280156134865781602001602082028036833780820191505090505b50905060008267ffffffffffffffff8111156134a5576134a46142da565b5b6040519080825280602002602001820160405280156134d35781602001602082028036833780820191505090505b50905060005b838110156135215780600c546134ef9190614bda565b828281518110613502576135016147ec565b5b60200260200101818152505080806135199061558d565b9150506134d9565b506000601060009054906101000a900462ffffff1662ffffff16146135cc57601060009054906101000a900462ffffff1662ffffff16816001835161356691906146e1565b81518110613577576135766147ec565b5b602002602001018181525050836135cb57601060039054906101000a900462ffffff1662ffffff16816002856135ad91906146e1565b815181106135be576135bd6147ec565b5b6020026020010181815250505b5b6135d46129dc565b62ffffff16600c8190555060005b838110156136d9576000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3085858151811061363d5761363c6147ec565b5b60200260200101516040518363ffffffff1660e01b81526004016136629291906155d6565b602060405180830381865afa15801561367f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a39190614753565b9050808483815181106136b9576136b86147ec565b5b6020026020010181815250505080806136d19061558d565b9150506135e2565b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9939f5e303084866040518563ffffffff1660e01b815260040161373b9493929190614933565b6000604051808303816000875af115801561375a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906137839190614a5e565b5050505050565b60006137aa6080670de0b6b3a764000084613b569092919063ffffffff16565b9050919050565b6000600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016138509190614073565b602060405180830381865afa15801561386d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138919190614753565b905060006064600f54846138a59190614b80565b6138af9190614dbe565b905060006064600f54846138c39190614b80565b6138cd9190614dbe565b9050600080604051806101e001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168152602001600b60179054906101000a900461ffff1661ffff1681526020018781526020018681526020018581526020018481526020018862ffffff1681526020018381526020018b81526020018a81526020018981526020013073ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff168152602001428152509050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a3c7271a826040518263ffffffff1660e01b8152600401613a2491906158ad565b6000604051808303816000875af1158015613a43573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190613a6c9190615966565b50505050505050505050505050505050565b8060026000828254613a909190614bda565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613b429190613e6b565b60405180910390a35050565b600033905090565b60008060008460ff1686901b91508460ff166101000361ffff1686901c9050613b89868660ff166001901b868585613b94565b925050509392505050565b600080821415613bb657838381613bae57613bad614d8f565b5b049050613c7a565b838210613bef576040517f13eae71500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848688099050838111830392508084039350600060018619018616905080860495508085049450600181826000030401905080840285179450600060028760030218905080870260020381029050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080860293505050505b95945050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cbd578082015181840152602081019050613ca2565b83811115613ccc576000848401525b50505050565b6000601f19601f8301169050919050565b6000613cee82613c83565b613cf88185613c8e565b9350613d08818560208601613c9f565b613d1181613cd2565b840191505092915050565b60006020820190508181036000830152613d368184613ce3565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d7d82613d52565b9050919050565b613d8d81613d72565b8114613d9857600080fd5b50565b600081359050613daa81613d84565b92915050565b6000819050919050565b613dc381613db0565b8114613dce57600080fd5b50565b600081359050613de081613dba565b92915050565b60008060408385031215613dfd57613dfc613d48565b5b6000613e0b85828601613d9b565b9250506020613e1c85828601613dd1565b9150509250929050565b60008115159050919050565b613e3b81613e26565b82525050565b6000602082019050613e566000830184613e32565b92915050565b613e6581613db0565b82525050565b6000602082019050613e806000830184613e5c565b92915050565b600080600060608486031215613e9f57613e9e613d48565b5b6000613ead86828701613d9b565b9350506020613ebe86828701613d9b565b9250506040613ecf86828701613dd1565b9150509250925092565b600060ff82169050919050565b613eef81613ed9565b82525050565b6000602082019050613f0a6000830184613ee6565b92915050565b60008060408385031215613f2757613f26613d48565b5b6000613f3585828601613dd1565b9250506020613f4685828601613dd1565b9150509250929050565b6000819050919050565b613f6381613f50565b82525050565b6000602082019050613f7e6000830184613f5a565b92915050565b6000819050919050565b6000613fa9613fa4613f9f84613d52565b613f84565b613d52565b9050919050565b6000613fbb82613f8e565b9050919050565b6000613fcd82613fb0565b9050919050565b613fdd81613fc2565b82525050565b6000602082019050613ff86000830184613fd4565b92915050565b60006020828403121561401457614013613d48565b5b600061402284828501613d9b565b91505092915050565b600062ffffff82169050919050565b6140438161402b565b82525050565b600060208201905061405e600083018461403a565b92915050565b61406d81613d72565b82525050565b60006020820190506140886000830184614064565b92915050565b6000602082840312156140a4576140a3613d48565b5b60006140b284828501613dd1565b91505092915050565b60006140c682613fb0565b9050919050565b6140d6816140bb565b82525050565b60006020820190506140f160008301846140cd565b92915050565b600061ffff82169050919050565b61410e816140f7565b82525050565b60006020820190506141296000830184614105565b92915050565b61413881613ed9565b811461414357600080fd5b50565b6000813590506141558161412f565b92915050565b61416481613f50565b811461416f57600080fd5b50565b6000813590506141818161415b565b92915050565b600080600080600080600060e0888a0312156141a6576141a5613d48565b5b60006141b48a828b01613d9b565b97505060206141c58a828b01613d9b565b96505060406141d68a828b01613dd1565b95505060606141e78a828b01613dd1565b94505060806141f88a828b01614146565b93505060a06142098a828b01614172565b92505060c061421a8a828b01614172565b91505092959891949750929550565b600080604083850312156142405761423f613d48565b5b600061424e85828601613d9b565b925050602061425f85828601613d9b565b9150509250929050565b61427281613e26565b811461427d57600080fd5b50565b60008135905061428f81614269565b92915050565b600080604083850312156142ac576142ab613d48565b5b60006142ba85828601614280565b92505060206142cb85828601614280565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61431282613cd2565b810181811067ffffffffffffffff82111715614331576143306142da565b5b80604052505050565b6000614344613d3e565b90506143508282614309565b919050565b600067ffffffffffffffff8211156143705761436f6142da565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61439981614386565b81146143a457600080fd5b50565b6000813590506143b681614390565b92915050565b60006143cf6143ca84614355565b61433a565b905080838252602082019050602084028301858111156143f2576143f1614381565b5b835b8181101561441b578061440788826143a7565b8452602084019350506020810190506143f4565b5050509392505050565b600082601f83011261443a576144396142d5565b5b813561444a8482602086016143bc565b91505092915050565b600067ffffffffffffffff82111561446e5761446d6142da565b5b602082029050602081019050919050565b600061449261448d84614453565b61433a565b905080838252602082019050602084028301858111156144b5576144b4614381565b5b835b818110156144de57806144ca8882613dd1565b8452602084019350506020810190506144b7565b5050509392505050565b600082601f8301126144fd576144fc6142d5565b5b813561450d84826020860161447f565b91505092915050565b600080600080600060a0868803121561453257614531613d48565b5b600061454088828901613d9b565b955050602086013567ffffffffffffffff81111561456157614560613d4d565b5b61456d88828901614425565b945050604086013567ffffffffffffffff81111561458e5761458d613d4d565b5b61459a888289016144e8565b935050606086013567ffffffffffffffff8111156145bb576145ba613d4d565b5b6145c7888289016144e8565b92505060806145d888828901613d9b565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061462c57607f821691505b602082108114156146405761463f6145e5565b5b50919050565b7f6572726f723a20696e76616c6964206c697175696469747920706f6f6c000000600082015250565b600061467c601d83613c8e565b915061468782614646565b602082019050919050565b600060208201905081810360008301526146ab8161466f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146ec82613db0565b91506146f783613db0565b92508282101561470a576147096146b2565b5b828203905092915050565b600060408201905061472a60008301856140cd565b614737602083018461403a565b9392505050565b60008151905061474d81613dba565b92915050565b60006020828403121561476957614768613d48565b5b60006147778482850161473e565b91505092915050565b7f6163746976652062696e206d75737420626520666c6f6f720000000000000000600082015250565b60006147b6601883613c8e565b91506147c182614780565b602082019050919050565b600060208201905081810360008301526147e5816147a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061483661483161482c8461402b565b613f84565b613db0565b9050919050565b6148468161481b565b82525050565b60006040820190506148616000830185614064565b61486e602083018461483d565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6148aa81613db0565b82525050565b60006148bc83836148a1565b60208301905092915050565b6000602082019050919050565b60006148e082614875565b6148ea8185614880565b93506148f583614891565b8060005b8381101561492657815161490d88826148b0565b9750614918836148c8565b9250506001810190506148f9565b5085935050505092915050565b60006080820190506149486000830187614064565b6149556020830186614064565b818103604083015261496781856148d5565b9050818103606083015261497b81846148d5565b905095945050505050565b600067ffffffffffffffff8211156149a1576149a06142da565b5b602082029050602081019050919050565b6000815190506149c18161415b565b92915050565b60006149da6149d584614986565b61433a565b905080838252602082019050602084028301858111156149fd576149fc614381565b5b835b81811015614a265780614a1288826149b2565b8452602084019350506020810190506149ff565b5050509392505050565b600082601f830112614a4557614a446142d5565b5b8151614a558482602086016149c7565b91505092915050565b600060208284031215614a7457614a73613d48565b5b600082015167ffffffffffffffff811115614a9257614a91613d4d565b5b614a9e84828501614a30565b91505092915050565b7f417420666c6f6f72000000000000000000000000000000000000000000000000600082015250565b6000614add600883613c8e565b9150614ae882614aa7565b602082019050919050565b60006020820190508181036000830152614b0c81614ad0565b9050919050565b6000614b1e8261402b565b9150614b298361402b565b92508262ffffff03821115614b4157614b406146b2565b5b828201905092915050565b6000614b578261402b565b9150614b628361402b565b925082821015614b7557614b746146b2565b5b828203905092915050565b6000614b8b82613db0565b9150614b9683613db0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bcf57614bce6146b2565b5b828202905092915050565b6000614be582613db0565b9150614bf083613db0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c2557614c246146b2565b5b828201905092915050565b6000604082019050614c4560008301856140cd565b614c526020830184613e5c565b9392505050565b614c628161402b565b8114614c6d57600080fd5b50565b600081519050614c7f81614c59565b92915050565b600060208284031215614c9b57614c9a613d48565b5b6000614ca984828501614c70565b91505092915050565b6000614cbd82614386565b9150614cc883614386565b9250827f800000000000000000000000000000000000000000000000000000000000000001821260008412151615614d0357614d026146b2565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018213600084121615614d3b57614d3a6146b2565b5b828203905092915050565b6000614d5182614386565b91507f8000000000000000000000000000000000000000000000000000000000000000821415614d8457614d836146b2565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614dc982613db0565b9150614dd483613db0565b925082614de457614de3614d8f565b5b828204905092915050565b7f4f7574206f662072616e67650000000000000000000000000000000000000000600082015250565b6000614e25600c83613c8e565b9150614e3082614def565b602082019050919050565b60006020820190508181036000830152614e5481614e18565b9050919050565b7f455448206d757374206265206c657373207468616e20746f74616c20746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eb7602283613c8e565b9150614ec282614e5b565b604082019050919050565b60006020820190508181036000830152614ee681614eaa565b9050919050565b7f6f7574206f6620736c6970706167652072616e67652028312d39392900000000600082015250565b6000614f23601c83613c8e565b9150614f2e82614eed565b602082019050919050565b60006020820190508181036000830152614f5281614f16565b9050919050565b7f54726164696e67206973206e6f7420656e61626c656400000000000000000000600082015250565b6000614f8f601683613c8e565b9150614f9a82614f59565b602082019050919050565b60006020820190508181036000830152614fbe81614f82565b9050919050565b6000819050919050565b6000614fea614fe5614fe084614fc5565b613f84565b613db0565b9050919050565b614ffa81614fcf565b82525050565b60006040820190506150156000830185614064565b6150226020830184614ff1565b9392505050565b60008151905061503881614269565b92915050565b60006020828403121561505457615053613d48565b5b600061506284828501615029565b91505092915050565b60006040820190506150806000830185614064565b61508d6020830184613e32565b9392505050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b60006150ca601783613c8e565b91506150d582615094565b602082019050919050565b600060208201905081810360008301526150f9816150bd565b9050919050565b600060c0820190506151156000830189613f5a565b6151226020830188614064565b61512f6040830187614064565b61513c6060830186613e5c565b6151496080830185613e5c565b61515660a0830184613e5c565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006151a2600283615161565b91506151ad8261516c565b600282019050919050565b6000819050919050565b6151d36151ce82613f50565b6151b8565b82525050565b60006151e482615195565b91506151f082856151c2565b60208201915061520082846151c2565b6020820191508190509392505050565b60006080820190506152256000830187613f5a565b6152326020830186613ee6565b61523f6040830185613f5a565b61524c6060830184613f5a565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b600061528b600e83613c8e565b915061529682615255565b602082019050919050565b600060208201905081810360008301526152ba8161527e565b9050919050565b7f696e697469616c697a6564000000000000000000000000000000000000000000600082015250565b60006152f7600b83613c8e565b9150615302826152c1565b602082019050919050565b60006020820190508181036000830152615326816152ea565b9050919050565b615336816140f7565b811461534157600080fd5b50565b6000815190506153538161532d565b92915050565b60006020828403121561536f5761536e613d48565b5b600061537d84828501615344565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153e2602683613c8e565b91506153ed82615386565b604082019050919050565b60006020820190508181036000830152615411816153d5565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461544581614614565b61544f8186615418565b9450600182166000811461546a576001811461547b576154ae565b60ff198316865281860193506154ae565b61548485615423565b60005b838110156154a657815481890152600182019150602081019050615487565b838801955050505b50505092915050565b60006154c38284615438565b915081905092915050565b600060a0820190506154e36000830188613f5a565b6154f06020830187613f5a565b6154fd6040830186613f5a565b61550a6060830185613e5c565b6155176080830184614064565b9695505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615557602083613c8e565b915061556282615521565b602082019050919050565b600060208201905081810360008301526155868161554a565b9050919050565b600061559882613db0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155cb576155ca6146b2565b5b600182019050919050565b60006040820190506155eb6000830185614064565b6155f86020830184613e5c565b9392505050565b600061560a82613fb0565b9050919050565b61561a816155ff565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61565581614386565b82525050565b6000615667838361564c565b60208301905092915050565b6000602082019050919050565b600061568b82615620565b615695818561562b565b93506156a08361563c565b8060005b838110156156d15781516156b8888261565b565b97506156c383615673565b9250506001810190506156a4565b5085935050505092915050565b600082825260208201905092915050565b60006156fa82614875565b61570481856156de565b935061570f83614891565b8060005b8381101561574057815161572788826148b0565b9750615732836148c8565b925050600181019050615713565b5085935050505092915050565b61575681613d72565b82525050565b60006101e0830160008301516157756000860182615611565b5060208301516157886020860182615611565b50604083015161579b60408601826148a1565b5060608301516157ae60608601826148a1565b5060808301516157c160808601826148a1565b5060a08301516157d460a08601826148a1565b5060c08301516157e760c08601826148a1565b5060e08301516157fa60e08601826148a1565b5061010083015161580f6101008601826148a1565b506101208301518482036101208601526158298282615680565b91505061014083015184820361014086015261584582826156ef565b91505061016083015184820361016086015261586182826156ef565b91505061018083015161587861018086018261574d565b506101a083015161588d6101a086018261574d565b506101c08301516158a26101c08601826148a1565b508091505092915050565b600060208201905081810360008301526158c7818461575c565b905092915050565b60006158e26158dd84614453565b61433a565b9050808382526020820190506020840283018581111561590557615904614381565b5b835b8181101561592e578061591a888261473e565b845260208401935050602081019050615907565b5050509392505050565b600082601f83011261594d5761594c6142d5565b5b815161595d8482602086016158cf565b91505092915050565b60008060008060008060c0878903121561598357615982613d48565b5b600061599189828a0161473e565b96505060206159a289828a0161473e565b95505060406159b389828a0161473e565b94505060606159c489828a0161473e565b935050608087015167ffffffffffffffff8111156159e5576159e4613d4d565b5b6159f189828a01615938565b92505060a087015167ffffffffffffffff811115615a1257615a11613d4d565b5b615a1e89828a01615938565b915050929550929550929556fea264697066735822122041cf5bb005c9b99a9bb05b24f4734d83d9657eba2c5c85e39da385a56b01b52c64736f6c634300080a0033000000000000000000000000b4315e873dbcf96ffd0acd8ea43f689d8c20fb3000000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab10000000000000000000000000000000000000000000000000000000001c9c38000000000000000000000000000000000000000000000000000000000000061a8000000000000000000000000fae14106232e610fa7607a27bdf6d3fe1d32cdd50000000000000000000000005140780e32d84a3ddf2febe31ffa0741c1a515e1
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b4315e873dbcf96ffd0acd8ea43f689d8c20fb3000000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab10000000000000000000000000000000000000000000000000000000001c9c38000000000000000000000000000000000000000000000000000000000000061a8000000000000000000000000fae14106232e610fa7607a27bdf6d3fe1d32cdd50000000000000000000000005140780e32d84a3ddf2febe31ffa0741c1a515e1-----Decoded View---------------
Arg [0] : joeRouter_ (address): 0xb4315e873dbcf96ffd0acd8ea43f689d8c20fb30
Arg [1] : native_ (address): 0x82af49447d8a07e3bd95bd0d56f35241523fbab1
Arg [2] : maxSupply_ (uint256): 30000000
Arg [3] : _xPerBin (uint256): 25000
Arg [4] : devWallet_ (address): 0xfae14106232e610fa7607a27bdf6d3fe1d32cdd5
Arg [5] : founderWallet_ (address): 0x5140780e32d84a3ddf2febe31ffa0741c1a515e1-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000b4315e873dbcf96ffd0acd8ea43f689d8c20fb30
Arg [1] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Arg [2] : 0000000000000000000000000000000000000000000000000000000001c9c380
Arg [3] : 00000000000000000000000000000000000000000000000000000000000061a8
Arg [4] : 000000000000000000000000fae14106232e610fa7607a27bdf6d3fe1d32cdd5
Arg [5] : 0000000000000000000000005140780e32d84a3ddf2febe31ffa0741c1a515e1
Deployed ByteCode Sourcemap
3528:15535:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1031:18:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2431:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1304:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4290:47:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4511:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15356:962;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17158:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1083:31:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16508:258:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5225:177:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4648:26:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3896:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3683:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9700:625;;;;;;;;;;;;;:::i;:::-;;1337:44:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:19;;;;;;;;;;;;;:::i;:::-;;4553:32:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4238:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1751:41:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8125:1569:18;;;;;;;;;;;;;:::i;:::-;;16816:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1194:85:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1056:20:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18717:309:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3785:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3931:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3715:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14787:563;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17785:322;;;;;;;;;;;;;:::i;:::-;;17456:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4039:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4419:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4344:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4000:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18631:80;;;;;;;;;;;;;:::i;:::-;;3778:1441:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4618:24:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1388:64:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18534:91:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18309:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7008:898;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:19;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4171:20:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4791:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3740:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4082:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17353:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1031:18:3;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2431:211::-;2505:4;2554:6;2521:9;:21;2531:10;2521:21;;;;;;;;;;;;;;;:30;2543:7;2521:30;;;;;;;;;;;;;;;:39;;;;2597:7;2576:37;;2585:10;2576:37;;;2606:6;2576:37;;;;;;:::i;:::-;;;;;;;;2631:4;2624:11;;2431:211;;;;:::o;1304:26::-;;;;:::o;4290:47:18:-;;;;:::o;4511:29::-;;;;:::o;15356:962::-;15483:4;15521:5;15503:23;;:14;;;;;;;;;;;:23;;;15499:84;;;15566:4;15550:21;;:4;:21;;;15542:30;;;;;;15499:84;15673:9;:13;15683:2;15673:13;;;;;;;;;;;;;;;;;;;;;;;;;15672:14;:34;;;;;15691:9;:15;15701:4;15691:15;;;;;;;;;;;;;;;;;;;;;;;;;15690:16;15672:34;15651:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;15772:15;15790:9;:15;15800:4;15790:15;;;;;;;;;;;;;;;:27;15806:10;15790:27;;;;;;;;;;;;;;;;15772:45;;15879:17;15868:7;:28;15864:105;;15952:6;15942:7;:16;;;;:::i;:::-;15912:9;:15;15922:4;15912:15;;;;;;;;;;;;;;;:27;15928:10;15912:27;;;;;;;;;;;;;;;:46;;;;15864:105;15998:6;15979:9;:15;15989:4;15979:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;16015:15;16033:33;16043:10;16055:2;16059:6;16033:9;:33::i;:::-;16015:51;;16229:7;16212:9;:13;16222:2;16212:13;;;;;;;;;;;;;;;;:24;;;;;;;;;;;16277:2;16262:27;;16271:4;16262:27;;;16281:7;16262:27;;;;;;:::i;:::-;;;;;;;;16307:4;16300:11;;;;15356:962;;;;;:::o;17158:128::-;17204:7;17230:9;;;;;;;;;;;:24;;;17255:4;;;;;;;;;;;17261:17;;;;;;;;;;;17230:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17223:56;;17158:128;:::o;1083:31:3:-;;;:::o;16508:258:18:-;16602:7;16621:21;16645:38;16678:4;16645:28;16669:3;356:4:1;16645:23:18;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;16621:62;;16709:50;356:4:1;16709:25:18;16720:13;16709:6;:10;;:25;;;;:::i;:::-;:29;;:50;;;;:::i;:::-;16702:57;;;16508:258;;;;:::o;5225:177:3:-;5282:7;5325:16;5308:13;:33;:87;;5371:24;:22;:24::i;:::-;5308:87;;;5344:24;5308:87;5301:94;;5225:177;:::o;4648:26:18:-;;;;;;;;;;;;;:::o;3896:29::-;;;;;;;;;;;;;:::o;3683:26::-;;;;;;;;;;;;;:::o;9700:625::-;9821:17;;;;;;;;;;;9801:37;;:16;:14;:16::i;:::-;:37;;;9780:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;9898:24;9939:1;9925:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9898:43;;9951:20;9988:1;9974:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9951:39;;10009:11;;;;;;;;;;;10000:20;;:3;10004:1;10000:6;;;;;;;;:::i;:::-;;;;;;;:20;;;;;10088:1;10043:4;;;;;;;;;;;:14;;;10066:4;10073:11;;;;;;;;;;;10043:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;;:::i;:::-;10030:7;10038:1;10030:10;;;;;;;;:::i;:::-;;;;;;;:59;;;;;10144:4;;;;;;;;;;;:9;;;10162:4;10177;10184:3;10189:7;10144:53;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10272:46;10286:4;10293:9;:24;10311:4;10293:24;;;;;;;;;;;;;;;;10272:5;:46::i;:::-;9739:586;;9700:625::o;1337:44:3:-;;;;;;;;;;;;;;;;;:::o;1824:101:19:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;4553:32:18:-;;;;;;;;;;;;;:::o;4238:22::-;;;;:::o;1751:41:3:-;;;;;;;;;;;;;;;;;:::o;8125:1569:18:-;6357:1;6346:7;;;;;;;;;;;:12;;;:53;;;;6383:16;:14;:16::i;:::-;6362:37;;:17;;;;;;;;;;;:37;;;6346:53;6342:102;;;6415:18;;;;;;;;;;:::i;:::-;;;;;;;;6342:102;6514:2;6490:21;;6471:16;:14;:16::i;:::-;:40;;;;;;:::i;:::-;:45;:66;;;;;6520:17;;;;;;;;;;;6471:66;6454:173;;;8207:4:::1;8191:13;;:20;;;;;;;;;;;;;;;;;;8222:17;:15;:17::i;:::-;8250:26;8286:6;8279:24;;;8312:4;8279:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8250:68;;8329:24;8392:7;;8386:1;8367:16;:14;:16::i;:::-;:20;;;;:::i;:::-;8357:6;;;;;;;;;;;:31;;;;:::i;:::-;8356:43;;;;;;:::i;:::-;8329:70;;8410:30;8505:9;:53;8515:42;8505:53;;;;;;;;;;;;;;;;8470:16;:88;;;;:::i;:::-;8443:11;;:116;;;;:::i;:::-;8410:149;;8570:21;8594:98;8628:18;8660:22;8594:20;:98::i;:::-;8570:122;;8703:23;8729:9;;;;;;;;;;;:24;;;8767:4;;;;;;;;;;;8785:44;:13;:42;:44::i;:::-;8729:110;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8703:136;;8889:16;:14;:16::i;:::-;8870:35;;:16;:35;;;:101;;8955:16;8870:101;;;8939:1;8920:16;:14;:16::i;:::-;:20;;;;:::i;:::-;8870:101;8850:17;;:121;;;;;;;;;;;;;;;;;;8982:22;9060:17;;;;;;;;;;;9047:32;;9015:16;:14;:16::i;:::-;9009:70;;;;;;:::i;:::-;9007:73;;;:::i;:::-;8982:98;;9124:1;9105:16;:14;:16::i;:::-;:20;;;;:::i;:::-;9091:11;;:34;;;;;;;;;;;;;;;;;;9136:24;9176:1;9163:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9136:42;;9202:15;9188:8;9197:1;9188:11;;;;;;;;:::i;:::-;;;;;;;:29;;;::::0;::::1;9241:2;9227:8;9236:1;9227:11;;;;;;;;:::i;:::-;;;;;;;:16;;;::::0;::::1;9254:30;9301:1;9287:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9254:49;;9332:1;9313:13;9327:1;9313:16;;;;;;;;:::i;:::-;;;;;;;:20;;;::::0;::::1;9362:1;9343:13;9357:1;9343:16;;;;;;;;:::i;:::-;;;;;;;:20;;;::::0;::::1;9374:30;9421:1;9407:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9374:49;;9510:3;9504:2;356:4:1;9482:24:18;;;;:::i;:::-;9481:32;;;;:::i;:::-;9462:13;9476:1;9462:16;;;;;;;;:::i;:::-;;;;;;;:51;;;::::0;::::1;9571:3;9565:2;356:4:1;9543:24:18;;;;:::i;:::-;9542:32;;;;:::i;:::-;9523:13;9537:1;9523:16;;;;;;;;:::i;:::-;;;;;;;:51;;;::::0;::::1;9585:70;9598:8;9608:13;9623;9638:16;:14;:16::i;:::-;9585:12;:70::i;:::-;9682:5;9666:13;;:21;;;;;;;;;;;;;;;;;;8181:1513;;;;;;;;;6454:173:::0;;;6594:22;;;;;;;;;;:::i;:::-;;;;;;;;6454:173;8125:1569::o;16816:273::-;16928:7;16966:11;16955:8;:22;16947:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;17070:11;356:4:1;17035:8:18;:30;;;;:::i;:::-;17034:48;;;;:::i;:::-;17027:55;;16816:273;;;;:::o;1194:85:19:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;1056:20:3:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18717:309:18:-;1087:13:19;:11;:13::i;:::-;18874:1:18::1;18851:20;:24;:54;;;;;18903:2;18879:20;:26;;18851:54;18830:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;18999:20;18969:27;:50;;;;18717:309:::0;:::o;3785:31::-;;;:::o;3931:23::-;;;;;;;;;;;;;:::o;3715:19::-;;;;;;;;;;;;;:::o;14787:563::-;14888:4;14926:5;14908:23;;:14;;;;;;;;;;;:23;;;14904:86;;;14947:32;;;;;;;;;;:::i;:::-;;;;;;;;14904:86;15024:6;14999:9;:21;15009:10;14999:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;15041:15;15059:33;15069:10;15081:2;15085:6;15059:9;:33::i;:::-;15041:51;;15255:7;15238:9;:13;15248:2;15238:13;;;;;;;;;;;;;;;;:24;;;;;;;;;;;15309:2;15288:33;;15297:10;15288:33;;;15313:7;15288:33;;;;;;:::i;:::-;;;;;;;;15339:4;15332:11;;;14787:563;;;;:::o;17785:322::-;1087:13:19;:11;:13::i;:::-;17880:12:18::1;17833:9;:24;17851:4;17833:24;;;;;;;;;;;;;;;:44;17866:9;;;;;;;;;;;17833:44;;;;;;;;;;;;;;;:59;;;;17909:6;17902:22;;;17933:9;;;;;;;;;;;17945:12;17902:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17986:4;;;;;;;;;;;17969:37;;;18015:9;;;;;;;;;;;18027:4;17969:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;18059:4;;;;;;;;;;;18042:37;;;18088:4;;;;;;;;;;;18095;18042:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17785:322::o:0;17456:84::-;17500:7;17526;:5;:7::i;:::-;17519:14;;17456:84;:::o;4039:22::-;;;;;;;;;;;;;:::o;4419:25::-;;;;;;;;;;;;;:::o;4344:31::-;;;;;;;;;;;;;:::o;4000:21::-;;;;;;;;;;;;;:::o;18631:80::-;1087:13:19;:11;:13::i;:::-;18700:4:18::1;18683:14;;:21;;;;;;;;;;;;;;;;;;18631:80::o:0;3778:1441:3:-;3955:15;3943:8;:27;;3935:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4163:24;4190:805;4326:18;:16;:18::i;:::-;4453:165;4652:5;4691:7;4732:5;4771:6;:13;4778:5;4771:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;4820:8;4409:449;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4370:514;;;;;;4248:658;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4217:707;;;;;;4942:1;4961;4980;4190:805;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4163:832;;5046:1;5018:30;;:16;:30;;;;:59;;;;;5072:5;5052:25;;:16;:25;;;5018:59;5010:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;5150:5;5111:9;:27;5121:16;5111:27;;;;;;;;;;;;;;;:36;5139:7;5111:36;;;;;;;;;;;;;;;:44;;;;4139:1027;5197:7;5181:31;;5190:5;5181:31;;;5206:5;5181:31;;;;;;:::i;:::-;;;;;;;;3778:1441;;;;;;;:::o;4618:24:18:-;;;;:::o;1388:64:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18534:91:18:-;1087:13:19;:11;:13::i;:::-;18610:8:18::1;18602:5;;:16;;;;;;;;;;;;;;;;;;18534:91:::0;:::o;18309:149::-;1087:13:19;:11;:13::i;:::-;18413:10:18::1;18393:17;;:30;;;;;;;;;;;;;;;;;;18447:4;18433:11;;:18;;;;;;;;;;;;;;;;;;18309:149:::0;;:::o;7008:898::-;1087:13:19;:11;:13::i;:::-;7261:2:18::1;7240:18;;;;;;;;;;;:23;;;7232:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;7316:1;7294:18;;;;;;;;;;;:23;;;7290:367;;;7341:6;7333:5;;:14;;;;;;;;;;;;;;;;;;7376:5;7361:4;;:21;;;;;;;;;;;;;;;;;;7407:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7397:7;;:27;;;;;;;;;;;;;;;;;;7450:16;:14;:16::i;:::-;7439:8;;:27;;;;;;;;;;;;;;;;;;7523:1;7504:16;:14;:16::i;:::-;:20;;;;:::i;:::-;7480:44;;:21;:44;;;;7588:11;:9;:11::i;:::-;7642:4;7623:16;:14;:16::i;:::-;:23;;;;:::i;:::-;7614:6;;:32;;;;;;;;;;;;;;;;;;7290:367;7667:36;7681:4;7700:2;7688:9;;:14;;;;:::i;:::-;7667:5;:36::i;:::-;7730:4;7714:13;;:20;;;;;;;;;;;;;;;;;;7744:70;7757:8;7767:13;7782;7797:16;:14;:16::i;:::-;7744:12;:70::i;:::-;7840:5;7824:13;;:21;;;;;;;;;;;;;;;;;;7898:1;7877:18;;;;;;;;;;;:22;;;;:::i;:::-;7856:18;;:43;;;;;;;;;;;;;;;;;;7008:898:::0;;;;;:::o;2074:198:19:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;;;2154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;4171:20:18:-;;;;;;;;;;;;;:::o;4791:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;3740:20::-;;;;;;;;;;;;;:::o;4082:36::-;;;;:::o;17353:97::-;17400:6;17425:4;;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17418:25;;17353:97;:::o;13278:1503::-;13387:15;13424:6;13414:16;;13444:11;;;;;;;;;;;:29;;;;;13460:13;;;;;;;;;;;13459:14;13444:29;13440:1335;;;13532:4;;;;;;;;;;;13516:21;;:4;:21;;;:46;;;;;13556:4;13541:21;;:2;:21;;;;13516:46;13512:552;;;13628:14;13645:25;13658:7;13667:2;13645:12;:25::i;:::-;13628:42;;13696:18;13717:25;13730:7;13739:2;13717:12;:25::i;:::-;13696:46;;13791:6;13767:9;:20;13777:9;;;;;;;;;;;13767:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;13835:9;;;;;;;;;;;13820:33;;13829:4;13820:33;;;13846:6;13820:33;;;;;;:::i;:::-;;;;;;;;13900:10;13872:9;:24;13882:13;;;;;;;;;;;13872:24;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;13948:13;;;;;;;;;;;13933:41;;13942:4;13933:41;;;13963:10;13933:41;;;;;;:::i;:::-;;;;;;;;14004:6;13993:17;;;;;:::i;:::-;;;14039:10;14028:21;;;;;:::i;:::-;;;13564:500;;13512:552;14122:9;;;;;;;;;;;14106:26;;:4;:26;;;:49;;;;;14150:4;;;;;;;;;;;14136:19;;:2;:19;;;14106:49;14102:663;;;14175:19;14236:17;;;;;;;;;;;14216:37;;:16;:14;:16::i;:::-;:37;;;14212:539;;;14291:31;14304:7;14313:8;;14291:12;:31::i;:::-;14277:45;;14364:11;14344:9;:16;14354:5;;;;;;;;;;;14344:16;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;14417:5;;;;;;;;;;;14402:34;;14411:4;14402:34;;;14424:11;14402:34;;;;;;:::i;:::-;;;;;;;;14469:11;14458:22;;;;;:::i;:::-;;;14212:539;;;14541:31;14554:7;14563:8;;14541:12;:31::i;:::-;14527:45;;14614:11;14594:9;:16;14604:5;;;;;;;;;;;14594:16;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;14667:5;;;;;;;;;;;14652:34;;14661:4;14652:34;;;14674:11;14652:34;;;;;;:::i;:::-;;;;;;;;14720:11;14708:24;;;;;:::i;:::-;;;14212:539;14157:608;14102:663;13440:1335;13278:1503;;;;;:::o;3465:96:22:-;3523:7;3553:1;3549;:5;;;;:::i;:::-;3542:12;;3465:96;;;;:::o;3850:::-;3908:7;3938:1;3934;:5;;;;:::i;:::-;3927:12;;3850:96;;;;:::o;5408:402:3:-;5473:7;5550:95;5679:4;5663:22;;;;;;:::i;:::-;;;;;;;;5703:14;5735:13;5774:4;5522:271;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5499:304;;;;;;5492:311;;5408:402;:::o;6335:328::-;6426:6;6407:9;:15;6417:4;6407:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;6590:6;6575:11;;:21;;;;;;;;;;;6645:1;6622:34;;6631:4;6622:34;;;6649:6;6622:34;;;;;;:::i;:::-;;;;;;;;6335:328;;:::o;1352:130:19:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;2426:187::-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;10331:1408:18:-;10377:18;10414:30;10479:21;;10448:16;:14;:16::i;:::-;:52;;;;;;:::i;:::-;10414:87;;10558:1;10537:17;;;;;;;;;;;:22;;;:100;;10636:1;10611:22;:26;;;;:::i;:::-;10537:100;;;10574:22;10537:100;10512:125;;10680:21;;10665:11;;;;;;;;;;;:36;;;;:113;;;;;10756:22;10732:21;;:46;;;;:::i;:::-;10717:11;;;;;;;;;;;:61;;;;10665:113;10648:339;;;10819:4;10803:20;;10648:339;;;10878:1;10858:17;;;;;;;;;;;:21;;;10854:123;;;10915:5;10899:21;;10938:24;;;;;:::i;:::-;;;;10854:123;10648:339;10997:24;11038:22;11024:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10997:64;;11071:20;11108:22;11094:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11071:60;;11147:9;11142:108;11162:22;11158:1;:26;11142:108;;;11238:1;11214:21;;:25;;;;:::i;:::-;11205:3;11209:1;11205:6;;;;;;;;:::i;:::-;;;;;;;:34;;;;;11186:3;;;;;:::i;:::-;;;;11142:108;;;;11285:1;11264:17;;;;;;;;;;;:22;;;11260:172;;11324:17;;;;;;;;;;;11302:39;;:3;11319:1;11306:3;:10;:14;;;;:::i;:::-;11302:19;;;;;;;;:::i;:::-;;;;;;;:39;;;;;11361:13;11356:65;;11410:11;;;;;;;;;;;11376:45;;:3;11405:1;11380:22;:26;;;;:::i;:::-;11376:31;;;;;;;;:::i;:::-;;;;;;;:45;;;;;11356:65;11260:172;11466:16;:14;:16::i;:::-;11442:40;;:21;:40;;;;11498:9;11493:176;11513:22;11509:1;:26;11493:176;;;11556:21;11580:4;;;;;;;;;;;:14;;;11603:4;11610:3;11614:1;11610:6;;;;;;;;:::i;:::-;;;;;;;;11580:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11556:61;;11645:13;11632:7;11640:1;11632:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;11542:127;11537:3;;;;;:::i;:::-;;;;11493:176;;;;11679:4;;;;;;;;;;;:9;;;11697:4;11712;11719:3;11724:7;11679:53;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10367:1372;;;;10331:1408::o;2428:177:20:-;2504:7;2530:68;251:3:1;356:4;2530:5:20;:23;;:68;;;;;:::i;:::-;2523:75;;2428:177;;;:::o;11745:1201:18:-;11938:15;11956:9;:24;11974:4;11956:24;;;;;;;;;;;;;;;;11938:42;;11990:15;12015:6;12008:24;;;12041:4;12008:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11990:57;;12058:18;12121:3;12090:27;;12080:7;:37;;;;:::i;:::-;12079:45;;;;:::i;:::-;12058:66;;12165:18;12228:3;12197:27;;12187:7;:37;;;;:::i;:::-;12186:45;;;;:::i;:::-;12165:66;;12273:18;12306:56;12365:520;;;;;;;;12440:4;12365:520;;;;;;12471:6;12365:520;;;;;;12496:7;;;;;;;;;;;12365:520;;;;;;12521:7;12365:520;;;;12546:7;12365:520;;;;12571:10;12365:520;;;;12599:10;12365:520;;;;12627:15;12365:520;;;;;;12678:10;12365:520;;;;12706:8;12365:520;;;;12732:13;12365:520;;;;12763:13;12365:520;;;;12802:4;12365:520;;;;;;12833:4;12365:520;;;;;;12856:15;12365:520;;;12306:579;;12896:9;;;;;;;;;;;:22;;;12919:19;12896:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;11928:1018;;;;;;11745:1201;;;;:::o;6004:325:3:-;6089:6;6074:11;;:21;;;;;;;:::i;:::-;;;;;;;;6258:6;6241:9;:13;6251:2;6241:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;6311:2;6290:32;;6307:1;6290:32;;;6315:6;6290:32;;;;;;:::i;:::-;;;;;;;;6004:325;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;4579:437:25:-;4675:14;4701:13;4724;4761:6;4756:11;;:1;:11;;4748:19;;4866:6;4860:12;;:3;:12;4854:19;;:1;:19;;4846:27;;4945:64;4967:1;4975:6;4970:11;;:1;:11;;4983;4996:5;5003;4945:21;:64::i;:::-;4938:71;;;;4579:437;;;;;:::o;7193:3395::-;7343:14;7444:1;7435:5;:10;7431:3151;;;7506:11;7498:5;:19;;;;;:::i;:::-;;;7489:28;;7431:3151;;;7662:11;7653:5;:20;7649:66;;7682:33;;;;;;;;;;;;;;7649:66;7814:17;7949:11;7946:1;7943;7936:25;7923:38;;8077:5;8066:9;8063:20;8056:5;8052:32;8043:41;;8121:9;8114:5;8110:21;8101:30;;8480:15;8528:1;8514:11;8513:12;:16;8498:11;:32;8480:50;;8665:7;8652:11;8648:25;8633:40;;8771:7;8764:5;8760:19;8751:28;;8956:1;8946:7;8936;8933:1;8929:15;8925:29;8921:37;8910:48;;9066:7;9058:5;:15;9049:24;;;;9406:15;9444:1;9429:11;9425:1;:15;9424:21;9406:39;;9702:7;9688:11;:21;9684:1;:25;9673:36;;;;9775:7;9761:11;:21;9757:1;:25;9746:36;;;;9849:7;9835:11;:21;9831:1;:25;9820:36;;;;9923:7;9909:11;:21;9905:1;:25;9894:36;;;;9997:7;9983:11;:21;9979:1;:25;9968:36;;;;10072:7;10058:11;:21;10054:1;:25;10043:36;;;;10550:7;10542:5;:15;10533:24;;8346:2226;;7548:3034;7431:3151;7193:3395;;;;;;;:::o;7:99:26:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1397:75::-;1430:6;1463:2;1457:9;1447:19;;1397:75;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:619::-;3923:6;3931;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;3846:619;;;;;:::o;4471:86::-;4506:7;4546:4;4539:5;4535:16;4524:27;;4471:86;;;:::o;4563:112::-;4646:22;4662:5;4646:22;:::i;:::-;4641:3;4634:35;4563:112;;:::o;4681:214::-;4770:4;4808:2;4797:9;4793:18;4785:26;;4821:67;4885:1;4874:9;4870:17;4861:6;4821:67;:::i;:::-;4681:214;;;;:::o;4901:474::-;4969:6;4977;5026:2;5014:9;5005:7;5001:23;4997:32;4994:119;;;5032:79;;:::i;:::-;4994:119;5152:1;5177:53;5222:7;5213:6;5202:9;5198:22;5177:53;:::i;:::-;5167:63;;5123:117;5279:2;5305:53;5350:7;5341:6;5330:9;5326:22;5305:53;:::i;:::-;5295:63;;5250:118;4901:474;;;;;:::o;5381:77::-;5418:7;5447:5;5436:16;;5381:77;;;:::o;5464:118::-;5551:24;5569:5;5551:24;:::i;:::-;5546:3;5539:37;5464:118;;:::o;5588:222::-;5681:4;5719:2;5708:9;5704:18;5696:26;;5732:71;5800:1;5789:9;5785:17;5776:6;5732:71;:::i;:::-;5588:222;;;;:::o;5816:60::-;5844:3;5865:5;5858:12;;5816:60;;;:::o;5882:142::-;5932:9;5965:53;5983:34;5992:24;6010:5;5992:24;:::i;:::-;5983:34;:::i;:::-;5965:53;:::i;:::-;5952:66;;5882:142;;;:::o;6030:126::-;6080:9;6113:37;6144:5;6113:37;:::i;:::-;6100:50;;6030:126;;;:::o;6162:144::-;6230:9;6263:37;6294:5;6263:37;:::i;:::-;6250:50;;6162:144;;;:::o;6312:167::-;6417:55;6466:5;6417:55;:::i;:::-;6412:3;6405:68;6312:167;;:::o;6485:258::-;6596:4;6634:2;6623:9;6619:18;6611:26;;6647:89;6733:1;6722:9;6718:17;6709:6;6647:89;:::i;:::-;6485:258;;;;:::o;6749:329::-;6808:6;6857:2;6845:9;6836:7;6832:23;6828:32;6825:119;;;6863:79;;:::i;:::-;6825:119;6983:1;7008:53;7053:7;7044:6;7033:9;7029:22;7008:53;:::i;:::-;6998:63;;6954:117;6749:329;;;;:::o;7084:91::-;7120:7;7160:8;7153:5;7149:20;7138:31;;7084:91;;;:::o;7181:115::-;7266:23;7283:5;7266:23;:::i;:::-;7261:3;7254:36;7181:115;;:::o;7302:218::-;7393:4;7431:2;7420:9;7416:18;7408:26;;7444:69;7510:1;7499:9;7495:17;7486:6;7444:69;:::i;:::-;7302:218;;;;:::o;7526:118::-;7613:24;7631:5;7613:24;:::i;:::-;7608:3;7601:37;7526:118;;:::o;7650:222::-;7743:4;7781:2;7770:9;7766:18;7758:26;;7794:71;7862:1;7851:9;7847:17;7838:6;7794:71;:::i;:::-;7650:222;;;;:::o;7878:329::-;7937:6;7986:2;7974:9;7965:7;7961:23;7957:32;7954:119;;;7992:79;;:::i;:::-;7954:119;8112:1;8137:53;8182:7;8173:6;8162:9;8158:22;8137:53;:::i;:::-;8127:63;;8083:117;7878:329;;;;:::o;8213:142::-;8279:9;8312:37;8343:5;8312:37;:::i;:::-;8299:50;;8213:142;;;:::o;8361:163::-;8464:53;8511:5;8464:53;:::i;:::-;8459:3;8452:66;8361:163;;:::o;8530:254::-;8639:4;8677:2;8666:9;8662:18;8654:26;;8690:87;8774:1;8763:9;8759:17;8750:6;8690:87;:::i;:::-;8530:254;;;;:::o;8790:89::-;8826:7;8866:6;8859:5;8855:18;8844:29;;8790:89;;;:::o;8885:115::-;8970:23;8987:5;8970:23;:::i;:::-;8965:3;8958:36;8885:115;;:::o;9006:218::-;9097:4;9135:2;9124:9;9120:18;9112:26;;9148:69;9214:1;9203:9;9199:17;9190:6;9148:69;:::i;:::-;9006:218;;;;:::o;9230:118::-;9301:22;9317:5;9301:22;:::i;:::-;9294:5;9291:33;9281:61;;9338:1;9335;9328:12;9281:61;9230:118;:::o;9354:135::-;9398:5;9436:6;9423:20;9414:29;;9452:31;9477:5;9452:31;:::i;:::-;9354:135;;;;:::o;9495:122::-;9568:24;9586:5;9568:24;:::i;:::-;9561:5;9558:35;9548:63;;9607:1;9604;9597:12;9548:63;9495:122;:::o;9623:139::-;9669:5;9707:6;9694:20;9685:29;;9723:33;9750:5;9723:33;:::i;:::-;9623:139;;;;:::o;9768:1199::-;9879:6;9887;9895;9903;9911;9919;9927;9976:3;9964:9;9955:7;9951:23;9947:33;9944:120;;;9983:79;;:::i;:::-;9944:120;10103:1;10128:53;10173:7;10164:6;10153:9;10149:22;10128:53;:::i;:::-;10118:63;;10074:117;10230:2;10256:53;10301:7;10292:6;10281:9;10277:22;10256:53;:::i;:::-;10246:63;;10201:118;10358:2;10384:53;10429:7;10420:6;10409:9;10405:22;10384:53;:::i;:::-;10374:63;;10329:118;10486:2;10512:53;10557:7;10548:6;10537:9;10533:22;10512:53;:::i;:::-;10502:63;;10457:118;10614:3;10641:51;10684:7;10675:6;10664:9;10660:22;10641:51;:::i;:::-;10631:61;;10585:117;10741:3;10768:53;10813:7;10804:6;10793:9;10789:22;10768:53;:::i;:::-;10758:63;;10712:119;10870:3;10897:53;10942:7;10933:6;10922:9;10918:22;10897:53;:::i;:::-;10887:63;;10841:119;9768:1199;;;;;;;;;;:::o;10973:474::-;11041:6;11049;11098:2;11086:9;11077:7;11073:23;11069:32;11066:119;;;11104:79;;:::i;:::-;11066:119;11224:1;11249:53;11294:7;11285:6;11274:9;11270:22;11249:53;:::i;:::-;11239:63;;11195:117;11351:2;11377:53;11422:7;11413:6;11402:9;11398:22;11377:53;:::i;:::-;11367:63;;11322:118;10973:474;;;;;:::o;11453:116::-;11523:21;11538:5;11523:21;:::i;:::-;11516:5;11513:32;11503:60;;11559:1;11556;11549:12;11503:60;11453:116;:::o;11575:133::-;11618:5;11656:6;11643:20;11634:29;;11672:30;11696:5;11672:30;:::i;:::-;11575:133;;;;:::o;11714:462::-;11776:6;11784;11833:2;11821:9;11812:7;11808:23;11804:32;11801:119;;;11839:79;;:::i;:::-;11801:119;11959:1;11984:50;12026:7;12017:6;12006:9;12002:22;11984:50;:::i;:::-;11974:60;;11930:114;12083:2;12109:50;12151:7;12142:6;12131:9;12127:22;12109:50;:::i;:::-;12099:60;;12054:115;11714:462;;;;;:::o;12182:117::-;12291:1;12288;12281:12;12305:180;12353:77;12350:1;12343:88;12450:4;12447:1;12440:15;12474:4;12471:1;12464:15;12491:281;12574:27;12596:4;12574:27;:::i;:::-;12566:6;12562:40;12704:6;12692:10;12689:22;12668:18;12656:10;12653:34;12650:62;12647:88;;;12715:18;;:::i;:::-;12647:88;12755:10;12751:2;12744:22;12534:238;12491:281;;:::o;12778:129::-;12812:6;12839:20;;:::i;:::-;12829:30;;12868:33;12896:4;12888:6;12868:33;:::i;:::-;12778:129;;;:::o;12913:310::-;12989:4;13079:18;13071:6;13068:30;13065:56;;;13101:18;;:::i;:::-;13065:56;13151:4;13143:6;13139:17;13131:25;;13211:4;13205;13201:15;13193:23;;12913:310;;;:::o;13229:117::-;13338:1;13335;13328:12;13352:76;13388:7;13417:5;13406:16;;13352:76;;;:::o;13434:120::-;13506:23;13523:5;13506:23;:::i;:::-;13499:5;13496:34;13486:62;;13544:1;13541;13534:12;13486:62;13434:120;:::o;13560:137::-;13605:5;13643:6;13630:20;13621:29;;13659:32;13685:5;13659:32;:::i;:::-;13560:137;;;;:::o;13719:707::-;13814:5;13839:80;13855:63;13911:6;13855:63;:::i;:::-;13839:80;:::i;:::-;13830:89;;13939:5;13968:6;13961:5;13954:21;14002:4;13995:5;13991:16;13984:23;;14055:4;14047:6;14043:17;14035:6;14031:30;14084:3;14076:6;14073:15;14070:122;;;14103:79;;:::i;:::-;14070:122;14218:6;14201:219;14235:6;14230:3;14227:15;14201:219;;;14310:3;14339:36;14371:3;14359:10;14339:36;:::i;:::-;14334:3;14327:49;14405:4;14400:3;14396:14;14389:21;;14277:143;14261:4;14256:3;14252:14;14245:21;;14201:219;;;14205:21;13820:606;;13719:707;;;;;:::o;14448:368::-;14518:5;14567:3;14560:4;14552:6;14548:17;14544:27;14534:122;;14575:79;;:::i;:::-;14534:122;14692:6;14679:20;14717:93;14806:3;14798:6;14791:4;14783:6;14779:17;14717:93;:::i;:::-;14708:102;;14524:292;14448:368;;;;:::o;14822:311::-;14899:4;14989:18;14981:6;14978:30;14975:56;;;15011:18;;:::i;:::-;14975:56;15061:4;15053:6;15049:17;15041:25;;15121:4;15115;15111:15;15103:23;;14822:311;;;:::o;15156:710::-;15252:5;15277:81;15293:64;15350:6;15293:64;:::i;:::-;15277:81;:::i;:::-;15268:90;;15378:5;15407:6;15400:5;15393:21;15441:4;15434:5;15430:16;15423:23;;15494:4;15486:6;15482:17;15474:6;15470:30;15523:3;15515:6;15512:15;15509:122;;;15542:79;;:::i;:::-;15509:122;15657:6;15640:220;15674:6;15669:3;15666:15;15640:220;;;15749:3;15778:37;15811:3;15799:10;15778:37;:::i;:::-;15773:3;15766:50;15845:4;15840:3;15836:14;15829:21;;15716:144;15700:4;15695:3;15691:14;15684:21;;15640:220;;;15644:21;15258:608;;15156:710;;;;;:::o;15889:370::-;15960:5;16009:3;16002:4;15994:6;15990:17;15986:27;15976:122;;16017:79;;:::i;:::-;15976:122;16134:6;16121:20;16159:94;16249:3;16241:6;16234:4;16226:6;16222:17;16159:94;:::i;:::-;16150:103;;15966:293;15889:370;;;;:::o;16265:1539::-;16434:6;16442;16450;16458;16466;16515:3;16503:9;16494:7;16490:23;16486:33;16483:120;;;16522:79;;:::i;:::-;16483:120;16642:1;16667:53;16712:7;16703:6;16692:9;16688:22;16667:53;:::i;:::-;16657:63;;16613:117;16797:2;16786:9;16782:18;16769:32;16828:18;16820:6;16817:30;16814:117;;;16850:79;;:::i;:::-;16814:117;16955:77;17024:7;17015:6;17004:9;17000:22;16955:77;:::i;:::-;16945:87;;16740:302;17109:2;17098:9;17094:18;17081:32;17140:18;17132:6;17129:30;17126:117;;;17162:79;;:::i;:::-;17126:117;17267:78;17337:7;17328:6;17317:9;17313:22;17267:78;:::i;:::-;17257:88;;17052:303;17422:2;17411:9;17407:18;17394:32;17453:18;17445:6;17442:30;17439:117;;;17475:79;;:::i;:::-;17439:117;17580:78;17650:7;17641:6;17630:9;17626:22;17580:78;:::i;:::-;17570:88;;17365:303;17707:3;17734:53;17779:7;17770:6;17759:9;17755:22;17734:53;:::i;:::-;17724:63;;17678:119;16265:1539;;;;;;;;:::o;17810:180::-;17858:77;17855:1;17848:88;17955:4;17952:1;17945:15;17979:4;17976:1;17969:15;17996:320;18040:6;18077:1;18071:4;18067:12;18057:22;;18124:1;18118:4;18114:12;18145:18;18135:81;;18201:4;18193:6;18189:17;18179:27;;18135:81;18263:2;18255:6;18252:14;18232:18;18229:38;18226:84;;;18282:18;;:::i;:::-;18226:84;18047:269;17996:320;;;:::o;18322:179::-;18462:31;18458:1;18450:6;18446:14;18439:55;18322:179;:::o;18507:366::-;18649:3;18670:67;18734:2;18729:3;18670:67;:::i;:::-;18663:74;;18746:93;18835:3;18746:93;:::i;:::-;18864:2;18859:3;18855:12;18848:19;;18507:366;;;:::o;18879:419::-;19045:4;19083:2;19072:9;19068:18;19060:26;;19132:9;19126:4;19122:20;19118:1;19107:9;19103:17;19096:47;19160:131;19286:4;19160:131;:::i;:::-;19152:139;;18879:419;;;:::o;19304:180::-;19352:77;19349:1;19342:88;19449:4;19446:1;19439:15;19473:4;19470:1;19463:15;19490:191;19530:4;19550:20;19568:1;19550:20;:::i;:::-;19545:25;;19584:20;19602:1;19584:20;:::i;:::-;19579:25;;19623:1;19620;19617:8;19614:34;;;19628:18;;:::i;:::-;19614:34;19673:1;19670;19666:9;19658:17;;19490:191;;;;:::o;19687:360::-;19822:4;19860:2;19849:9;19845:18;19837:26;;19873:87;19957:1;19946:9;19942:17;19933:6;19873:87;:::i;:::-;19970:70;20036:2;20025:9;20021:18;20012:6;19970:70;:::i;:::-;19687:360;;;;;:::o;20053:143::-;20110:5;20141:6;20135:13;20126:22;;20157:33;20184:5;20157:33;:::i;:::-;20053:143;;;;:::o;20202:351::-;20272:6;20321:2;20309:9;20300:7;20296:23;20292:32;20289:119;;;20327:79;;:::i;:::-;20289:119;20447:1;20472:64;20528:7;20519:6;20508:9;20504:22;20472:64;:::i;:::-;20462:74;;20418:128;20202:351;;;;:::o;20559:174::-;20699:26;20695:1;20687:6;20683:14;20676:50;20559:174;:::o;20739:366::-;20881:3;20902:67;20966:2;20961:3;20902:67;:::i;:::-;20895:74;;20978:93;21067:3;20978:93;:::i;:::-;21096:2;21091:3;21087:12;21080:19;;20739:366;;;:::o;21111:419::-;21277:4;21315:2;21304:9;21300:18;21292:26;;21364:9;21358:4;21354:20;21350:1;21339:9;21335:17;21328:47;21392:131;21518:4;21392:131;:::i;:::-;21384:139;;21111:419;;;:::o;21536:180::-;21584:77;21581:1;21574:88;21681:4;21678:1;21671:15;21705:4;21702:1;21695:15;21722:140;21771:9;21804:52;21822:33;21831:23;21848:5;21831:23;:::i;:::-;21822:33;:::i;:::-;21804:52;:::i;:::-;21791:65;;21722:140;;;:::o;21868:129::-;21954:36;21984:5;21954:36;:::i;:::-;21949:3;21942:49;21868:129;;:::o;22003:330::-;22123:4;22161:2;22150:9;22146:18;22138:26;;22174:71;22242:1;22231:9;22227:17;22218:6;22174:71;:::i;:::-;22255;22322:2;22311:9;22307:18;22298:6;22255:71;:::i;:::-;22003:330;;;;;:::o;22339:114::-;22406:6;22440:5;22434:12;22424:22;;22339:114;;;:::o;22459:184::-;22558:11;22592:6;22587:3;22580:19;22632:4;22627:3;22623:14;22608:29;;22459:184;;;;:::o;22649:132::-;22716:4;22739:3;22731:11;;22769:4;22764:3;22760:14;22752:22;;22649:132;;;:::o;22787:108::-;22864:24;22882:5;22864:24;:::i;:::-;22859:3;22852:37;22787:108;;:::o;22901:179::-;22970:10;22991:46;23033:3;23025:6;22991:46;:::i;:::-;23069:4;23064:3;23060:14;23046:28;;22901:179;;;;:::o;23086:113::-;23156:4;23188;23183:3;23179:14;23171:22;;23086:113;;;:::o;23235:732::-;23354:3;23383:54;23431:5;23383:54;:::i;:::-;23453:86;23532:6;23527:3;23453:86;:::i;:::-;23446:93;;23563:56;23613:5;23563:56;:::i;:::-;23642:7;23673:1;23658:284;23683:6;23680:1;23677:13;23658:284;;;23759:6;23753:13;23786:63;23845:3;23830:13;23786:63;:::i;:::-;23779:70;;23872:60;23925:6;23872:60;:::i;:::-;23862:70;;23718:224;23705:1;23702;23698:9;23693:14;;23658:284;;;23662:14;23958:3;23951:10;;23359:608;;;23235:732;;;;:::o;23973:855::-;24250:4;24288:3;24277:9;24273:19;24265:27;;24302:71;24370:1;24359:9;24355:17;24346:6;24302:71;:::i;:::-;24383:72;24451:2;24440:9;24436:18;24427:6;24383:72;:::i;:::-;24502:9;24496:4;24492:20;24487:2;24476:9;24472:18;24465:48;24530:108;24633:4;24624:6;24530:108;:::i;:::-;24522:116;;24685:9;24679:4;24675:20;24670:2;24659:9;24655:18;24648:48;24713:108;24816:4;24807:6;24713:108;:::i;:::-;24705:116;;23973:855;;;;;;;:::o;24834:311::-;24911:4;25001:18;24993:6;24990:30;24987:56;;;25023:18;;:::i;:::-;24987:56;25073:4;25065:6;25061:17;25053:25;;25133:4;25127;25123:15;25115:23;;24834:311;;;:::o;25151:143::-;25208:5;25239:6;25233:13;25224:22;;25255:33;25282:5;25255:33;:::i;:::-;25151:143;;;;:::o;25317:732::-;25424:5;25449:81;25465:64;25522:6;25465:64;:::i;:::-;25449:81;:::i;:::-;25440:90;;25550:5;25579:6;25572:5;25565:21;25613:4;25606:5;25602:16;25595:23;;25666:4;25658:6;25654:17;25646:6;25642:30;25695:3;25687:6;25684:15;25681:122;;;25714:79;;:::i;:::-;25681:122;25829:6;25812:231;25846:6;25841:3;25838:15;25812:231;;;25921:3;25950:48;25994:3;25982:10;25950:48;:::i;:::-;25945:3;25938:61;26028:4;26023:3;26019:14;26012:21;;25888:155;25872:4;25867:3;25863:14;25856:21;;25812:231;;;25816:21;25430:619;;25317:732;;;;;:::o;26072:385::-;26154:5;26203:3;26196:4;26188:6;26184:17;26180:27;26170:122;;26211:79;;:::i;:::-;26170:122;26321:6;26315:13;26346:105;26447:3;26439:6;26432:4;26424:6;26420:17;26346:105;:::i;:::-;26337:114;;26160:297;26072:385;;;;:::o;26463:554::-;26558:6;26607:2;26595:9;26586:7;26582:23;26578:32;26575:119;;;26613:79;;:::i;:::-;26575:119;26754:1;26743:9;26739:17;26733:24;26784:18;26776:6;26773:30;26770:117;;;26806:79;;:::i;:::-;26770:117;26911:89;26992:7;26983:6;26972:9;26968:22;26911:89;:::i;:::-;26901:99;;26704:306;26463:554;;;;:::o;27023:158::-;27163:10;27159:1;27151:6;27147:14;27140:34;27023:158;:::o;27187:365::-;27329:3;27350:66;27414:1;27409:3;27350:66;:::i;:::-;27343:73;;27425:93;27514:3;27425:93;:::i;:::-;27543:2;27538:3;27534:12;27527:19;;27187:365;;;:::o;27558:419::-;27724:4;27762:2;27751:9;27747:18;27739:26;;27811:9;27805:4;27801:20;27797:1;27786:9;27782:17;27775:47;27839:131;27965:4;27839:131;:::i;:::-;27831:139;;27558:419;;;:::o;27983:244::-;28022:3;28041:19;28058:1;28041:19;:::i;:::-;28036:24;;28074:19;28091:1;28074:19;:::i;:::-;28069:24;;28169:1;28159:8;28155:16;28152:1;28149:23;28146:49;;;28175:18;;:::i;:::-;28146:49;28219:1;28216;28212:9;28205:16;;27983:244;;;;:::o;28233:188::-;28272:4;28292:19;28309:1;28292:19;:::i;:::-;28287:24;;28325:19;28342:1;28325:19;:::i;:::-;28320:24;;28363:1;28360;28357:8;28354:34;;;28368:18;;:::i;:::-;28354:34;28413:1;28410;28406:9;28398:17;;28233:188;;;;:::o;28427:348::-;28467:7;28490:20;28508:1;28490:20;:::i;:::-;28485:25;;28524:20;28542:1;28524:20;:::i;:::-;28519:25;;28712:1;28644:66;28640:74;28637:1;28634:81;28629:1;28622:9;28615:17;28611:105;28608:131;;;28719:18;;:::i;:::-;28608:131;28767:1;28764;28760:9;28749:20;;28427:348;;;;:::o;28781:305::-;28821:3;28840:20;28858:1;28840:20;:::i;:::-;28835:25;;28874:20;28892:1;28874:20;:::i;:::-;28869:25;;29028:1;28960:66;28956:74;28953:1;28950:81;28947:107;;;29034:18;;:::i;:::-;28947:107;29078:1;29075;29071:9;29064:16;;28781:305;;;;:::o;29092:364::-;29229:4;29267:2;29256:9;29252:18;29244:26;;29280:87;29364:1;29353:9;29349:17;29340:6;29280:87;:::i;:::-;29377:72;29445:2;29434:9;29430:18;29421:6;29377:72;:::i;:::-;29092:364;;;;;:::o;29462:120::-;29534:23;29551:5;29534:23;:::i;:::-;29527:5;29524:34;29514:62;;29572:1;29569;29562:12;29514:62;29462:120;:::o;29588:141::-;29644:5;29675:6;29669:13;29660:22;;29691:32;29717:5;29691:32;:::i;:::-;29588:141;;;;:::o;29735:349::-;29804:6;29853:2;29841:9;29832:7;29828:23;29824:32;29821:119;;;29859:79;;:::i;:::-;29821:119;29979:1;30004:63;30059:7;30050:6;30039:9;30035:22;30004:63;:::i;:::-;29994:73;;29950:127;29735:349;;;;:::o;30090:527::-;30129:4;30149:19;30166:1;30149:19;:::i;:::-;30144:24;;30182:19;30199:1;30182:19;:::i;:::-;30177:24;;30371:1;30303:66;30299:74;30296:1;30292:82;30287:1;30284;30280:9;30273:17;30269:106;30266:132;;;30378:18;;:::i;:::-;30266:132;30557:1;30489:66;30485:74;30482:1;30478:82;30474:1;30471;30467:9;30463:98;30460:124;;;30564:18;;:::i;:::-;30460:124;30609:1;30606;30602:9;30594:17;;30090:527;;;;:::o;30623:228::-;30658:3;30681:23;30698:5;30681:23;:::i;:::-;30672:32;;30726:66;30719:5;30716:77;30713:103;;;30796:18;;:::i;:::-;30713:103;30839:5;30836:1;30832:13;30825:20;;30623:228;;;:::o;30857:180::-;30905:77;30902:1;30895:88;31002:4;30999:1;30992:15;31026:4;31023:1;31016:15;31043:185;31083:1;31100:20;31118:1;31100:20;:::i;:::-;31095:25;;31134:20;31152:1;31134:20;:::i;:::-;31129:25;;31173:1;31163:35;;31178:18;;:::i;:::-;31163:35;31220:1;31217;31213:9;31208:14;;31043:185;;;;:::o;31234:162::-;31374:14;31370:1;31362:6;31358:14;31351:38;31234:162;:::o;31402:366::-;31544:3;31565:67;31629:2;31624:3;31565:67;:::i;:::-;31558:74;;31641:93;31730:3;31641:93;:::i;:::-;31759:2;31754:3;31750:12;31743:19;;31402:366;;;:::o;31774:419::-;31940:4;31978:2;31967:9;31963:18;31955:26;;32027:9;32021:4;32017:20;32013:1;32002:9;31998:17;31991:47;32055:131;32181:4;32055:131;:::i;:::-;32047:139;;31774:419;;;:::o;32199:221::-;32339:34;32335:1;32327:6;32323:14;32316:58;32408:4;32403:2;32395:6;32391:15;32384:29;32199:221;:::o;32426:366::-;32568:3;32589:67;32653:2;32648:3;32589:67;:::i;:::-;32582:74;;32665:93;32754:3;32665:93;:::i;:::-;32783:2;32778:3;32774:12;32767:19;;32426:366;;;:::o;32798:419::-;32964:4;33002:2;32991:9;32987:18;32979:26;;33051:9;33045:4;33041:20;33037:1;33026:9;33022:17;33015:47;33079:131;33205:4;33079:131;:::i;:::-;33071:139;;32798:419;;;:::o;33223:178::-;33363:30;33359:1;33351:6;33347:14;33340:54;33223:178;:::o;33407:366::-;33549:3;33570:67;33634:2;33629:3;33570:67;:::i;:::-;33563:74;;33646:93;33735:3;33646:93;:::i;:::-;33764:2;33759:3;33755:12;33748:19;;33407:366;;;:::o;33779:419::-;33945:4;33983:2;33972:9;33968:18;33960:26;;34032:9;34026:4;34022:20;34018:1;34007:9;34003:17;33996:47;34060:131;34186:4;34060:131;:::i;:::-;34052:139;;33779:419;;;:::o;34204:172::-;34344:24;34340:1;34332:6;34328:14;34321:48;34204:172;:::o;34382:366::-;34524:3;34545:67;34609:2;34604:3;34545:67;:::i;:::-;34538:74;;34621:93;34710:3;34621:93;:::i;:::-;34739:2;34734:3;34730:12;34723:19;;34382:366;;;:::o;34754:419::-;34920:4;34958:2;34947:9;34943:18;34935:26;;35007:9;35001:4;34997:20;34993:1;34982:9;34978:17;34971:47;35035:131;35161:4;35035:131;:::i;:::-;35027:139;;34754:419;;;:::o;35179:162::-;35301:7;35330:5;35319:16;;35179:162;;;:::o;35347:312::-;35482:9;35515:138;35533:119;35542:109;35645:5;35542:109;:::i;:::-;35533:119;:::i;:::-;35515:138;:::i;:::-;35502:151;;35347:312;;;:::o;35665:301::-;35837:122;35953:5;35837:122;:::i;:::-;35832:3;35825:135;35665:301;;:::o;35972:502::-;36178:4;36216:2;36205:9;36201:18;36193:26;;36229:71;36297:1;36286:9;36282:17;36273:6;36229:71;:::i;:::-;36310:157;36463:2;36452:9;36448:18;36439:6;36310:157;:::i;:::-;35972:502;;;;;:::o;36480:137::-;36534:5;36565:6;36559:13;36550:22;;36581:30;36605:5;36581:30;:::i;:::-;36480:137;;;;:::o;36623:345::-;36690:6;36739:2;36727:9;36718:7;36714:23;36710:32;36707:119;;;36745:79;;:::i;:::-;36707:119;36865:1;36890:61;36943:7;36934:6;36923:9;36919:22;36890:61;:::i;:::-;36880:71;;36836:125;36623:345;;;;:::o;36974:320::-;37089:4;37127:2;37116:9;37112:18;37104:26;;37140:71;37208:1;37197:9;37193:17;37184:6;37140:71;:::i;:::-;37221:66;37283:2;37272:9;37268:18;37259:6;37221:66;:::i;:::-;36974:320;;;;;:::o;37300:173::-;37440:25;37436:1;37428:6;37424:14;37417:49;37300:173;:::o;37479:366::-;37621:3;37642:67;37706:2;37701:3;37642:67;:::i;:::-;37635:74;;37718:93;37807:3;37718:93;:::i;:::-;37836:2;37831:3;37827:12;37820:19;;37479:366;;;:::o;37851:419::-;38017:4;38055:2;38044:9;38040:18;38032:26;;38104:9;38098:4;38094:20;38090:1;38079:9;38075:17;38068:47;38132:131;38258:4;38132:131;:::i;:::-;38124:139;;37851:419;;;:::o;38276:775::-;38509:4;38547:3;38536:9;38532:19;38524:27;;38561:71;38629:1;38618:9;38614:17;38605:6;38561:71;:::i;:::-;38642:72;38710:2;38699:9;38695:18;38686:6;38642:72;:::i;:::-;38724;38792:2;38781:9;38777:18;38768:6;38724:72;:::i;:::-;38806;38874:2;38863:9;38859:18;38850:6;38806:72;:::i;:::-;38888:73;38956:3;38945:9;38941:19;38932:6;38888:73;:::i;:::-;38971;39039:3;39028:9;39024:19;39015:6;38971:73;:::i;:::-;38276:775;;;;;;;;;:::o;39057:148::-;39159:11;39196:3;39181:18;;39057:148;;;;:::o;39211:214::-;39351:66;39347:1;39339:6;39335:14;39328:90;39211:214;:::o;39431:400::-;39591:3;39612:84;39694:1;39689:3;39612:84;:::i;:::-;39605:91;;39705:93;39794:3;39705:93;:::i;:::-;39823:1;39818:3;39814:11;39807:18;;39431:400;;;:::o;39837:79::-;39876:7;39905:5;39894:16;;39837:79;;;:::o;39922:157::-;40027:45;40047:24;40065:5;40047:24;:::i;:::-;40027:45;:::i;:::-;40022:3;40015:58;39922:157;;:::o;40085:663::-;40326:3;40348:148;40492:3;40348:148;:::i;:::-;40341:155;;40506:75;40577:3;40568:6;40506:75;:::i;:::-;40606:2;40601:3;40597:12;40590:19;;40619:75;40690:3;40681:6;40619:75;:::i;:::-;40719:2;40714:3;40710:12;40703:19;;40739:3;40732:10;;40085:663;;;;;:::o;40754:545::-;40927:4;40965:3;40954:9;40950:19;40942:27;;40979:71;41047:1;41036:9;41032:17;41023:6;40979:71;:::i;:::-;41060:68;41124:2;41113:9;41109:18;41100:6;41060:68;:::i;:::-;41138:72;41206:2;41195:9;41191:18;41182:6;41138:72;:::i;:::-;41220;41288:2;41277:9;41273:18;41264:6;41220:72;:::i;:::-;40754:545;;;;;;;:::o;41305:164::-;41445:16;41441:1;41433:6;41429:14;41422:40;41305:164;:::o;41475:366::-;41617:3;41638:67;41702:2;41697:3;41638:67;:::i;:::-;41631:74;;41714:93;41803:3;41714:93;:::i;:::-;41832:2;41827:3;41823:12;41816:19;;41475:366;;;:::o;41847:419::-;42013:4;42051:2;42040:9;42036:18;42028:26;;42100:9;42094:4;42090:20;42086:1;42075:9;42071:17;42064:47;42128:131;42254:4;42128:131;:::i;:::-;42120:139;;41847:419;;;:::o;42272:161::-;42412:13;42408:1;42400:6;42396:14;42389:37;42272:161;:::o;42439:366::-;42581:3;42602:67;42666:2;42661:3;42602:67;:::i;:::-;42595:74;;42678:93;42767:3;42678:93;:::i;:::-;42796:2;42791:3;42787:12;42780:19;;42439:366;;;:::o;42811:419::-;42977:4;43015:2;43004:9;43000:18;42992:26;;43064:9;43058:4;43054:20;43050:1;43039:9;43035:17;43028:47;43092:131;43218:4;43092:131;:::i;:::-;43084:139;;42811:419;;;:::o;43236:120::-;43308:23;43325:5;43308:23;:::i;:::-;43301:5;43298:34;43288:62;;43346:1;43343;43336:12;43288:62;43236:120;:::o;43362:141::-;43418:5;43449:6;43443:13;43434:22;;43465:32;43491:5;43465:32;:::i;:::-;43362:141;;;;:::o;43509:349::-;43578:6;43627:2;43615:9;43606:7;43602:23;43598:32;43595:119;;;43633:79;;:::i;:::-;43595:119;43753:1;43778:63;43833:7;43824:6;43813:9;43809:22;43778:63;:::i;:::-;43768:73;;43724:127;43509:349;;;;:::o;43864:225::-;44004:34;44000:1;43992:6;43988:14;43981:58;44073:8;44068:2;44060:6;44056:15;44049:33;43864:225;:::o;44095:366::-;44237:3;44258:67;44322:2;44317:3;44258:67;:::i;:::-;44251:74;;44334:93;44423:3;44334:93;:::i;:::-;44452:2;44447:3;44443:12;44436:19;;44095:366;;;:::o;44467:419::-;44633:4;44671:2;44660:9;44656:18;44648:26;;44720:9;44714:4;44710:20;44706:1;44695:9;44691:17;44684:47;44748:131;44874:4;44748:131;:::i;:::-;44740:139;;44467:419;;;:::o;44892:147::-;44993:11;45030:3;45015:18;;44892:147;;;;:::o;45045:144::-;45097:4;45120:3;45112:11;;45143:3;45140:1;45133:14;45177:4;45174:1;45164:18;45156:26;;45045:144;;;:::o;45217:849::-;45322:3;45359:5;45353:12;45388:36;45414:9;45388:36;:::i;:::-;45440:88;45521:6;45516:3;45440:88;:::i;:::-;45433:95;;45559:1;45548:9;45544:17;45575:1;45570:137;;;;45721:1;45716:344;;;;45537:523;;45570:137;45654:4;45650:9;45639;45635:25;45630:3;45623:38;45690:6;45685:3;45681:16;45674:23;;45570:137;;45716:344;45783:41;45818:5;45783:41;:::i;:::-;45846:1;45860:154;45874:6;45871:1;45868:13;45860:154;;;45948:7;45942:14;45938:1;45933:3;45929:11;45922:35;45998:1;45989:7;45985:15;45974:26;;45896:4;45893:1;45889:12;45884:17;;45860:154;;;46043:6;46038:3;46034:16;46027:23;;45723:337;;45537:523;;45326:740;;45217:849;;;;:::o;46072:273::-;46203:3;46225:94;46315:3;46306:6;46225:94;:::i;:::-;46218:101;;46336:3;46329:10;;46072:273;;;;:::o;46351:664::-;46556:4;46594:3;46583:9;46579:19;46571:27;;46608:71;46676:1;46665:9;46661:17;46652:6;46608:71;:::i;:::-;46689:72;46757:2;46746:9;46742:18;46733:6;46689:72;:::i;:::-;46771;46839:2;46828:9;46824:18;46815:6;46771:72;:::i;:::-;46853;46921:2;46910:9;46906:18;46897:6;46853:72;:::i;:::-;46935:73;47003:3;46992:9;46988:19;46979:6;46935:73;:::i;:::-;46351:664;;;;;;;;:::o;47021:182::-;47161:34;47157:1;47149:6;47145:14;47138:58;47021:182;:::o;47209:366::-;47351:3;47372:67;47436:2;47431:3;47372:67;:::i;:::-;47365:74;;47448:93;47537:3;47448:93;:::i;:::-;47566:2;47561:3;47557:12;47550:19;;47209:366;;;:::o;47581:419::-;47747:4;47785:2;47774:9;47770:18;47762:26;;47834:9;47828:4;47824:20;47820:1;47809:9;47805:17;47798:47;47862:131;47988:4;47862:131;:::i;:::-;47854:139;;47581:419;;;:::o;48006:233::-;48045:3;48068:24;48086:5;48068:24;:::i;:::-;48059:33;;48114:66;48107:5;48104:77;48101:103;;;48184:18;;:::i;:::-;48101:103;48231:1;48224:5;48220:13;48213:20;;48006:233;;;:::o;48245:332::-;48366:4;48404:2;48393:9;48389:18;48381:26;;48417:71;48485:1;48474:9;48470:17;48461:6;48417:71;:::i;:::-;48498:72;48566:2;48555:9;48551:18;48542:6;48498:72;:::i;:::-;48245:332;;;;;:::o;48583:140::-;48647:9;48680:37;48711:5;48680:37;:::i;:::-;48667:50;;48583:140;;;:::o;48729:149::-;48820:51;48865:5;48820:51;:::i;:::-;48815:3;48808:64;48729:149;;:::o;48884:113::-;48950:6;48984:5;48978:12;48968:22;;48884:113;;;:::o;49003:173::-;49091:11;49125:6;49120:3;49113:19;49165:4;49160:3;49156:14;49141:29;;49003:173;;;;:::o;49182:131::-;49248:4;49271:3;49263:11;;49301:4;49296:3;49292:14;49284:22;;49182:131;;;:::o;49319:105::-;49394:23;49411:5;49394:23;:::i;:::-;49389:3;49382:36;49319:105;;:::o;49430:175::-;49497:10;49518:44;49558:3;49550:6;49518:44;:::i;:::-;49594:4;49589:3;49585:14;49571:28;;49430:175;;;;:::o;49611:112::-;49680:4;49712;49707:3;49703:14;49695:22;;49611:112;;;:::o;49757:704::-;49864:3;49893:53;49940:5;49893:53;:::i;:::-;49962:75;50030:6;50025:3;49962:75;:::i;:::-;49955:82;;50061:55;50110:5;50061:55;:::i;:::-;50139:7;50170:1;50155:281;50180:6;50177:1;50174:13;50155:281;;;50256:6;50250:13;50283:61;50340:3;50325:13;50283:61;:::i;:::-;50276:68;;50367:59;50419:6;50367:59;:::i;:::-;50357:69;;50215:221;50202:1;50199;50195:9;50190:14;;50155:281;;;50159:14;50452:3;50445:10;;49869:592;;;49757:704;;;;:::o;50467:174::-;50556:11;50590:6;50585:3;50578:19;50630:4;50625:3;50621:14;50606:29;;50467:174;;;;:::o;50677:712::-;50786:3;50815:54;50863:5;50815:54;:::i;:::-;50885:76;50954:6;50949:3;50885:76;:::i;:::-;50878:83;;50985:56;51035:5;50985:56;:::i;:::-;51064:7;51095:1;51080:284;51105:6;51102:1;51099:13;51080:284;;;51181:6;51175:13;51208:63;51267:3;51252:13;51208:63;:::i;:::-;51201:70;;51294:60;51347:6;51294:60;:::i;:::-;51284:70;;51140:224;51127:1;51124;51120:9;51115:14;;51080:284;;;51084:14;51380:3;51373:10;;50791:598;;;50677:712;;;;:::o;51395:108::-;51472:24;51490:5;51472:24;:::i;:::-;51467:3;51460:37;51395:108;;:::o;51593:3250::-;51736:3;51772:6;51767:3;51763:16;51863:4;51856:5;51852:16;51846:23;51882:77;51953:4;51948:3;51944:14;51930:12;51882:77;:::i;:::-;51789:180;52053:4;52046:5;52042:16;52036:23;52072:77;52143:4;52138:3;52134:14;52120:12;52072:77;:::i;:::-;51979:180;52244:4;52237:5;52233:16;52227:23;52263:63;52320:4;52315:3;52311:14;52297:12;52263:63;:::i;:::-;52169:167;52421:4;52414:5;52410:16;52404:23;52440:63;52497:4;52492:3;52488:14;52474:12;52440:63;:::i;:::-;52346:167;52598:4;52591:5;52587:16;52581:23;52617:63;52674:4;52669:3;52665:14;52651:12;52617:63;:::i;:::-;52523:167;52778:4;52771:5;52767:16;52761:23;52797:63;52854:4;52849:3;52845:14;52831:12;52797:63;:::i;:::-;52700:170;52958:4;52951:5;52947:16;52941:23;52977:63;53034:4;53029:3;53025:14;53011:12;52977:63;:::i;:::-;52880:170;53143:4;53136:5;53132:16;53126:23;53162:63;53219:4;53214:3;53210:14;53196:12;53162:63;:::i;:::-;53060:175;53323:6;53316:5;53312:18;53306:25;53344:65;53401:6;53396:3;53392:16;53378:12;53344:65;:::i;:::-;53245:174;53505:6;53498:5;53494:18;53488:25;53562:3;53556:4;53552:14;53543:6;53538:3;53534:16;53527:40;53588:101;53684:4;53670:12;53588:101;:::i;:::-;53580:109;;53429:271;53791:6;53784:5;53780:18;53774:25;53848:3;53842:4;53838:14;53829:6;53824:3;53820:16;53813:40;53874:103;53972:4;53958:12;53874:103;:::i;:::-;53866:111;;53710:278;54079:6;54072:5;54068:18;54062:25;54136:3;54130:4;54126:14;54117:6;54112:3;54108:16;54101:40;54162:103;54260:4;54246:12;54162:103;:::i;:::-;54154:111;;53998:278;54356:6;54349:5;54345:18;54339:25;54377:65;54434:6;54429:3;54425:16;54411:12;54377:65;:::i;:::-;54286:166;54538:6;54531:5;54527:18;54521:25;54559:65;54616:6;54611:3;54607:16;54593:12;54559:65;:::i;:::-;54462:172;54720:6;54713:5;54709:18;54703:25;54741:65;54798:6;54793:3;54789:16;54775:12;54741:65;:::i;:::-;54644:172;54833:4;54826:11;;51741:3102;51593:3250;;;;:::o;54849:421::-;55016:4;55054:2;55043:9;55039:18;55031:26;;55103:9;55097:4;55093:20;55089:1;55078:9;55074:17;55067:47;55131:132;55258:4;55249:6;55131:132;:::i;:::-;55123:140;;54849:421;;;;:::o;55293:732::-;55400:5;55425:81;55441:64;55498:6;55441:64;:::i;:::-;55425:81;:::i;:::-;55416:90;;55526:5;55555:6;55548:5;55541:21;55589:4;55582:5;55578:16;55571:23;;55642:4;55634:6;55630:17;55622:6;55618:30;55671:3;55663:6;55660:15;55657:122;;;55690:79;;:::i;:::-;55657:122;55805:6;55788:231;55822:6;55817:3;55814:15;55788:231;;;55897:3;55926:48;55970:3;55958:10;55926:48;:::i;:::-;55921:3;55914:61;56004:4;55999:3;55995:14;55988:21;;55864:155;55848:4;55843:3;55839:14;55832:21;;55788:231;;;55792:21;55406:619;;55293:732;;;;;:::o;56048:385::-;56130:5;56179:3;56172:4;56164:6;56160:17;56156:27;56146:122;;56187:79;;:::i;:::-;56146:122;56297:6;56291:13;56322:105;56423:3;56415:6;56408:4;56400:6;56396:17;56322:105;:::i;:::-;56313:114;;56136:297;56048:385;;;;:::o;56439:1540::-;56604:6;56612;56620;56628;56636;56644;56693:3;56681:9;56672:7;56668:23;56664:33;56661:120;;;56700:79;;:::i;:::-;56661:120;56820:1;56845:64;56901:7;56892:6;56881:9;56877:22;56845:64;:::i;:::-;56835:74;;56791:128;56958:2;56984:64;57040:7;57031:6;57020:9;57016:22;56984:64;:::i;:::-;56974:74;;56929:129;57097:2;57123:64;57179:7;57170:6;57159:9;57155:22;57123:64;:::i;:::-;57113:74;;57068:129;57236:2;57262:64;57318:7;57309:6;57298:9;57294:22;57262:64;:::i;:::-;57252:74;;57207:129;57396:3;57385:9;57381:19;57375:26;57428:18;57420:6;57417:30;57414:117;;;57450:79;;:::i;:::-;57414:117;57555:89;57636:7;57627:6;57616:9;57612:22;57555:89;:::i;:::-;57545:99;;57346:308;57714:3;57703:9;57699:19;57693:26;57746:18;57738:6;57735:30;57732:117;;;57768:79;;:::i;:::-;57732:117;57873:89;57954:7;57945:6;57934:9;57930:22;57873:89;:::i;:::-;57863:99;;57664:308;56439:1540;;;;;;;;:::o
Metadata Hash
ipfs://41cf5bb005c9b99a9bb05b24f4734d83d9657eba2c5c85e39da385a56b01b52c
FAQs
How do you check the top holders of a coin? ›
To find top holder information about a specific ERC-20 token, look for Overview. All ERC-20 tokens , which will lead you to a list of all ERC-20 tokens Santiment is currently including in its calculations. Find the needed token and select Open Dashboard in the very last column, which should be named Top Holders .
How much is the arbiscan token? ›$0.57 | Synapse (SYN) Token Tracker | Arbiscan.
Is there a token for arbitrum? ›Arbitrum (ARB) – One of the best ways to gain exposure to the Arbitrum network is through its governance token, ARB. While ARB was launched as recently as March 2023, it already commands a market capitalization of over one billion dollars.
How many tokens are in arbitrum? ›The total supply of ARB tokens is fixed at 10 billion.
How do you find oversold crypto coins? ›There are usually two parallel lines on a chart showing a channel with a line that moves through it, indicating when the market is oversold or undersold. A cryptocurrency is seen by traders to be oversold when it has persistent sell pressure and the RSI indicates it's set to rally upwards.
How do you check the liquidity of a coin? ›Check CoinMarketCap to see where you can buy Proof Of Liquidity and with which currencies. For each cryptocurrency, CoinMarketCap provides a list of purchasing options (also known as market pairs). Go to CoinMarketCap and search for Proof Of Liquidity.
How much will arbitrum tokens be worth? ›However, with the anticipated Litecoin and Bitcoin halvings on the horizon, we expect an inflow of new liquidity to the markets, causing an Arbitrum token price of $2.1 by the end of 2023. End of 2024: With the Bitcoin halving set for early 2024, the bull market will be in full swing.
Does Coinbase accept arbitrum? ›Arbitrum ranks 135 among tradable assets on Coinbase. Popularity is currently based on relative market cap.
What is the biggest NFT marketplace on Arbitrum? ›OpenSea is the largest NFT marketplace on the Ethereum blockchain and one of the few to support trading on Arbitrum. With over 400 creators and projects, the platform offers a wide selection of digital art, collectibles, gaming items, and more.
What is the all time low for arbitrum? ›Arbitrum reached its highest price on Mar 23, 2023 when it was trading at its all-time high of $ 8.67, while Arbitrum's lowest price was recorded on May 8, 2023 when it was trading at its all-time low of $ 1.027100.
How much is 1000 tokens worth? ›
1000 SwapToken is 0.250073 US Dollar.
So, you've converted 1000 SwapToken to 0.250073 US Dollar. We used 3998.832 International Currency Exchange Rate.
Arbitrum was developed by Offchain Labs, a blockchain research and development company founded in 2018 by Ed Felten, Steven Goldfeder, and Harry Kalodner.
Is oversold a buy signal? ›Oversold is mistakenly viewed by some traders as a buy signal. Instead, it is more of an alert. It lets traders know that an asset is trading in the lower portion of its recent price range, or is trading at a lower fundamental ratio than it typically does. This doesn't mean the asset should be bought.
What is the best crypto analyzer in the world? ›1. CoinMarketCap: CoinMarketCap is one of the best platforms for crypto analysis. It provides real-time data on cryptocurrency prices, market capitalization, trading volume, and other relevant information. CoinMarketCap also has a news section that provides updates on the latest trends in the cryptocurrency market.
What is the most oversold coin? ›We automatically rank cryptocurrencies according to their current RSI reading to help you identify new undervalued crypto assets or coins that are potentially overbought. Currently, the most oversold crypto is HackenAI, with an RSI reading of 14. This suggests that there might be a good buying opportunity for HAI.
What is a good liquidity ratio? ›In short, a “good” liquidity ratio is anything higher than 1. Having said that, a liquidity ratio of 1 is unlikely to prove that your business is worthy of investment. Generally speaking, creditors and investors will look for an accounting liquidity ratio of around 2 or 3.
Does adding liquidity increase price? ›Liquidity is important for all tradable assets including cryptocurrencies. Low liquidity levels mean that market volatility is present, causing spikes in cryptocurrency prices. High liquidity, on the other hand, means there is a stable market, with few fluctuations in price.
How do you know if a coin is liquidity locked? ›Look up the page with the liquidity addition details. Click on the TX hash, then head to the part where you can see the liquidity pool tokens transferred to the developer's wallet. Check the wallet to look at the LP holdings of the developer. Confirm that it is zero.
What is the most profitable token? ›- Wall Street Memes – A popular meme crypto with renowned developers. ...
- Ecoterra – Combating climate change through a unique Recycle2Earn eco-friendly app. ...
- yPredict – Profitable coin for traders and trading analysts offering large staking rewards.
JasmyCoin Historical
In the past 24 hours, the crypto has increased by $0.00020 in its current value. For the last 7 days, JASMY has been in a good upward trend, thus increasing by 10.78%. JasmyCoin has shown very strong potential lately, and this could be a good opportunity to dig right in and invest.
What gives tokens value? ›
Cryptocurrency gains value when demand rises higher than supply. The supply mechanism of a cryptocurrency is always known; each crypto publishes its token minting and burning plans.
How do I collect airdrops? ›In a standard crypto airdrop, participants interested in receiving an airdrop simply express their interest in order to receive the airdrop. The individual must provide a valid wallet address, and some airdrops require no additional information beyond this.
Can I receive airdrops? ›How to accept AirDrop. When someone shares something with you using AirDrop, you see an alert with a preview. You can tap Accept or Decline. If you tap Accept, the AirDrop will come through within the same app it was sent from.
What is the difference between arbitrum and polygon? ›Polygon vs Arbitrum: The Differences Between Them
The main difference between Polygon and Arbitrum is their security. Arbitrum doesn't have its own coin and Ethereum's base layer is what secures it. Polygon differs in the way it's secured since it uses its own “Proof of Stake” which is a consensus mechanism.
Go to CoinMarketCap and search for Arbitrum (IOU). Tap on the button labeled “Market” near the price chart. In this view, you will see a complete list of places you can purchase Arbitrum (IOU) as well as the currencies you can use to obtain it.
What wallet to use for arbitrum? ›Download Trust Wallet for Arbitrum (ARETH) The mobile app works with several crypto tokens and blockchain wallets. With Trust Wallet, you are in control over your funds. Receive, send, store and exchange your cryptocurrency within the mobile interface.
Can you buy ETH directly on Arbitrum? ›Buy ETH and USDC directly on your Arbitrum wallet at the best prices, cash out funds at any time back on your bank account in 171 countries.
How to convert arbitrum to USD? ›Convert Arbitrum to USD Coin
The current conversion is 1 ARB to 0.95 USDC. The value of 1 Arbitrum is +1.01% against the value of USDC in the last 24 hours. The exchange rate between Arbitrum and USDC is -19.71% in the last month. Create a free Kraken account to instantly convert ARB to USDC today.
How much is 800 US Dollar in Ethereum? 800 US Dollar is 0.460253 Ethereum.
How much is $1000 USD in ETH? ›How much is 1000 US Dollar in Ethereum? 1000 US Dollar is 0.536705 Ethereum.
Which NFT marketplace has raised $50 million? ›
The popular NFT marketplace Zora received a huge boost this week, raising $50 million in series funding.
Which is the highest NFT profit? ›- 1- The Merge – $91 800 000.
- 2- Beeple Collection _ Every day: The First Five Thousand Days – $69 346 250.
- 3- Clock – $52 740 000.
- 4- Human One – $28 985 000. ...
- 5- CryptoPunk #5822 – $23 700 000.
- 6- CryptoPunk #7523 – $11 800 000.
- 7- CryptoPunk #4156 – $10 350 000.
- Batsoupyum. He is one of the biggest collectors in recent times of SuperRare. ...
- Basileus. We could say that he seeks art above all things. ...
- BabyBeluga. Few collectors have the level of quality that Belunga has within his collection. ...
- Caktux. ...
- Seedphrase. ...
- Illestrater. ...
- Mondoir. ...
- Path.
The best bridge to Arbitrum is Synapse. Synapse is a cross-chain bridging platform that supports over 100 tokens on 17 different chains, including Arbitrum and Ethereum. It offers the lowest fees and fastest transaction speeds compared to other bridging platforms such as Arbitrum Bridge, Stargate Finance, and AnySwap.
What are the gas fees on arbitrum? ›One difference is that unlike on Ethereum, Arbitrum chains enforce a gas price floor, currently 0.1 gwei on Arbitrum One and 0.01 gwei on Nova (See Gas).
Does arbitrum use ETH for gas? ›For the token bridge, you can deposit funds to the Arbitrum network after you've connected your Web3 wallet. It takes about 10 minutes for deposits to clear. You'll have to pay an Ethereum gas fee—at Ethereum's rates. To deposit under a cent of ETH to Arbitrum, MetaMask wallet quoted us $5.41 in gas fees.
How do I check my top token holders on Etherscan? ›Clicking on the ⓘ button next to the token symbol will bring out the token's burn event history (refer to this token page for an example). Holders: This shows the total number of addresses that hold the token.
How do I find top holders in Etherscan? ›Step 2: Click on Token Tracker on the Etherscan Project Contract Page Then Select the Holders Tab. Next, click on the Holders tab. This allows you to see the total number of holders, 5,946, and the top 1,000 holders, their wallet addresses, and how many NFT assets they own in the project.
What is a coin holder called? ›A coin dispenser (or coin changer or money changer) is a device that changes or dispenses coins.
How do I check my ERC 20 tokens? ›In the first tab, 'Transaction History', you will find a list of all your recent transactions. In the 'ERC20 Tokens' tab, you can find your token balances. When looking for custom token information, this is where you can select a specific token to find its contract address, decimal count, and symbol.
How do I check my locked liquidity on Etherscan? ›
Head to bscscan.com if it is a BSC token, solscan.io if it is a Solana-based token, or ether scan if it is an Ethereum-based token. Look up the page with the liquidity addition details. Click on the TX hash, then head to the part where you can see the liquidity pool tokens transferred to the developer's wallet.
How do I see all ERC20 tokens? ›- Prerequisites Before getting started, make sure you have the following ready:
- Step 1: Setup Moralis First register your Moralis account and get your Moralis API Key. ...
- Step 2: Get all ERC20 tokens owned by an address ...
- Step 3: Run the script ...
- API Reference ...
- Support
- Get the Etherscan API Key.
- Obtain the Etherscan API endpoint URL.
- Install the Amigo Data add-on.
- Import the Etherscan data.
- Vitalik Buterin: ~240,000 ETH. ...
- Beacon Chain Contract: ~18 million ETH. ...
- Binance: ~4.4 million ETH. ...
- Wrapped ETH Contract: ~3.7 million ETH. ...
- Kraken: ~1.7 million ETH. ...
- Unknown Fund: ~1.6 million ETH. ...
- Arbitrum Bridge: ~1 million ETH. ...
- Bitfinex: ~1 million ETH.
1) USER-TO-EXCHANGE TRANSFERS (DEPOSIT)
The transaction details can be found on Etherscan, where the transaction hash and the wallets involved in the transaction are included.
You should avoid long term storage with materials that contain polyvinyl chlorides (PVCs), since these chemicals can discolor coins. PVC-containing plastics tend to be flexible and strong, so it's better to choose rigid plastic containers for coins. Avoid storing coins in plastic bags.
Why not store coins in PVC? ›As it degrades, PVC will become yellow, cloudy and brittle, off-gassing acids into the storage environment. This may lead to a green, sometimes sticky residue on coins, with possible permanent staining and corrosion making the coin's value reduce considerably.
What do coin collectors call each side of a coin? ›Obverse (heads) is the front of the coin and the reverse (tails) is the back. Edge is the outer surface, which can have lettering, reeding, or be plain.
What is the best material for storing coins? ›For high-value coins, use hard plastic holders. Professional coin grading services use sealed holders called slabs to protect authenticated and graded coins. Use acid-free cardboard and plastic holders free from polyvinyl chloride (PVC). Acid and PVC can ruin a coin's surface.
What is a coin flip holder? ›Coin flips make quickly storing coins effortless, yet safe and secure because they are PVC free and archival safe. To use a coin flip just insert a coin and fold over, that's it.