Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x401c2f3712396ec6e11f7c7f87526dfb7c9fe8137323a4cbd0403176d625b26e | 0x60806040 | 16417388 | 12 days 11 hrs ago | 0xdd5cf30f56c37d3243a23543dc5bd5ee576970e2 | IN | Create: MainStakingJoe | 0 AVAX | 0.09874007325 |
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
MainStakingJoe
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "IERC20.sol"; import "Initializable.sol"; import "OwnableUpgradeable.sol"; import "IJoeStaking.sol"; import "IBaseRewardPool.sol"; import "IPoolHelper.sol"; import "IMintableERC20.sol"; import "IMasterChefVTX.sol"; import "IxJoe.sol"; import "IMasterJoe.sol"; import "IWavax.sol"; import "poolHelperJoe.sol"; library PoolHelperJoeFactoryLib { function createPoolHelper( uint256 _pid, address _stakingToken, address _depositToken, address _mainStaking, address _masterVtx, address _rewarder, address _xjoe, address _router ) public returns (address) { PoolHelperJoe pool = new PoolHelperJoe( _pid, _stakingToken, _depositToken, _mainStaking, _masterVtx, _rewarder, _xjoe, _router ); return address(pool); } } import "MintableERC20.sol"; library ERC20FactoryLib { function createERC20(string memory name_, string memory symbol_) public returns (address) { ERC20 token = new MintableERC20(name_, symbol_); return address(token); } } /// @title MainStaking /// @author Vector Team /// @notice Mainstaking is the contract that interacts with ALL Joe contract /// @dev all functions except harvest are restricted either to owner or to other contracts from the vector protocol /// @dev the owner of this contract holds a lot of power, and should be owned by a multisig contract MainStakingJoe is Initializable, OwnableUpgradeable { using SafeERC20 for IERC20; // Addresses address public stakingJoe; address public joe; address public xJoe; address public veJoe; address public masterJoe; address public masterVtx; address public router; // Fees uint256 constant FEE_DENOMINATOR = 10000; uint256 public constant MAX_FEE = 3000; uint256 public CALLER_FEE; uint256 public constant MAX_CALLER_FEE = 500; uint256 public totalFee; struct Fees { uint256 maxValue; uint256 minValue; uint256 value; address to; bool isJoe; bool isAddress; bool isActive; } Fees[] public feeInfos; struct Pool { uint256 pid; bool isActive; address token; address receiptToken; address rewarder; address helper; } mapping(address => Pool) public pools; mapping(address => address) public tokenToAvaxPool; bool public boostBufferActivated; bool public bypassBoostWait; mapping(address => address[]) public assetToBonusRewards; address public constant WAVAX = 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7; event AddFee(address to, uint256 value, bool isJoe, bool isAddress); event SetFee(address to, uint256 value); event RemoveFee(address to); event veJoeClaimed(uint256 amount); event JoeHarvested(uint256 amount, uint256 callerFee); event RewardPaidTo(address to, address rewardToken, uint256 feeAmount); event NewJoeStaked(uint256 amount); event PoolAdded(address tokenAddress); event PoolRemoved(address _token); event PoolHelperSet(address _token); event PoolRewarderSet(address token, address _poolRewarder); event MasterChiefSet(address _token); event MasterJoeSet(address _token); function __MainStakingJoe_init( address _joe, address _boostedMasterChefJoe, address _masterVtx, address _veJoe, address _router, address _stakingJoe, uint256 _callerFee ) public initializer { __Ownable_init(); // Address of the joe Token joe = _joe; // Address of the MasterChefJoe for depositing lp tokens masterJoe = _boostedMasterChefJoe; masterVtx = _masterVtx; CALLER_FEE = _callerFee; totalFee = _callerFee; veJoe = _veJoe; router = _router; stakingJoe = _stakingJoe; } /// @notice set the vJoe address /// @dev can only be called once /// @param _xJoe the vJoe address function setXJoe(address _xJoe) external onlyOwner { require(xJoe == address(0), "xJoe already set"); xJoe = _xJoe; } function boosterThreshold() public view returns (uint256) { return IJoeStaking(stakingJoe).speedUpThreshold(); } /// @notice This function adds a fee to the vector protocol /// @dev the value of the fee must match the max fee requirement /// @param max the maximum value for that fee /// @param min the minimum value for that fee /// @param value the initial value for that fee /// @param to the address or contract that receives the fee /// @param isJoe true if the fee is sent as Joe, otherwise it will be xJoe /// @param isAddress true if the receiver is an address, otherwise it's a BaseRewarder function addFee( uint256 max, uint256 min, uint256 value, address to, bool isJoe, bool isAddress ) external onlyOwner { require(to != address(0), "No fees to address 0"); require(totalFee + value <= MAX_FEE, "Max fee reached"); require(min <= value && value <= max, "Value not in range"); feeInfos.push( Fees({ maxValue: max, minValue: min, value: value, to: to, isJoe: isJoe, isAddress: isAddress, isActive: true }) ); totalFee += value; emit AddFee(to, value, isJoe, isAddress); } function setBufferStatus(bool status) public onlyOwner { boostBufferActivated = status; } function setBypassBoostWait(bool status) public onlyOwner { bypassBoostWait = status; } /// @notice change the value of some fee /// @dev the value must be between the min and the max specified when registering the fee /// @dev the value must match the max fee requirements /// @param index the index of the fee in the fee list /// @param value the new value of the fee function setFee(uint256 index, uint256 value) external onlyOwner { Fees storage fee = feeInfos[index]; require(fee.isActive, "Cannot change an deactivated fee"); require(fee.minValue <= value && value <= fee.maxValue, "Value not in range"); require(totalFee + value - fee.value <= MAX_FEE, "Max fee reached"); totalFee = totalFee - fee.value + value; fee.value = value; emit SetFee(fee.to, value); } /// @notice remove some fee /// @param index the index of the fee in the fee list function removeFee(uint256 index) external onlyOwner { Fees storage fee = feeInfos[index]; totalFee -= fee.value; fee.isActive = false; emit RemoveFee(fee.to); } /// @notice set the caller fee /// @param value the value of the caller fee function setCallerFee(uint256 value) external onlyOwner { require(value <= MAX_CALLER_FEE, "Value too high"); // Check if the fee delta does not make the total fee go over the limit totalFee = totalFee + value - CALLER_FEE; require(totalFee <= MAX_FEE, "MAX Fee reached"); CALLER_FEE = value; } /// @notice deposit lp in a Joe pool /// @dev this function can only be called by a PoolHelper /// @param token the token to deposit /// @param amount the amount to deposit function deposit(address token, uint256 amount) external { // Get information of the pool of the token Pool storage poolInfo = pools[token]; //Requirements require(poolInfo.isActive, "Pool not active"); require(msg.sender == poolInfo.helper, "Only helper can deposit"); IERC20(token).safeTransferFrom(poolInfo.helper, address(this), amount); // Deposit to masterJoe Contract _approveTokenIfNeeded(token, masterJoe, amount); IMasterJoe(masterJoe).deposit(poolInfo.pid, amount); IMintableERC20(poolInfo.receiptToken).mint(poolInfo.helper, amount); } /// @notice harvest a pool from MasterJoe /// @param token the address of the token to harvest /// @param isUser true if this function is not called by the vector Contracts. The caller gets the caller fee function harvest(address token, bool isUser) public { Pool storage poolInfo = pools[token]; require(poolInfo.isActive, "Pool not active"); address[] memory bonusTokens = assetToBonusRewards[token]; uint256 bonusTokensLength = bonusTokens.length; uint256[] memory beforeBalances = new uint256[](bonusTokensLength); for (uint256 i; i < bonusTokensLength; i++) { beforeBalances[i] = IERC20(bonusTokens[i]).balanceOf(address(this)); } uint256 beforeBalance = IERC20(joe).balanceOf(address(this)); IMasterJoe(masterJoe).deposit(poolInfo.pid, 0); uint256 rewards = IERC20(joe).balanceOf(address(this)) - beforeBalance; uint256 afterFee = rewards; if (isUser && CALLER_FEE != 0) { uint256 feeAmount = (rewards * CALLER_FEE) / FEE_DENOMINATOR; _approveTokenIfNeeded(joe, xJoe, feeAmount); IxJoe(xJoe).depositFor(feeAmount, msg.sender); afterFee = afterFee - feeAmount; } sendRewards(poolInfo.token, poolInfo.rewarder, rewards, afterFee); for (uint256 i; i < bonusTokensLength; i++) { uint256 bonusBalanceDiff = IERC20(bonusTokens[i]).balanceOf(address(this)) - beforeBalances[i]; if (bonusBalanceDiff > 0) { sendOtherRewards(bonusTokens[i], poolInfo.rewarder, bonusBalanceDiff); } } emit JoeHarvested(rewards, rewards - afterFee); } /// @notice Send bonus rewards to the rewarders, don't apply platform fees /// @param token the address of the token to send rewards to /// @param rewarder the rewarder that will get tthe rewards /// @param _amount the initial amount of rewards after harvest function sendOtherRewards( address token, address rewarder, uint256 _amount ) internal { IERC20(token).approve(rewarder, _amount); IBaseRewardPool(rewarder).queueNewRewards(_amount, token); emit RewardPaidTo(rewarder, token, _amount); } /// @notice increase allowance to a contract to the maximum amount for a specific token if it is needed /// @param token the token to increase the allowance of /// @param _to the contract to increase the allowance /// @param _amount the amount of allowance that the contract needs function _approveTokenIfNeeded( address token, address _to, uint256 _amount ) private { if (IERC20(token).allowance(address(this), _to) < _amount) { IERC20(token).approve(_to, type(uint256).max); } } /// @notice Send rewards to the rewarders /// @param token the address of the token to send rewards to /// @param rewarder the rewarder that will get the rewards /// @param _amount the initial amount of rewards after harvest /// @param afterFee the amount to send to the rewarder after fees are collected function sendRewards( address token, address rewarder, uint256 _amount, uint256 afterFee ) internal { for (uint256 i = 0; i < feeInfos.length; i++) { Fees storage feeInfo = feeInfos[i]; if (feeInfo.isActive) { address rewardToken = joe; uint256 feeAmount = (_amount * feeInfo.value) / FEE_DENOMINATOR; if (!feeInfo.isJoe) { // _approveTokenIfNeeded(joe, xJoe, feeAmount); IxJoe(xJoe).depositWithoutTransferFor(feeAmount, address(this)); rewardToken = xJoe; } if (!feeInfo.isAddress) { _approveTokenIfNeeded(rewardToken, feeInfo.to, feeAmount); IBaseRewardPool(feeInfo.to).donateRewards(feeAmount, rewardToken); } else { IERC20(rewardToken).transfer(feeInfo.to, feeAmount); emit RewardPaidTo(feeInfo.to, rewardToken, feeAmount); } afterFee -= feeAmount; } } _approveTokenIfNeeded(joe, rewarder, afterFee); IBaseRewardPool(rewarder).queueNewRewards(afterFee, joe); } /// @notice Send Unusual rewards to the rewarders, as airdrops /// @dev fees are not collected /// @param _token the address of the token to send /// @param _rewarder the rewarder that will get the rewards function sendTokenRewards(address _token, address _rewarder) external onlyOwner { // require(_token != joe, "not authorized"); // require(!pools[_token].isActive, "Not authorized"); uint256 amount = IERC20(_token).balanceOf(address(this)); _approveTokenIfNeeded(_token, _rewarder, amount); IBaseRewardPool(_rewarder).queueNewRewards(amount, _token); } /// @notice Send Unusual rewards to the rewarders, as airdrops /// @dev fees are not collected /// @param _token the address of the token to send /// @param _rewarder the rewarder that will get the rewards function donateTokenRewards(address _token, address _rewarder) external onlyOwner { // require(_token != joe, "not authorized"); // require(!pools[_token].isActive, "Not authorized"); uint256 amount = IERC20(_token).balanceOf(address(this)); _approveTokenIfNeeded(_token, _rewarder, amount); IBaseRewardPool(_rewarder).donateRewards(amount, _token); } /// @notice withdraw from a Joe pool /// @dev Only a PoolHelper can call this function /// @param token the address of the pool token from which to withdraw /// @param _amount the initial amount of tokens to withdraw function withdraw(address token, uint256 _amount) external { // _amount is the amount of stable Pool storage poolInfo = pools[token]; require(msg.sender == poolInfo.helper, "Only helper can withdraw"); IMintableERC20(poolInfo.receiptToken).burn(msg.sender, _amount); IMasterJoe(masterJoe).withdraw(poolInfo.pid, _amount); IERC20(token).safeTransfer(poolInfo.helper, _amount); } function stakeJoeOwner(uint256 _amount) external onlyOwner { _stakeJoe(_amount); } function boostEndDate() public view returns (uint256 date) { (, , , date) = IJoeStaking(stakingJoe).userInfos(address(this)); } function joeBalance() public view returns (uint256) { return IERC20(joe).balanceOf(address(this)); } function remainingForBoost() public view returns (uint256) { uint256 stakedJoe = getStakedJoe(); uint256 balance = joeBalance(); uint256 threshold = (stakedJoe * boosterThreshold()) / 100; if (balance >= threshold + 1 ether) { return 0; } return threshold + 1 ether - balance; } function stakeJoe(uint256 _amount) public { uint256 amount = _amount; if (boostBufferActivated == false) { _stakeJoe(amount); return; } uint256 neededForBoost = remainingForBoost(); if (neededForBoost == 0) { uint256 balance = joeBalance(); if ((block.timestamp > boostEndDate()) || bypassBoostWait) { _stakeJoe(balance); } else { uint256 stakedJoe = getStakedJoe(); uint256 threshold = (stakedJoe * boosterThreshold()) / 100; _stakeJoe(((balance - threshold) * (100 - boosterThreshold())) / 100); } } else { claimVeJoe(); } } /// @notice stake Joe /// @param amount the number of Joe to stake /// @dev the Joe must already be in the contract function _stakeJoe(uint256 amount) internal { if (amount > 0) { uint256 veJoeAmount = getPendingVeJoe(); _approveTokenIfNeeded(joe, stakingJoe, amount); IJoeStaking(stakingJoe).deposit(amount); emit veJoeClaimed(veJoeAmount); } emit NewJoeStaked(amount); } /// @notice Claim the pending veJoe function claimVeJoe() public { uint256 amount = getPendingVeJoe(); if (amount > 0) { IJoeStaking(stakingJoe).claim(); } emit veJoeClaimed(amount); } /// @notice gets the pending veJoe function getPendingVeJoe() public view returns (uint256 pending) { pending = IJoeStaking(stakingJoe).getPendingVeJoe(address(this)); } /// @notice gets the number of staked Joe by this contract function getStakedJoe() public view returns (uint256 stakedJoe) { (stakedJoe, , , ) = IJoeStaking(stakingJoe).userInfos(address(this)); } /// @notice get the number of veJoe of this contract function getVeJoe() external view returns (uint256) { return IERC20(veJoe).balanceOf(address(this)); } /// @notice Register a new pool of Joe /// @dev this function will deploy a new PoolHelper, and add the pool to the masterVTX /// @param _pid the pid of the pool /// @param _token the token to stake in the pool /// @param receiptName the name of the receipt Token /// @param receiptSymbol the symbol of the receipt Token /// @param allocPoints the weight of the VTX allocation function registerPool( uint256 _pid, address _token, string memory receiptName, string memory receiptSymbol, uint256 allocPoints ) external onlyOwner { require(pools[_token].isActive == false, "Pool is already registered and active"); IERC20 newToken = IERC20(ERC20FactoryLib.createERC20(receiptName, receiptSymbol)); address rewarder = IMasterChefVTX(masterVtx).createRewarder( address(newToken), address(joe) ); IPoolHelper helper = IPoolHelper( PoolHelperJoeFactoryLib.createPoolHelper( _pid, address(newToken), address(_token), address(this), address(masterVtx), address(rewarder), address(xJoe), router ) ); IMasterChefVTX(masterVtx).add( allocPoints, address(newToken), address(rewarder), address(helper) ); pools[_token] = Pool({ pid: _pid, isActive: true, token: _token, receiptToken: address(newToken), rewarder: address(rewarder), helper: address(helper) }); emit PoolAdded(_token); } /// @notice Get the information of a pool /// @param _address the address of the deposit token to fetch information for /// @return pid the pid of the pool /// @return isActive true if the pool is active /// @return token the deposit Token /// @return receipt - the address of the receipt token of this pool /// @return rewardsAddr the address of the rewarder /// @return helper the address of the poolHelper function getPoolInfo(address _address) external view returns ( uint256 pid, bool isActive, address token, address receipt, address rewardsAddr, address helper ) { Pool storage tokenInfo = pools[_address]; pid = tokenInfo.pid; isActive = tokenInfo.isActive; token = tokenInfo.token; receipt = tokenInfo.receiptToken; rewardsAddr = tokenInfo.rewarder; helper = tokenInfo.helper; } function removePool(address token) external onlyOwner { pools[token].isActive = false; emit PoolRemoved(token); } function setPoolHelper(address token, address _poolhelper) external onlyOwner { Pool storage poolInfo = pools[token]; poolInfo.helper = _poolhelper; emit PoolHelperSet(token); } function setPoolRewarder(address token, address _poolRewarder) external onlyOwner { Pool storage poolInfo = pools[token]; poolInfo.rewarder = _poolRewarder; emit PoolRewarderSet(token, _poolRewarder); } function setMasterChief(address _masterVtx) external onlyOwner { masterVtx = _masterVtx; emit MasterChiefSet(_masterVtx); } function setMasterJoe(address _masterJoe) external onlyOwner { masterJoe = _masterJoe; emit MasterJoeSet(_masterJoe); } function addBonusRewardForAsset(address _asset, address _bonusToken) external onlyOwner { assetToBonusRewards[_asset].push(_bonusToken); } receive() external payable { IWAVAX(WAVAX).deposit{value: address(this).balance}(); } uint256[40] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "ContextUpgradeable.sol"; import "Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { __Context_init_unchained(); } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IJoeStaking { function deposit(uint256 _amount) external; function withdraw(uint256 _amount) external; function claim() external; function getPendingVeJoe(address _user) external view returns (uint256); function userInfos(address _user) external view returns ( uint256, uint256, uint256, uint256 ); function speedUpThreshold() external view returns(uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IBaseRewardPool { struct Reward { address rewardToken; uint256 rewardPerTokenStored; uint256 queuedRewards; uint256 historicalRewards; } function rewards(address token) external view returns (Reward memory rewardInfo); function rewardTokens() external view returns (address[] memory); function getStakingToken() external view returns (address); function getReward(address _account) external returns (bool); function rewardDecimals(address token) external view returns (uint256); function stakingDecimals() external view returns (uint256); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function rewardPerToken(address token) external view returns (uint256); function updateFor(address account) external; function earned(address account, address token) external view returns (uint256); function stakeFor(address _for, uint256 _amount) external returns (bool); function withdrawFor( address user, uint256 amount, bool claim ) external; function queueNewRewards(uint256 _rewards, address token) external returns (bool); function donateRewards(uint256 _amountReward, address _rewardToken) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IPoolHelper { function totalSupply() external view returns (uint256); function balance(address _address) external view returns (uint256); function depositTokenBalance() external view returns (uint256); function rewardPerToken() external view returns (uint256); function harvest() external; function update() external; function earned() external view returns (uint256 vtxAmount, uint256 ptpAmount); function deposit(uint256 amount) external; function stake(uint256 amount) external; function withdraw(uint256 amount, uint256 minimumAmount) external; function getReward() external; function pendingPTP() external view returns (uint256 pendingTokens); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IMintableERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function mint(address, uint256) external; function faucet(uint256) external; function burn(address, uint256) external; /** * @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 ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMasterChefVTX { function poolLength() external view returns (uint256); function setPoolManagerStatus(address _address, bool _bool) external; function add( uint256 _allocPoint, address _lpToken, address _rewarder, address _helper ) external; function set( address _lp, uint256 _allocPoint, address _rewarder, address _locker, bool overwrite ) external; function createRewarder(address _lpToken, address mainRewardToken) external returns (address); // View function to see pending VTXs on frontend. function getPoolInfo(address token) external view returns ( uint256 emission, uint256 allocpoint, uint256 sizeOfPool, uint256 totalPoint ); function pendingTokens( address _lp, address _user, address token ) external view returns ( uint256 pendingVTX, address bonusTokenAddress, string memory bonusTokenSymbol, uint256 pendingBonusToken ); function rewarderBonusTokenInfo(address _lp) external view returns (address bonusTokenAddress, string memory bonusTokenSymbol); function massUpdatePools() external; function updatePool(address _lp) external; function deposit(address _lp, uint256 _amount) external; function depositFor( address _lp, uint256 _amount, address sender ) external; function lock( address _lp, uint256 _amount, uint256 _index, bool force ) external; function unlock( address _lp, uint256 _amount, uint256 _index ) external; function multiUnlock( address _lp, uint256[] calldata _amount, uint256[] calldata _index ) external; function withdraw(address _lp, uint256 _amount) external; function withdrawFor( address _lp, uint256 _amount, address _sender ) external; function multiclaim(address[] memory _lps, address user_address) external; function emergencyWithdraw(address _lp, address sender) external; function updateEmissionRate(uint256 _vtxPerSec) external; function depositInfo(address _lp, address _user) external view returns (uint256 depositAmount); function setPoolHelper( address _lp, address _helper ) external; function authorizeLocker(address _locker) external; function lockFor( address _lp, uint256 _amount, uint256 _index, address _for, bool force ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IxJoe { function mainContract() external view returns (address); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function symbol() external view returns (string memory); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function depositFor(uint256 amount, address to) external; function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function depositWithoutTransferFor(uint256 _amount, address _for) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMasterJoe { function deposit(uint256 _pid, uint256 amount) external; function withdraw(uint256 _pid, uint256 amount) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.5.0; interface IWAVAX { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "poolHelperJoe.sol"; library PoolHelperJoeFactoryLib { function createPoolHelper( uint256 _pid, address _stakingToken, address _depositToken, address _mainStaking, address _masterVtx, address _rewarder, address _xjoe, address _router ) public returns (address) { PoolHelperJoe pool = new PoolHelperJoe( _pid, _stakingToken, _depositToken, _mainStaking, _masterVtx, _rewarder, _xjoe, _router ); return address(pool); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "SafeERC20.sol"; import "IBaseRewardPool.sol"; import "IMainStakingJoe.sol"; import "IMasterChefVTX.sol"; import "IJoeRouter02.sol"; import "IJoePair.sol"; import "IWavax.sol"; /// @title Poolhelper /// @author Vector Team /// @notice This contract is the main contract that user will intreact with in order to stake stable in Vector protocol contract PoolHelperJoe { using SafeERC20 for IERC20; address public depositToken; address public constant wavax = 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7; address public immutable stakingToken; address public immutable xJoe; address public immutable masterVtx; address public immutable joeRouter; address public immutable mainStakingJoe; address public immutable rewarder; uint256 public immutable pid; bool public immutable isWavaxPool; address public tokenA; address public tokenB; uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status = 1; event NewDeposit(address indexed user, uint256 amount); event NewWithdraw(address indexed user, uint256 amount); constructor( uint256 _pid, address _stakingToken, address _depositToken, address _mainStakingJoe, address _masterVtx, address _rewarder, address _xJoe, address _joeRouter ) { pid = _pid; stakingToken = _stakingToken; depositToken = _depositToken; mainStakingJoe = _mainStakingJoe; masterVtx = _masterVtx; rewarder = _rewarder; xJoe = _xJoe; tokenA = IJoePair(depositToken).token0(); tokenB = IJoePair(depositToken).token1(); isWavaxPool = (tokenA == wavax || tokenB == wavax); joeRouter = _joeRouter; } modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } function totalSupply() public view returns (uint256) { return IBaseRewardPool(rewarder).totalSupply(); } /// @notice get the amount of reward per token deposited by a user /// @param token the token to get the number of rewards /// @return the amount of claimable tokens function rewardPerToken(address token) public view returns (uint256) { return IBaseRewardPool(rewarder).rewardPerToken(token); } /// @notice get the total amount of shares of a user /// @param _address the user /// @return the amount of shares function balanceOf(address _address) public view returns (uint256) { return IBaseRewardPool(rewarder).balanceOf(_address); } modifier _harvest() { IMainStakingJoe(mainStakingJoe).harvest(depositToken, false); _; } /// @notice harvest pending Joe and get the caller fee function harvest() public { IMainStakingJoe(mainStakingJoe).harvest(depositToken, true); IERC20(xJoe).safeTransfer(msg.sender, IERC20(xJoe).balanceOf(address(this))); } /// @notice get the total amount of rewards for a given token for a user /// @param token the address of the token to get the number of rewards for /// @return vtxAmount the amount of VTX ready for harvest /// @return tokenAmount the amount of token inputted function earned(address token) public view returns (uint256 vtxAmount, uint256 tokenAmount) { (vtxAmount, , , tokenAmount) = IMasterChefVTX(masterVtx).pendingTokens( stakingToken, msg.sender, token ); } /// @notice stake the receipt token in the masterchief of VTX on behalf of the caller function _stake(uint256 _amount) internal { _approveTokenIfNeeded(stakingToken, masterVtx, _amount); IMasterChefVTX(masterVtx).depositFor(stakingToken, _amount, msg.sender); } /// @notice unstake from the masterchief of VTX on behalf of the caller function _unstake(uint256 _amount) internal { IMasterChefVTX(masterVtx).withdrawFor(stakingToken, _amount, msg.sender); } function _deposit(uint256 _amount) internal { _approveTokenIfNeeded(depositToken, mainStakingJoe, _amount); IMainStakingJoe(mainStakingJoe).deposit(depositToken, _amount); } /// @notice deposit lp in mainStakingJoe, autostake in masterchief of VTX /// @dev performs a harvest of Joe just before depositing /// @param amount the amount of lp tokens to deposit function deposit(uint256 amount) external _harvest { IERC20(depositToken).safeTransferFrom(msg.sender, address(this), amount); _deposit(amount); _stake(amount); emit NewDeposit(msg.sender, amount); } /// @notice increase allowance to a contract to the maximum amount for a specific token if it is needed /// @param token the token to increase the allowance of /// @param _to the contract to increase the allowance /// @param _amount the amount of allowance that the contract needs function _approveTokenIfNeeded( address token, address _to, uint256 _amount ) private { if (IERC20(token).allowance(address(this), _to) < _amount) { IERC20(token).approve(_to, type(uint256).max); } } /// @notice convert tokens to lp tokens /// @param amountA amount of the first token we want to convert /// @param amountB amount of the second token we want to convert /// @param amountAMin minimum amount of the first token we want to convert /// @param amountBMin minimum amount of the second token we want to convert /// @return amountAConverted amount of the first token converted during the operation of adding liquidity to the pool /// @return amountBConverted amount of the second token converted during the operation of adding liquidity to the pool /// @return liquidity amount of lp tokens minted during the operation of adding liquidity to the pool function _createLPTokens( uint256 amountA, uint256 amountB, uint256 amountAMin, uint256 amountBMin ) internal returns ( uint256 amountAConverted, uint256 amountBConverted, uint256 liquidity ) { _approveTokenIfNeeded(tokenA, joeRouter, amountA); _approveTokenIfNeeded(tokenB, joeRouter, amountB); (amountAConverted, amountBConverted, liquidity) = IJoeRouter01(joeRouter).addLiquidity( tokenA, tokenB, amountA, amountB, amountAMin, amountBMin, address(this), block.timestamp ); } /// @notice Add liquidity and then deposits lp in mainStakingJoe, autostake in masterchief of VTX /// @dev performs a harvest of Joe just before depositing /// @param amountA the desired amount of token A to deposit /// @param amountB the desired amount of token B to deposit /// @param amountAMin the minimum amount of token B to get back /// @param amountBMin the minimum amount of token B to get back /// @param isAvax is the token actually native ether ? /// @return amountAConverted the amount of token A actually converted /// @return amountBConverted the amount of token B actually converted /// @return liquidity the amount of LP obtained function addLiquidityAndDeposit( uint256 amountA, uint256 amountB, uint256 amountAMin, uint256 amountBMin, bool isAvax ) external payable nonReentrant _harvest returns ( uint256 amountAConverted, uint256 amountBConverted, uint256 liquidity ) { if (isAvax && isWavaxPool) { uint256 amountWavax = (tokenA == wavax) ? amountA : amountB; require(amountWavax <= msg.value, "Not enough AVAX"); IWAVAX(wavax).deposit{value: msg.value}(); (address token, uint256 amount) = (tokenA == wavax) ? (tokenB, amountB) : (tokenA, amountA); IERC20(token).safeTransferFrom(msg.sender, address(this), amount); } else { IERC20(tokenA).safeTransferFrom(msg.sender, address(this), amountA); IERC20(tokenB).safeTransferFrom(msg.sender, address(this), amountB); } (amountAConverted, amountBConverted, liquidity) = _createLPTokens( amountA, amountB, amountAMin, amountBMin ); _deposit(liquidity); _stake(liquidity); IERC20(tokenB).safeTransfer(msg.sender, amountB - amountBConverted); IERC20(tokenA).safeTransfer(msg.sender, amountA - amountAConverted); emit NewDeposit(msg.sender, liquidity); } /// @notice stake the receipt token in the masterchief of VTX on behalf of the caller function stake(uint256 _amount) external { IERC20(stakingToken).safeTransferFrom(msg.sender, address(this), _amount); _approveTokenIfNeeded(stakingToken, masterVtx, _amount); IMasterChefVTX(masterVtx).depositFor(stakingToken, _amount, msg.sender); } function _withdraw(uint256 amount) internal { _unstake(amount); IMainStakingJoe(mainStakingJoe).withdraw(depositToken, amount); } /// @notice withdraw stables from mainStakingJoe, auto unstake from masterchief of VTX /// @dev performs a harvest of Joe before withdrawing /// @param amount the amount of LP tokens to withdraw function withdraw(uint256 amount) external _harvest nonReentrant { _withdraw(amount); IERC20(depositToken).safeTransfer(msg.sender, amount); emit NewWithdraw(msg.sender, amount); } /// @notice withdraw stables from mainStakingJoe, auto unstake from masterchief of VTX /// @dev performs a harvest of Joe before withdrawing /// @param amount the amount of stables to deposit /// @param amountAMin the minimum amount of token A to get back /// @param amountBMin the minimum amount of token B to get back /// @param isAvax is the token actually native ether ? function withdrawAndRemoveLiquidity( uint256 amount, uint256 amountAMin, uint256 amountBMin, bool isAvax ) external _harvest nonReentrant { _withdraw(amount); _approveTokenIfNeeded(depositToken, joeRouter, amount); _approveTokenIfNeeded(depositToken, depositToken, amount); if (isAvax && isWavaxPool) { (address token, uint256 amountTokenMin, uint256 amountAVAXMin) = tokenA == wavax ? (tokenB, amountBMin, amountAMin) : (tokenA, amountAMin, amountBMin); IJoeRouter02(joeRouter).removeLiquidityAVAX( token, amount, amountTokenMin, amountAVAXMin, msg.sender, block.timestamp ); } else { IJoeRouter02(joeRouter).removeLiquidity( tokenA, tokenB, amount, amountAMin, amountBMin, msg.sender, block.timestamp ); } emit NewWithdraw(msg.sender, amount); } /// @notice Harvest VTX and Joe rewards function getReward() external _harvest { IMasterChefVTX(masterVtx).depositFor(stakingToken, 0, msg.sender); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "IERC20.sol"; import "Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMainStakingJoe { function setXJoe(address _xJoe) external; function addFee( uint256 max, uint256 min, uint256 value, address to, bool isJoe, bool isAddress ) external; function setFee(uint256 index, uint256 value) external; function removeFee(uint256 index) external; function setCallerFee(uint256 value) external; function deposit(address token, uint256 amount) external; function harvest(address token, bool isUser) external; function sendTokenRewards(address _token, address _rewarder) external; function donateTokenRewards(address _token, address _rewarder) external; function withdraw(address token, uint256 _amount) external; function stakeJoe(uint256 amount) external; function stakeOrBufferJoe(uint256 amount) external; function stakeAllJoe() external; function claimVeJoe() external; function getStakedJoe() external view returns (uint256 stakedJoe); function getVeJoe() external view returns (uint256); function registerPool( uint256 _pid, address _token, string memory receiptName, string memory receiptSymbol, uint256 allocPoints ) external; function getPoolInfo(address _address) external view returns ( uint256 pid, bool isActive, address token, address receipt, address rewards_addr, address helper ); function removePool(address token) external; function setPoolHelper(address token, address _poolhelper) external; function setPoolRewarder(address token, address _poolRewarder) external; function setMasterChief(address _masterVtx) external; function setMasterJoe(address _masterJoe) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.2; import "IJoeRouter01.sol"; interface IJoeRouter02 is IJoeRouter01 { function removeLiquidityAVAXSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external returns (uint256 amountAVAX); function removeLiquidityAVAXWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountAVAX); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactAVAXForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForAVAXSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; interface IJoeRouter01 { function factory() external pure returns (address); function WAVAX() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityAVAX( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountAVAX, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityAVAX( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountAVAX); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityAVAXWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountAVAX); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactAVAXForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactAVAX( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForAVAX( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapAVAXForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IJoePair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "MintableERC20.sol"; library ERC20FactoryLib { function createERC20(string memory name_, string memory symbol_) public returns (address) { ERC20 token = new MintableERC20(name_, symbol_); return address(token); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "ERC20.sol"; import "Ownable.sol"; contract MintableERC20 is ERC20, Ownable { /* The ERC20 deployed will be owned by the others contracts of the protocol, specifically by Masterchief and MainStaking, forbidding the misuse of these functions for nefarious purposes */ constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {} function mint(address account, uint256 amount) external virtual onlyOwner { _mint(account, amount); } function burn(address account, uint256 amount) external virtual onlyOwner { _burn(account, amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "IERC20.sol"; import "IERC20Metadata.sol"; import "Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 420 }, "libraries": { "MainStakingJoe.sol": { "ERC20FactoryLib": "0x2ddC95E41d01DDD3268cd91A35A7bd7d0849d7Fc", "PoolHelperJoeFactoryLib": "0x69CdE7a07e3FFb839Ca69F635174c725F006E98B" } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isJoe","type":"bool"},{"indexed":false,"internalType":"bool","name":"isAddress","type":"bool"}],"name":"AddFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callerFee","type":"uint256"}],"name":"JoeHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"MasterChiefSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"MasterJoeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NewJoeStaked","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":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"PoolHelperSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"PoolRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"_poolRewarder","type":"address"}],"name":"PoolRewarderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"RemoveFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"RewardPaidTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"veJoeClaimed","type":"event"},{"inputs":[],"name":"CALLER_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CALLER_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WAVAX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_joe","type":"address"},{"internalType":"address","name":"_boostedMasterChefJoe","type":"address"},{"internalType":"address","name":"_masterVtx","type":"address"},{"internalType":"address","name":"_veJoe","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_stakingJoe","type":"address"},{"internalType":"uint256","name":"_callerFee","type":"uint256"}],"name":"__MainStakingJoe_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_bonusToken","type":"address"}],"name":"addBonusRewardForAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"isJoe","type":"bool"},{"internalType":"bool","name":"isAddress","type":"bool"}],"name":"addFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetToBonusRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boostBufferActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boostEndDate","outputs":[{"internalType":"uint256","name":"date","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boosterThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bypassBoostWait","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimVeJoe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_rewarder","type":"address"}],"name":"donateTokenRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeInfos","outputs":[{"internalType":"uint256","name":"maxValue","type":"uint256"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"isJoe","type":"bool"},{"internalType":"bool","name":"isAddress","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingVeJoe","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getPoolInfo","outputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"receipt","type":"address"},{"internalType":"address","name":"rewardsAddr","type":"address"},{"internalType":"address","name":"helper","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakedJoe","outputs":[{"internalType":"uint256","name":"stakedJoe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVeJoe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"isUser","type":"bool"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"joe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterJoe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterVtx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"receiptToken","type":"address"},{"internalType":"address","name":"rewarder","type":"address"},{"internalType":"address","name":"helper","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"string","name":"receiptName","type":"string"},{"internalType":"string","name":"receiptSymbol","type":"string"},{"internalType":"uint256","name":"allocPoints","type":"uint256"}],"name":"registerPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remainingForBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"removePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_rewarder","type":"address"}],"name":"sendTokenRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setBufferStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setBypassBoostWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setCallerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterVtx","type":"address"}],"name":"setMasterChief","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterJoe","type":"address"}],"name":"setMasterJoe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_poolhelper","type":"address"}],"name":"setPoolHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_poolRewarder","type":"address"}],"name":"setPoolRewarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_xJoe","type":"address"}],"name":"setXJoe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeJoe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeJoeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingJoe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenToAvaxPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"veJoe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xJoe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50613e0e806100206000396000f3fe6080604052600436106103435760003560e01c806389c72b77116101b0578063bc109e74116100ec578063de5aa47311610095578063f3fef3a31161006f578063f3fef3a314610aa2578063f461f42814610ac2578063f6a2332014610ad7578063f887ea4014610aed57600080fd5b8063de5aa47314610a42578063f021526914610a62578063f2fde38b14610a8257600080fd5b8063c7f30654116100c6578063c7f30654146109ed578063c9b0162b14610a02578063de1ce60214610a2257600080fd5b8063bc109e741461098d578063beea574e146109ad578063c31720d5146109cd57600080fd5b8063a4063dbc11610159578063b6039cbf11610133578063b6039cbf14610917578063b985a3a014610937578063bbf4084e14610957578063bc063e1a1461097757600080fd5b8063a4063dbc14610873578063ac01ffc5146108d7578063ace1d7a1146108f757600080fd5b80639f600fd71161018a5780639f600fd71461081e578063a221245914610833578063a296454f1461085357600080fd5b806389c72b77146107c65780638da5cb5b146107e057806397ead276146107fe57600080fd5b8063509686741161027f578063638f9ee71161022857806373b295c21161020257806373b295c21461072f578063795caf7e146107575780637ca209281461077757806383199b5e1461079757600080fd5b8063638f9ee7146106ef57806364a4f07814610704578063715018a61461071a57600080fd5b806358a5038f1161025957806358a5038f1461068f5780635e09d3ca146106af57806360384fdf146106cf57600080fd5b8063509686741461063a57806352f7c9881461064f57806353aa7dcd1461066f57600080fd5b8063229a3dc2116102ec5780633b7d0946116102c65780633b7d0946146105c557806347e7ef24146105e5578063499a2818146106055780634a06c77f1461062557600080fd5b8063229a3dc21461052d5780632a5ac3f4146105425780632c7b09cb1461056257600080fd5b8063162febcf1161031d578063162febcf146104bf5780631631b194146104e15780631df4ccfc1461051757600080fd5b806301d726d4146103b75780630564d4a4146103df57806306bfa9381461041757600080fd5b366103b25773b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b15801561039757600080fd5b505af11580156103ab573d6000803e3d6000fd5b5050505050005b600080fd5b3480156103c357600080fd5b506103cc610b0d565b6040519081526020015b60405180910390f35b3480156103eb57600080fd5b506065546103ff906001600160a01b031681565b6040516001600160a01b0390911681526020016103d6565b34801561042357600080fd5b506104816104323660046138bb565b6001600160a01b039081166000908152606f602052604090208054600182015460028301546003840154600490940154929560ff83169561010090930483169491831693918316929190911690565b6040805196875294151560208701526001600160a01b03938416948601949094529082166060850152811660808401521660a082015260c0016103d6565b3480156104cb57600080fd5b506104df6104da366004613a4f565b610b8f565b005b3480156104ed57600080fd5b506103ff6104fc3660046138bb565b6070602052600090815260409020546001600160a01b031681565b34801561052357600080fd5b506103cc606d5481565b34801561053957600080fd5b506103cc610c73565b34801561054e57600080fd5b506104df61055d366004613a4f565b610cf5565b34801561056e57600080fd5b5061058261057d366004613a4f565b610d4e565b604080519788526020880196909652948601939093526001600160a01b03909116606085015215156080840152151560a0830152151560c082015260e0016103d6565b3480156105d157600080fd5b506104df6105e03660046138bb565b610db2565b3480156105f157600080fd5b506104df6106003660046139e9565b610e55565b34801561061157600080fd5b506104df610620366004613a4f565b611026565b34801561063157600080fd5b506104df611100565b34801561064657600080fd5b506103cc6111ab565b34801561065b57600080fd5b506104df61066a366004613b09565b6111dc565b34801561067b57600080fd5b506104df61068a366004613a4f565b6113d2565b34801561069b57600080fd5b506104df6106aa366004613a15565b6114c5565b3480156106bb57600080fd5b506104df6106ca3660046138bb565b611520565b3480156106db57600080fd5b506067546103ff906001600160a01b031681565b3480156106fb57600080fd5b506103cc6115b6565b34801561071057600080fd5b506103cc606c5481565b34801561072657600080fd5b506104df6115fb565b34801561073b57600080fd5b506103ff73b31f66aa3c1e785363f0875a1b74e27b85fd66c781565b34801561076357600080fd5b506103ff6107723660046139e9565b61164f565b34801561078357600080fd5b506104df610792366004613b2b565b611687565b3480156107a357600080fd5b506071546107b690610100900460ff1681565b60405190151581526020016103d6565b3480156107d257600080fd5b506071546107b69060ff1681565b3480156107ec57600080fd5b506033546001600160a01b03166103ff565b34801561080a57600080fd5b506104df6108193660046138f5565b611980565b34801561082a57600080fd5b506103cc611ad2565b34801561083f57600080fd5b506104df61084e3660046138f5565b611b57565b34801561085f57600080fd5b50606a546103ff906001600160a01b031681565b34801561087f57600080fd5b5061048161088e3660046138bb565b606f6020526000908152604090208054600182015460028301546003840154600490940154929360ff8316936001600160a01b0361010090940484169392831692918216911686565b3480156108e357600080fd5b506104df6108f23660046138f5565b611c03565b34801561090357600080fd5b506104df610912366004613a81565b611d07565b34801561092357600080fd5b506104df61093236600461392e565b612148565b34801561094357600080fd5b506066546103ff906001600160a01b031681565b34801561096357600080fd5b506104df6109723660046139bb565b61227c565b34801561098357600080fd5b506103cc610bb881565b34801561099957600080fd5b506068546103ff906001600160a01b031681565b3480156109b957600080fd5b506104df6109c83660046138bb565b61282a565b3480156109d957600080fd5b506104df6109e83660046138bb565b6128c0565b3480156109f957600080fd5b506103cc612976565b348015610a0e57600080fd5b506104df610a1d3660046138f5565b6129fa565b348015610a2e57600080fd5b506104df610a3d366004613a15565b612aab565b348015610a4e57600080fd5b506069546103ff906001600160a01b031681565b348015610a6e57600080fd5b506104df610a7d3660046138f5565b612b0d565b348015610a8e57600080fd5b506104df610a9d3660046138bb565b612b93565b348015610aae57600080fd5b506104df610abd3660046139e9565b612c49565b348015610ace57600080fd5b506103cc612da7565b348015610ae357600080fd5b506103cc6101f481565b348015610af957600080fd5b50606b546103ff906001600160a01b031681565b600080610b18611ad2565b90506000610b246111ab565b905060006064610b326115b6565b610b3c9085613cd6565b610b469190613cb4565b9050610b5a81670de0b6b3a7640000613c9c565b8210610b6a576000935050505090565b81610b7d82670de0b6b3a7640000613c9c565b610b879190613cf5565b935050505090565b607154819060ff16610ba857610ba481612dd8565b5050565b6000610bb2610b0d565b905080610c66576000610bc36111ab565b9050610bcd612976565b421180610be15750607154610100900460ff165b15610bf457610bef81612dd8565b610c60565b6000610bfe611ad2565b905060006064610c0c6115b6565b610c169084613cd6565b610c209190613cb4565b9050610c5d6064610c2f6115b6565b610c3a906064613cf5565b610c448487613cf5565b610c4e9190613cd6565b610c589190613cb4565b612dd8565b50505b50505050565b610c6e611100565b505050565b6068546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024015b60206040518083038186803b158015610cb857600080fd5b505afa158015610ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf09190613a68565b905090565b6033546001600160a01b03163314610d425760405162461bcd60e51b81526020600482018190526024820152600080516020613db983398151915260448201526064015b60405180910390fd5b610d4b81612dd8565b50565b606e8181548110610d5e57600080fd5b6000918252602090912060049091020180546001820154600283015460039093015491935091906001600160a01b0381169060ff600160a01b8204811691600160a81b8104821691600160b01b9091041687565b6033546001600160a01b03163314610dfa5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6001600160a01b0381166000818152606f6020908152604091829020600101805460ff1916905590519182527f4106dfdaa577573db51c0ca93f766dbedfa0758faa2e7f5bcdb7c142be803c3f91015b60405180910390a150565b6001600160a01b0382166000908152606f60205260409020600181015460ff16610eb35760405162461bcd60e51b815260206004820152600f60248201526e506f6f6c206e6f742061637469766560881b6044820152606401610d39565b60048101546001600160a01b03163314610f0f5760405162461bcd60e51b815260206004820152601760248201527f4f6e6c792068656c7065722063616e206465706f7369740000000000000000006044820152606401610d39565b6004810154610f2c906001600160a01b0385811691163085612ed1565b606954610f449084906001600160a01b031684612f69565b6069548154604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891610f7f918690600401918252602082015260400190565b600060405180830381600087803b158015610f9957600080fd5b505af1158015610fad573d6000803e3d6000fd5b5050505060028101546004808301546040516340c10f1960e01b81526001600160a01b039182169281019290925260248201859052909116906340c10f1990604401600060405180830381600087803b15801561100957600080fd5b505af115801561101d573d6000803e3d6000fd5b50505050505050565b6033546001600160a01b0316331461106e5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6000606e828154811061108357611083613d69565b906000526020600020906004020190508060020154606d60008282546110a99190613cf5565b909155505060038101805460ff60b01b1981169091556040516001600160a01b0390911681527f5493db1723859b50d9e2f6dbcda6da662098ea59bf451ad2a31ad62289ed54a19060200160405180910390a15050565b600061110a612da7565b9050801561117b57606560009054906101000a90046001600160a01b03166001600160a01b0316634e71d92d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561116257600080fd5b505af1158015611176573d6000803e3d6000fd5b505050505b6040518181527f3c0c3af035d6731692e4d6a07be70372bea0bb2fe625e1cd0968d100e391aff290602001610e4a565b6066546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401610ca0565b6033546001600160a01b031633146112245760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6000606e838154811061123957611239613d69565b906000526020600020906004020190508060030160169054906101000a900460ff166112a75760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74206368616e676520616e206465616374697661746564206665656044820152606401610d39565b818160010154111580156112bc575080548211155b6112fd5760405162461bcd60e51b815260206004820152601260248201527156616c7565206e6f7420696e2072616e676560701b6044820152606401610d39565b610bb8816002015483606d546113139190613c9c565b61131d9190613cf5565b111561135d5760405162461bcd60e51b815260206004820152600f60248201526e13585e08199959481c995858da1959608a1b6044820152606401610d39565b818160020154606d546113709190613cf5565b61137a9190613c9c565b606d55600281018290556003810154604080516001600160a01b039092168252602082018490527f01fe2943baee27f47add82886c2200f910c749c461c9b63c5fe83901a53bdb4991015b60405180910390a1505050565b6033546001600160a01b0316331461141a5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6101f481111561145d5760405162461bcd60e51b815260206004820152600e60248201526d0acc2d8eaca40e8dede40d0d2ced60931b6044820152606401610d39565b606c5481606d5461146e9190613c9c565b6114789190613cf5565b606d819055610bb810156114c05760405162461bcd60e51b815260206004820152600f60248201526e13505608119959481c995858da1959608a1b6044820152606401610d39565b606c55565b6033546001600160a01b0316331461150d5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6071805460ff1916911515919091179055565b6033546001600160a01b031633146115685760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b606980546001600160a01b0319166001600160a01b0383169081179091556040519081527f10f12a67fd088b844c32ace95f43bc95aec63c9fc945fb3062181d74cabb262790602001610e4a565b606554604080516316dcb40560e11b815290516000926001600160a01b031691632db9680a916004808301926020929190829003018186803b158015610cb857600080fd5b6033546001600160a01b031633146116435760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b61164d6000613027565b565b6072602052816000526040600020818154811061166b57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6033546001600160a01b031633146116cf5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6001600160a01b0383166117255760405162461bcd60e51b815260206004820152601460248201527f4e6f206665657320746f206164647265737320300000000000000000000000006044820152606401610d39565b610bb884606d546117369190613c9c565b11156117765760405162461bcd60e51b815260206004820152600f60248201526e13585e08199959481c995858da1959608a1b6044820152606401610d39565b8385111580156117865750858411155b6117c75760405162461bcd60e51b815260206004820152601260248201527156616c7565206e6f7420696e2072616e676560701b6044820152606401610d39565b6040805160e081018252878152602081018781529181018681526001600160a01b03808716606084019081528615156080850190815286151560a08601908152600160c08701818152606e805492830181556000908152975160049092027f9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142a81019290925597517f9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142b82015594517f9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142c86015591517f9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142d90940180549151925196511515600160b01b0260ff60b01b19971515600160a81b029790971661ffff60a81b19931515600160a01b026001600160a81b0319909316959094169490941717161792909217909155606d8054869290611921908490613c9c565b9091555050604080516001600160a01b03851681526020810186905283151581830152821515606082015290517f6b67376f541493b7df6bcb8449800492e63d937edfb837763a818d3be5baa2839181900360800190a1505050505050565b6033546001600160a01b031633146119c85760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015611a0a57600080fd5b505afa158015611a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a429190613a68565b9050611a4f838383612f69565b6040516347e7a41160e11b8152600481018290526001600160a01b038481166024830152831690638fcf4822906044015b602060405180830381600087803b158015611a9a57600080fd5b505af1158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c609190613a32565b6065546040516343b0215f60e01b81523060048201526000916001600160a01b0316906343b0215f9060240160806040518083038186803b158015611b1657600080fd5b505afa158015611b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4e9190613b92565b50919392505050565b6033546001600160a01b03163314611b9f5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6001600160a01b038281166000818152606f60209081526040918290206004810180546001600160a01b0319169587169590951790945590519182527f70303f458d42d2859a2b47e1aef18ce7e48d7d3cc88c6a31d4e455b7aaf0c63791016113c5565b6033546001600160a01b03163314611c4b5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015611c8d57600080fd5b505afa158015611ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc59190613a68565b9050611cd2838383612f69565b604051635bc59ce760e01b8152600481018290526001600160a01b038481166024830152831690635bc59ce790604401611a80565b6033546001600160a01b03163314611d4f5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6001600160a01b0384166000908152606f602052604090206001015460ff1615611dc95760405162461bcd60e51b815260206004820152602560248201527f506f6f6c20697320616c7265616479207265676973746572656420616e642061604482015264637469766560d81b6064820152608401610d39565b60405163478064b160e11b8152600090732ddc95e41d01ddd3268cd91a35a7bd7d0849d7fc90638f00c96290611e059087908790600401613c23565b60206040518083038186803b158015611e1d57600080fd5b505af4158015611e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5591906138d8565b606a54606654604051631d9f877360e11b81526001600160a01b0380851660048301529182166024820152929350600092911690633b3f0ee690604401602060405180830381600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee491906138d8565b606a54606754606b5460405163213014ab60e01b8152600481018c90526001600160a01b038088166024830152808c166044830152306064830152938416608482015283851660a482015291831660c48301529190911660e48201529091506000907369cde7a07e3ffb839ca69f635174c725f006e98b9063213014ab906101040160206040518083038186803b158015611f7e57600080fd5b505af4158015611f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb691906138d8565b606a5460405163266f24b760e01b8152600481018790526001600160a01b0386811660248301528581166044830152808416606483015292935091169063266f24b790608401600060405180830381600087803b15801561201657600080fd5b505af115801561202a573d6000803e3d6000fd5b50506040805160c0810182528b8152600160208083018281526001600160a01b038e81168587018181528c8316606088019081528c8416608089019081528c851660a08a019081526000858152606f89528b902099518a5595519789018054935186166101000274ffffffffffffffffffffffffffffffffffffffff0019991515999099166001600160a81b03199094169390931797909717909155516002870180549184166001600160a01b0319928316179055945160038701805491841691871691909117905591516004909501805495909116949093169390931790915591519081527f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea6935001905060405180910390a15050505050505050565b600054610100900460ff166121635760005460ff1615612167565b303b155b6121ca5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610d39565b600054610100900460ff161580156121ec576000805461ffff19166101011790555b6121f4613079565b606680546001600160a01b03199081166001600160a01b038b8116919091179092556069805482168a8416179055606a80548216898416179055606c849055606d849055606880548216888416179055606b80548216878416179055606580549091169185169190911790558015612272576000805461ff00191690555b5050505050505050565b6001600160a01b0382166000908152606f60205260409020600181015460ff166122da5760405162461bcd60e51b815260206004820152600f60248201526e506f6f6c206e6f742061637469766560881b6044820152606401610d39565b6001600160a01b03831660009081526072602090815260408083208054825181850281018501909352808352919290919083018282801561234457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612326575b5050505050905060008151905060008167ffffffffffffffff81111561236c5761236c613d7f565b604051908082528060200260200182016040528015612395578160200160208202803683370190505b50905060005b82811015612467578381815181106123b5576123b5613d69565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561240057600080fd5b505afa158015612414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124389190613a68565b82828151811061244a5761244a613d69565b60209081029190910101528061245f81613d38565b91505061239b565b506066546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156124ac57600080fd5b505afa1580156124c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e49190613a68565b6069548654604051631c57762b60e31b81526004810191909152600060248201529192506001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561253557600080fd5b505af1158015612549573d6000803e3d6000fd5b50506066546040516370a0823160e01b8152306004820152600093508492506001600160a01b03909116906370a082319060240160206040518083038186803b15801561259557600080fd5b505afa1580156125a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cd9190613a68565b6125d79190613cf5565b9050808780156125e85750606c5415155b1561269e576000612710606c54846126009190613cd6565b61260a9190613cb4565b60665460675491925061262a916001600160a01b03918216911683612f69565b6067546040516336efd16f60e01b8152600481018390523360248201526001600160a01b03909116906336efd16f90604401600060405180830381600087803b15801561267657600080fd5b505af115801561268a573d6000803e3d6000fd5b50505050808261269a9190613cf5565b9150505b600187015460038801546126c5916001600160a01b036101009091048116911684846130b0565b60005b858110156127da5760008582815181106126e4576126e4613d69565b60200260200101518883815181106126fe576126fe613d69565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561274957600080fd5b505afa15801561275d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127819190613a68565b61278b9190613cf5565b905080156127c7576127c78883815181106127a8576127a8613d69565b602090810291909101015160038b01546001600160a01b03168361340d565b50806127d281613d38565b9150506126c8565b507f146539a025c1071110ed921e832f5fe16970ca89ef5ed6f970bac0555ca5641e826128078382613cf5565b6040805192835260208301919091520160405180910390a1505050505050505050565b6033546001600160a01b031633146128725760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b606a80546001600160a01b0319166001600160a01b0383169081179091556040519081527ff1f9199d8fdc12a20382c86e83331ac8b68502b3dacf227f09745b718a897f0390602001610e4a565b6033546001600160a01b031633146129085760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6067546001600160a01b0316156129545760405162461bcd60e51b815260206004820152601060248201526f1e129bd948185b1c9958591e481cd95d60821b6044820152606401610d39565b606780546001600160a01b0319166001600160a01b0392909216919091179055565b6065546040516343b0215f60e01b81523060048201526000916001600160a01b0316906343b0215f9060240160806040518083038186803b1580156129ba57600080fd5b505afa1580156129ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f29190613b92565b949350505050565b6033546001600160a01b03163314612a425760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6001600160a01b038281166000818152606f60209081526040918290206003810180546001600160a01b03191695871695861790558251938452908301939093527f85d7cbd4ad20c7f47d5e836caa3d9cd4bef908497f6bf4212b157c80e707fb6591016113c5565b6033546001600160a01b03163314612af35760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b607180549115156101000261ff0019909216919091179055565b6033546001600160a01b03163314612b555760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6001600160a01b0391821660009081526072602090815260408220805460018101825590835291200180546001600160a01b03191691909216179055565b6033546001600160a01b03163314612bdb5760405162461bcd60e51b81526020600482018190526024820152600080516020613db98339815191526044820152606401610d39565b6001600160a01b038116612c405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d39565b610d4b81613027565b6001600160a01b038281166000908152606f6020526040902060048101549091163314612cb85760405162461bcd60e51b815260206004820152601860248201527f4f6e6c792068656c7065722063616e20776974686472617700000000000000006044820152606401610d39565b6002810154604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015612d0657600080fd5b505af1158015612d1a573d6000803e3d6000fd5b50506069548354604051630441a3e760e41b81526001600160a01b03909216935063441a3e709250612d59918690600401918252602082015260400190565b600060405180830381600087803b158015612d7357600080fd5b505af1158015612d87573d6000803e3d6000fd5b5050506004820154610c6e91506001600160a01b0385811691168461355b565b606554604051637e17a9db60e11b81523060048201526000916001600160a01b03169063fc2f53b690602401610ca0565b8015612ea1576000612de8612da7565b606654606554919250612e08916001600160a01b03918216911684612f69565b60655460405163b6b55f2560e01b8152600481018490526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b158015612e4e57600080fd5b505af1158015612e62573d6000803e3d6000fd5b505050507f3c0c3af035d6731692e4d6a07be70372bea0bb2fe625e1cd0968d100e391aff281604051612e9791815260200190565b60405180910390a1505b6040518181527f15df702e458c8bd51cc3d7fd6c3734e3a631e9c9771a827e8e252820e593626390602001610e4a565b6040516001600160a01b0380851660248301528316604482015260648101829052610c609085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261358b565b604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015282919085169063dd62ed3e9060440160206040518083038186803b158015612fb357600080fd5b505afa158015612fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612feb9190613a68565b1015610c6e5760405163095ea7b360e01b81526001600160a01b038381166004830152600019602483015284169063095ea7b390604401611a80565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166130a05760405162461bcd60e51b8152600401610d3990613c51565b6130a861365d565b61164d613684565b60005b606e54811015613368576000606e82815481106130d2576130d2613d69565b906000526020600020906004020190508060030160169054906101000a900460ff16156133555760665460028201546001600160a01b03909116906000906127109061311e9088613cd6565b6131289190613cb4565b6003840154909150600160a01b900460ff166131b157606754604051637acee2bd60e11b8152600481018390523060248201526001600160a01b039091169063f59dc57a90604401600060405180830381600087803b15801561318a57600080fd5b505af115801561319e573d6000803e3d6000fd5b50506067546001600160a01b0316935050505b6003830154600160a81b900460ff1661326c5760038301546131de9083906001600160a01b031683612f69565b6003830154604051635bc59ce760e01b8152600481018390526001600160a01b03848116602483015290911690635bc59ce790604401602060405180830381600087803b15801561322e57600080fd5b505af1158015613242573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132669190613a32565b50613346565b600383015460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b1580156132bc57600080fd5b505af11580156132d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f49190613a32565b506003830154604080516001600160a01b039283168152918416602083015281018290527f6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c59060600160405180910390a15b6133508186613cf5565b945050505b508061336081613d38565b9150506130b3565b50606654613380906001600160a01b03168483612f69565b6066546040516347e7a41160e11b8152600481018390526001600160a01b03918216602482015290841690638fcf482290604401602060405180830381600087803b1580156133ce57600080fd5b505af11580156133e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134069190613a32565b5050505050565b60405163095ea7b360e01b81526001600160a01b0383811660048301526024820183905284169063095ea7b390604401602060405180830381600087803b15801561345757600080fd5b505af115801561346b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348f9190613a32565b506040516347e7a41160e11b8152600481018290526001600160a01b038481166024830152831690638fcf482290604401602060405180830381600087803b1580156134da57600080fd5b505af11580156134ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135129190613a32565b50604080516001600160a01b038085168252851660208201529081018290527f6c33b8f6b4f8ba21a4621cc77c018fbb4c7663cfa25929f02dc8d36abde462c5906060016113c5565b6040516001600160a01b038316602482015260448101829052610c6e90849063a9059cbb60e01b90606401612f05565b60006135e0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136b49092919063ffffffff16565b805190915015610c6e57808060200190518101906135fe9190613a32565b610c6e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d39565b600054610100900460ff1661164d5760405162461bcd60e51b8152600401610d3990613c51565b600054610100900460ff166136ab5760405162461bcd60e51b8152600401610d3990613c51565b61164d33613027565b60606136c384846000856136cd565b90505b9392505050565b60608247101561372e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d39565b843b61377c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d39565b600080866001600160a01b031685876040516137989190613bf4565b60006040518083038185875af1925050503d80600081146137d5576040519150601f19603f3d011682016040523d82523d6000602084013e6137da565b606091505b50915091506137ea8282866137f5565b979650505050505050565b606083156138045750816136c6565b8251156138145782518084602001fd5b8160405162461bcd60e51b8152600401610d399190613c10565b600082601f83011261383f57600080fd5b813567ffffffffffffffff8082111561385a5761385a613d7f565b604051601f8301601f19908116603f0116810190828211818310171561388257613882613d7f565b8160405283815286602085880101111561389b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156138cd57600080fd5b81356136c681613d95565b6000602082840312156138ea57600080fd5b81516136c681613d95565b6000806040838503121561390857600080fd5b823561391381613d95565b9150602083013561392381613d95565b809150509250929050565b600080600080600080600060e0888a03121561394957600080fd5b873561395481613d95565b9650602088013561396481613d95565b9550604088013561397481613d95565b9450606088013561398481613d95565b9350608088013561399481613d95565b925060a08801356139a481613d95565b8092505060c0880135905092959891949750929550565b600080604083850312156139ce57600080fd5b82356139d981613d95565b9150602083013561392381613daa565b600080604083850312156139fc57600080fd5b8235613a0781613d95565b946020939093013593505050565b600060208284031215613a2757600080fd5b81356136c681613daa565b600060208284031215613a4457600080fd5b81516136c681613daa565b600060208284031215613a6157600080fd5b5035919050565b600060208284031215613a7a57600080fd5b5051919050565b600080600080600060a08688031215613a9957600080fd5b853594506020860135613aab81613d95565b9350604086013567ffffffffffffffff80821115613ac857600080fd5b613ad489838a0161382e565b94506060880135915080821115613aea57600080fd5b50613af78882890161382e565b95989497509295608001359392505050565b60008060408385031215613b1c57600080fd5b50508035926020909101359150565b60008060008060008060c08789031215613b4457600080fd5b8635955060208701359450604087013593506060870135613b6481613d95565b92506080870135613b7481613daa565b915060a0870135613b8481613daa565b809150509295509295509295565b60008060008060808587031215613ba857600080fd5b505082516020840151604085015160609095015191969095509092509050565b60008151808452613be0816020860160208601613d0c565b601f01601f19169290920160200192915050565b60008251613c06818460208701613d0c565b9190910192915050565b6020815260006136c66020830184613bc8565b604081526000613c366040830185613bc8565b8281036020840152613c488185613bc8565b95945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008219821115613caf57613caf613d53565b500190565b600082613cd157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613cf057613cf0613d53565b500290565b600082821015613d0757613d07613d53565b500390565b60005b83811015613d27578181015183820152602001613d0f565b83811115610c605750506000910152565b6000600019821415613d4c57613d4c613d53565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d4b57600080fd5b8015158114610d4b57600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212208728e401c047672437cb974868e48c5aa55abfa8f67efc73ebb1ec52d6a722bd64736f6c63430008070033
Deployed ByteCode Sourcemap
1552:19642:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2729:42;-1:-1:-1;;;;;21100:21:21;;21129;21100:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1552:19642;;;;;14915:342;;;;;;;;;;;;;:::i;:::-;;;16314:25:28;;;16302:2;16287:18;14915:342:21;;;;;;;;1669:25;;;;;;;;;;-1:-1:-1;1669:25:21;;;;-1:-1:-1;;;;;1669:25:21;;;;;;-1:-1:-1;;;;;7127:55:28;;;7109:74;;7097:2;7082:18;1669:25:21;6963:226:28;19475:546:21;;;;;;;;;;-1:-1:-1;19475:546:21;;;;;:::i;:::-;-1:-1:-1;;;;;19779:15:21;;;19574:11;19779:15;;;:5;:15;;;;;19810:13;;19844:18;;;;19915:22;;;;19961:18;;;;19998:16;;;;;19810:13;;19844:18;;;;;19880:15;;;;;;19915:22;;;;19961:18;;;;19998:16;;;;;19475:546;;;;;18233:25:28;;;18301:14;;18294:22;18289:2;18274:18;;18267:50;-1:-1:-1;;;;;18414:15:28;;;18394:18;;;18387:43;;;;18466:15;;;18461:2;18446:18;;18439:43;18519:15;;18513:3;18498:19;;18491:44;18572:15;18566:3;18551:19;;18544:44;18220:3;18205:19;19475:546:21;17952:642:28;15263:734:21;;;;;;;;;;-1:-1:-1;15263:734:21;;;;;:::i;:::-;;:::i;:::-;;2506:50;;;;;;;;;;-1:-1:-1;2506:50:21;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2506:50:21;;;2046:23;;;;;;;;;;;;;;;;17177:114;;;;;;;;;;;;;:::i;14552:94::-;;;;;;;;;;-1:-1:-1;14552:94:21;;;;;:::i;:::-;;:::i;2263:22::-;;;;;;;;;;-1:-1:-1;2263:22:21;;;;;:::i;:::-;;:::i;:::-;;;;19410:25:28;;;19466:2;19451:18;;19444:34;;;;19494:18;;;19487:34;;;;-1:-1:-1;;;;;19557:55:28;;;19552:2;19537:18;;19530:83;19657:14;19650:22;19644:3;19629:19;;19622:51;19717:14;19710:22;19704:3;19689:19;;19682:51;19777:14;19770:22;19764:3;19749:19;;19742:51;19397:3;19382:19;2263:22:21;19113:686:28;20027:133:21;;;;;;;;;;-1:-1:-1;20027:133:21;;;;;:::i;:::-;;:::i;7578:633::-;;;;;;;;;;-1:-1:-1;7578:633:21;;;;;:::i;:::-;;:::i;6758:197::-;;;;;;;;;;-1:-1:-1;6758:197:21;;;;;:::i;:::-;;:::i;16509:196::-;;;;;;;;;;;;;:::i;14797:112::-;;;;;;;;;;;;;:::i;6203:459::-;;;;;;;;;;-1:-1:-1;6203:459:21;;;;;:::i;:::-;;:::i;7045:338::-;;;;;;;;;;-1:-1:-1;7045:338:21;;;;;:::i;:::-;;:::i;5689:101::-;;;;;;;;;;-1:-1:-1;5689:101:21;;;;;:::i;:::-;;:::i;20762:139::-;;;;;;;;;;-1:-1:-1;20762:139:21;;;;;:::i;:::-;;:::i;1724:19::-;;;;;;;;;;-1:-1:-1;1724:19:21;;;;-1:-1:-1;;;;;1724:19:21;;;4304:124;;;;;;;;;;;;;:::i;1965:25::-;;;;;;;;;;;;;;;;1920:101:24;;;;;;;;;;;;;:::i;2697:74:21:-;;;;;;;;;;;;2729:42;2697:74;;2635:56;;;;;;;;;;-1:-1:-1;2635:56:21;;;;;:::i;:::-;;:::i;4953:730::-;;;;;;;;;;-1:-1:-1;4953:730:21;;;;;:::i;:::-;;:::i;2601:27::-;;;;;;;;;;-1:-1:-1;2601:27:21;;;;;;;;;;;;;;8861:14:28;;8854:22;8836:41;;8824:2;8809:18;2601:27:21;8696:187:28;2563:32:21;;;;;;;;;;-1:-1:-1;2563:32:21;;;;;;;;1288:85:24;;;;;;;;;;-1:-1:-1;1360:6:24;;-1:-1:-1;;;;;1360:6:24;1288:85;;12860:395:21;;;;;;;;;;-1:-1:-1;12860:395:21;;;;;:::i;:::-;;:::i;16965:149::-;;;;;;;;;;;;;:::i;20166:205::-;;;;;;;;;;-1:-1:-1;20166:205:21;;;;;:::i;:::-;;:::i;1805:24::-;;;;;;;;;;-1:-1:-1;1805:24:21;;;;-1:-1:-1;;;;;1805:24:21;;;2463:37;;;;;;;;;;-1:-1:-1;2463:37:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2463:37:21;;;;;;;;;;;;;;;;;;13483:395;;;;;;;;;;-1:-1:-1;13483:395:21;;;;;:::i;:::-;;:::i;17702:1326::-;;;;;;;;;;-1:-1:-1;17702:1326:21;;;;;:::i;:::-;;:::i;3415:628::-;;;;;;;;;;-1:-1:-1;3415:628:21;;;;;:::i;:::-;;:::i;1700:18::-;;;;;;;;;;-1:-1:-1;1700:18:21;;;;-1:-1:-1;;;;;1700:18:21;;;8434:1492;;;;;;;;;;-1:-1:-1;8434:1492:21;;;;;:::i;:::-;;:::i;1921:38::-;;;;;;;;;;;;1955:4;1921:38;;1749:20;;;;;;;;;;-1:-1:-1;1749:20:21;;;;-1:-1:-1;;;;;1749:20:21;;;20613:143;;;;;;;;;;-1:-1:-1;20613:143:21;;;;;:::i;:::-;;:::i;4161:137::-;;;;;;;;;;-1:-1:-1;4161:137:21;;;;;:::i;:::-;;:::i;14652:139::-;;;;;;;;;;;;;:::i;20377:230::-;;;;;;;;;;-1:-1:-1;20377:230:21;;;;;:::i;:::-;;:::i;5796:99::-;;;;;;;;;;-1:-1:-1;5796:99:21;;;;;:::i;:::-;;:::i;1775:24::-;;;;;;;;;;-1:-1:-1;1775:24:21;;;;-1:-1:-1;;;;;1775:24:21;;;20907:150;;;;;;;;;;-1:-1:-1;20907:150:21;;;;;:::i;:::-;;:::i;2170:198:24:-;;;;;;;;;;-1:-1:-1;2170:198:24;;;;;:::i;:::-;;:::i;14117:429:21:-;;;;;;;;;;-1:-1:-1;14117:429:21;;;;;:::i;:::-;;:::i;16750:146::-;;;;;;;;;;;;;:::i;1996:44::-;;;;;;;;;;;;2037:3;1996:44;;1835:21;;;;;;;;;;-1:-1:-1;1835:21:21;;;;-1:-1:-1;;;;;1835:21:21;;;14915:342;14965:7;14984:17;15004:14;:12;:14::i;:::-;14984:34;;15028:15;15046:12;:10;:12::i;:::-;15028:30;;15068:17;15123:3;15101:18;:16;:18::i;:::-;15089:30;;:9;:30;:::i;:::-;15088:38;;;;:::i;:::-;15068:58;-1:-1:-1;15151:19:21;15068:58;15163:7;15151:19;:::i;:::-;15140:7;:30;15136:69;;15193:1;15186:8;;;;;14915:342;:::o;15136:69::-;15243:7;15221:19;:9;15233:7;15221:19;:::i;:::-;:29;;;;:::i;:::-;15214:36;;;;;14915:342;:::o;15263:734::-;15353:20;;15332:7;;15353:20;;15349:97;;15398:17;15408:6;15398:9;:17::i;:::-;15429:7;15263:734;:::o;15349:97::-;15455:22;15480:19;:17;:19::i;:::-;15455:44;-1:-1:-1;15513:19:21;15509:482;;15548:15;15566:12;:10;:12::i;:::-;15548:30;;15615:14;:12;:14::i;:::-;15597:15;:32;15596:53;;;-1:-1:-1;15634:15:21;;;;;;;15596:53;15592:346;;;15669:18;15679:7;15669:9;:18::i;:::-;15592:346;;;15726:17;15746:14;:12;:14::i;:::-;15726:34;;15778:17;15833:3;15811:18;:16;:18::i;:::-;15799:30;;:9;:30;:::i;:::-;15798:38;;;;:::i;:::-;15778:58;;15854:69;15919:3;15896:18;:16;:18::i;:::-;15890:24;;:3;:24;:::i;:::-;15866:19;15876:9;15866:7;:19;:::i;:::-;15865:50;;;;:::i;:::-;15864:58;;;;:::i;:::-;15854:9;:69::i;:::-;15708:230;;15592:346;15534:414;15305:692;;15263:734;:::o;15509:482::-;15968:12;:10;:12::i;:::-;15305:692;;15263:734;:::o;17177:114::-;17253:5;;17246:38;;-1:-1:-1;;;17246:38:21;;17278:4;17246:38;;;7109:74:28;17220:7:21;;-1:-1:-1;;;;;17253:5:21;;17246:23;;7082:18:28;;17246:38:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17239:45;;17177:114;:::o;14552:94::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;;;;;;;;;14621:18:21::1;14631:7;14621:9;:18::i;:::-;14552:94:::0;:::o;2263:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2263:22:21;;-1:-1:-1;;;;;2263:22:21;;;;-1:-1:-1;;;2263:22:21;;;;;-1:-1:-1;;;2263:22:21;;;;;-1:-1:-1;;;2263:22:21;;;;;:::o;20027:133::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;-1:-1:-1;;;;;20091:12:21;::::1;20115:5;20091:12:::0;;;:5:::1;:12;::::0;;;;;;;;:21:::1;;:29:::0;;-1:-1:-1;;20091:29:21::1;::::0;;20135:18;;7109:74:28;;;20135:18:21::1;::::0;7082::28;20135::21::1;;;;;;;;20027:133:::0;:::o;7578:633::-;-1:-1:-1;;;;;7721:12:21;;7697:21;7721:12;;;:5;:12;;;;;7775:17;;;;;;7767:45;;;;-1:-1:-1;;;7767:45:21;;16026:2:28;7767:45:21;;;16008:21:28;16065:2;16045:18;;;16038:30;-1:-1:-1;;;16084:18:28;;;16077:45;16139:18;;7767:45:21;15824:339:28;7767:45:21;7844:15;;;;-1:-1:-1;;;;;7844:15:21;7830:10;:29;7822:65;;;;-1:-1:-1;;;7822:65:21;;9711:2:28;7822:65:21;;;9693:21:28;9750:2;9730:18;;;9723:30;9789:25;9769:18;;;9762:53;9832:18;;7822:65:21;9509:347:28;7822:65:21;7928:15;;;;7897:70;;-1:-1:-1;;;;;7897:30:21;;;;7928:15;7953:4;7960:6;7897:30;:70::i;:::-;8048:9;;8019:47;;8041:5;;-1:-1:-1;;;;;8048:9:21;8059:6;8019:21;:47::i;:::-;8087:9;;8106:12;;8076:51;;-1:-1:-1;;;8076:51:21;;-1:-1:-1;;;;;8087:9:21;;;;8076:29;;:51;;8120:6;;8076:51;;18781:25:28;;;18837:2;18822:18;;18815:34;18769:2;18754:18;;18599:256;8076:51:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;8152:21:21;;;;8180:15;;;;;8137:67;;-1:-1:-1;;;8137:67:21;;-1:-1:-1;;;;;8180:15:21;;;8137:67;;;8103:74:28;;;;8193:18;;;8186:34;;;8152:21:21;;;;8137:42;;8076:18:28;;8137:67:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7635:576;7578:633;;:::o;6758:197::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;6821:16:21::1;6840:8;6849:5;6840:15;;;;;;;;:::i;:::-;;;;;;;;;;;6821:34;;6877:3;:9;;;6865:8;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;6896:12:21::1;::::0;::::1;:20:::0;;-1:-1:-1;;;;6896:20:21;::::1;::::0;;;6931:17:::1;::::0;-1:-1:-1;;;;;6941:6:21;;;7109:74:28;;6931:17:21::1;::::0;7097:2:28;7082:18;6931:17:21::1;;;;;;;6811:144;6758:197:::0;:::o;16509:196::-;16548:14;16565:17;:15;:17::i;:::-;16548:34;-1:-1:-1;16596:10:21;;16592:72;;16634:10;;;;;;;;;-1:-1:-1;;;;;16634:10:21;-1:-1:-1;;;;;16622:29:21;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16592:72;16678:20;;16314:25:28;;;16678:20:21;;16302:2:28;16287:18;16678:20:21;16168:177:28;14797:112:21;14873:3;;14866:36;;-1:-1:-1;;;14866:36:21;;14896:4;14866:36;;;7109:74:28;14840:7:21;;-1:-1:-1;;;;;14873:3:21;;14866:21;;7082:18:28;;14866:36:21;6963:226:28;6203:459:21;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;6278:16:21::1;6297:8;6306:5;6297:15;;;;;;;;:::i;:::-;;;;;;;;;;;6278:34;;6330:3;:12;;;;;;;;;;;;6322:57;;;::::0;-1:-1:-1;;;6322:57:21;;13091:2:28;6322:57:21::1;::::0;::::1;13073:21:28::0;;;13110:18;;;13103:30;13169:34;13149:18;;;13142:62;13221:18;;6322:57:21::1;12889:356:28::0;6322:57:21::1;6413:5;6397:3;:12;;;:21;;:46;;;;-1:-1:-1::0;6431:12:21;;6422:21;::::1;;6397:46;6389:77;;;::::0;-1:-1:-1;;;6389:77:21;;14222:2:28;6389:77:21::1;::::0;::::1;14204:21:28::0;14261:2;14241:18;;;14234:30;-1:-1:-1;;;14280:18:28;;;14273:48;14338:18;;6389:77:21::1;14020:342:28::0;6389:77:21::1;1955:4;6503:3;:9;;;6495:5;6484:8;;:16;;;;:::i;:::-;:28;;;;:::i;:::-;:39;;6476:67;;;::::0;-1:-1:-1;;;6476:67:21;;15333:2:28;6476:67:21::1;::::0;::::1;15315:21:28::0;15372:2;15352:18;;;15345:30;-1:-1:-1;;;15391:18:28;;;15384:45;15446:18;;6476:67:21::1;15131:339:28::0;6476:67:21::1;6587:5;6575:3;:9;;;6564:8;;:20;;;;:::i;:::-;:28;;;;:::i;:::-;6553:8;:39:::0;6602:9:::1;::::0;::::1;:17:::0;;;6641:6:::1;::::0;::::1;::::0;6634:21:::1;::::0;;-1:-1:-1;;;;;6641:6:21;;::::1;8103:74:28::0;;8208:2;8193:18;;8186:34;;;6634:21:21::1;::::0;8076:18:28;6634:21:21::1;;;;;;;;6268:394;6203:459:::0;;:::o;7045:338::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;2037:3:21::1;7119:5;:23;;7111:50;;;::::0;-1:-1:-1;;;7111:50:21;;10815:2:28;7111:50:21::1;::::0;::::1;10797:21:28::0;10854:2;10834:18;;;10827:30;-1:-1:-1;;;10873:18:28;;;10866:44;10927:18;;7111:50:21::1;10613:338:28::0;7111:50:21::1;7281:10;;7273:5;7262:8;;:16;;;;:::i;:::-;:29;;;;:::i;:::-;7251:8;:40:::0;;;1955:4:::1;-1:-1:-1::0;7309:19:21::1;7301:47;;;::::0;-1:-1:-1;;;7301:47:21;;12747:2:28;7301:47:21::1;::::0;::::1;12729:21:28::0;12786:2;12766:18;;;12759:30;-1:-1:-1;;;12805:18:28;;;12798:45;12860:18;;7301:47:21::1;12545:339:28::0;7301:47:21::1;7358:10;:18:::0;7045:338::o;5689:101::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;5754:20:21::1;:29:::0;;-1:-1:-1;;5754:29:21::1;::::0;::::1;;::::0;;;::::1;::::0;;5689:101::o;20762:139::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;20833:9:21::1;:22:::0;;-1:-1:-1;;;;;;20833:22:21::1;-1:-1:-1::0;;;;;20833:22:21;::::1;::::0;;::::1;::::0;;;20870:24:::1;::::0;7109:74:28;;;20870:24:21::1;::::0;7097:2:28;7082:18;20870:24:21::1;6963:226:28::0;4304:124:21;4391:10;;4379:42;;;-1:-1:-1;;;4379:42:21;;;;4353:7;;-1:-1:-1;;;;;4391:10:21;;4379:40;;:42;;;;;;;;;;;;;;4391:10;4379:42;;;;;;;;;;1920:101:24;1360:6;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;1984:30:::1;2011:1;1984:18;:30::i;:::-;1920:101::o:0;2635:56:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2635:56:21;;-1:-1:-1;2635:56:21;;-1:-1:-1;2635:56:21:o;4953:730::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;-1:-1:-1;;;;;5141:16:21;::::1;5133:49;;;::::0;-1:-1:-1;;;5133:49:21;;15677:2:28;5133:49:21::1;::::0;::::1;15659:21:28::0;15716:2;15696:18;;;15689:30;15755:22;15735:18;;;15728:50;15795:18;;5133:49:21::1;15475:344:28::0;5133:49:21::1;1955:4;5211:5;5200:8;;:16;;;;:::i;:::-;:27;;5192:55;;;::::0;-1:-1:-1;;;5192:55:21;;15333:2:28;5192:55:21::1;::::0;::::1;15315:21:28::0;15372:2;15352:18;;;15345:30;-1:-1:-1;;;15391:18:28;;;15384:45;15446:18;;5192:55:21::1;15131:339:28::0;5192:55:21::1;5272:5;5265:3;:12;;:28;;;;;5290:3;5281:5;:12;;5265:28;5257:59;;;::::0;-1:-1:-1;;;5257:59:21;;14222:2:28;5257:59:21::1;::::0;::::1;14204:21:28::0;14261:2;14241:18;;;14234:30;-1:-1:-1;;;14280:18:28;;;14273:48;14338:18;;5257:59:21::1;14020:342:28::0;5257:59:21::1;5353:236;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;5353:236:21;;::::1;::::0;;;;;;;::::1;;::::0;;;;;;;::::1;;::::0;;;;;;5570:4:::1;5353:236:::0;;;;;;5326:8:::1;:273:::0;;;;::::1;::::0;;-1:-1:-1;5326:273:21;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;5326:273:21::1;-1:-1:-1::0;;;;5326:273:21;::::1;;-1:-1:-1::0;;;5326:273:21::1;::::0;;;;-1:-1:-1;;;;5326:273:21;::::1;;-1:-1:-1::0;;;5326:273:21::1;-1:-1:-1::0;;;;;;5326:273:21;;;;;;::::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;;;5609:8:::1;:17:::0;;5445:5;;-1:-1:-1;5609:17:21::1;::::0;5445:5;;5609:17:::1;:::i;:::-;::::0;;;-1:-1:-1;;5641:35:21::1;::::0;;-1:-1:-1;;;;;8468:55:28;;8450:74;;8555:2;8540:18;;8533:34;;;8610:14;;8603:22;8583:18;;;8576:50;8669:14;;8662:22;8657:2;8642:18;;8635:50;5641:35:21;;::::1;::::0;;;;8437:3:28;5641:35:21;;::::1;4953:730:::0;;;;;;:::o;12860:395::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;13083:39:21::1;::::0;-1:-1:-1;;;13083:39:21;;13116:4:::1;13083:39;::::0;::::1;7109:74:28::0;13066:14:21::1;::::0;-1:-1:-1;;;;;13083:24:21;::::1;::::0;::::1;::::0;7082:18:28;;13083:39:21::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13066:56;;13132:48;13154:6;13162:9;13173:6;13132:21;:48::i;:::-;13190:58;::::0;-1:-1:-1;;;13190:58:21;;::::1;::::0;::::1;16524:25:28::0;;;-1:-1:-1;;;;;16585:55:28;;;16565:18;;;16558:83;13190:42:21;::::1;::::0;::::1;::::0;16497:18:28;;13190:58:21::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16965:149::-:0;17071:10;;17059:48;;-1:-1:-1;;;17059:48:21;;17101:4;17059:48;;;7109:74:28;17010:17:21;;-1:-1:-1;;;;;17071:10:21;;17059:33;;7082:18:28;;17059:48:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;17039:68:21;;16965:149;-1:-1:-1;;;16965:149:21:o;20166:205::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;-1:-1:-1;;;;;20278:12:21;;::::1;20254:21;20278:12:::0;;;:5:::1;:12;::::0;;;;;;;;20300:15:::1;::::0;::::1;:29:::0;;-1:-1:-1;;;;;;20300:29:21::1;::::0;;::::1;::::0;;;::::1;::::0;;;20344:20;;7109:74:28;;;20344:20:21::1;::::0;7082:18:28;20344:20:21::1;6963:226:28::0;13483:395:21;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;13708:39:21::1;::::0;-1:-1:-1;;;13708:39:21;;13741:4:::1;13708:39;::::0;::::1;7109:74:28::0;13691:14:21::1;::::0;-1:-1:-1;;;;;13708:24:21;::::1;::::0;::::1;::::0;7082:18:28;;13708:39:21::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13691:56;;13757:48;13779:6;13787:9;13798:6;13757:21;:48::i;:::-;13815:56;::::0;-1:-1:-1;;;13815:56:21;;::::1;::::0;::::1;16524:25:28::0;;;-1:-1:-1;;;;;16585:55:28;;;16565:18;;;16558:83;13815:40:21;::::1;::::0;::::1;::::0;16497:18:28;;13815:56:21::1;16350:297:28::0;17702:1326:21;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;-1:-1:-1;;;;;17914:13:21;::::1;;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:31;17906:81;;;::::0;-1:-1:-1;;;17906:81:21;;11565:2:28;17906:81:21::1;::::0;::::1;11547:21:28::0;11604:2;11584:18;;;11577:30;11643:34;11623:18;;;11616:62;-1:-1:-1;;;11694:18:28;;;11687:35;11739:19;;17906:81:21::1;11363:401:28::0;17906:81:21::1;18022:55;::::0;-1:-1:-1;;;18022:55:21;;17997:15:::1;::::0;18022::::1;::::0;:27:::1;::::0;:55:::1;::::0;18050:11;;18063:13;;18022:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18122:9;::::0;18200:3:::1;::::0;18107:107:::1;::::0;-1:-1:-1;;;18107:107:21;;-1:-1:-1;;;;;7447:15:28;;;18107:107:21::1;::::0;::::1;7429:34:28::0;18200:3:21;;::::1;7479:18:28::0;;;7472:43;17997:81:21;;-1:-1:-1;18088:16:21::1;::::0;18122:9;::::1;::::0;18107:40:::1;::::0;7341:18:28;;18107:107:21::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18457:9;::::0;18528:4:::1;::::0;18551:6:::1;::::0;18270:301:::1;::::0;-1:-1:-1;;;18270:301:21;;::::1;::::0;::::1;17487:25:28::0;;;-1:-1:-1;;;;;17609:15:28;;;17589:18;;;17582:43;17661:15;;;17641:18;;;17634:43;18426:4:21::1;17693:18:28::0;;;17686:43;18457:9:21;;::::1;17745:19:28::0;;;17738:44;17819:15;;;17798:19;;;17791:44;18528:4:21;;::::1;17851:19:28::0;;;17844:44;18551:6:21;;;::::1;17904:19:28::0;;;17897:44;18088:126:21;;-1:-1:-1;18224:18:21::1;::::0;18270:23:::1;::::0;:40:::1;::::0;17459:19:28;;18270:301:21::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18606:9;::::0;18591:155:::1;::::0;-1:-1:-1;;;18591:155:21;;::::1;::::0;::::1;16883:25:28::0;;;-1:-1:-1;;;;;17005:15:28;;;16985:18;;;16978:43;17057:15;;;17037:18;;;17030:43;17109:15;;;17089:18;;;17082:43;18224:357:21;;-1:-1:-1;18606:9:21;::::1;::::0;18591:29:::1;::::0;16855:19:28;;18591:155:21::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18772:217:21::1;::::0;;::::1;::::0;::::1;::::0;;;;;18824:4:::1;18772:217;::::0;;::::1;::::0;;;-1:-1:-1;;;;;18772:217:21;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;-1:-1:-1;18756:13:21;;;:5:::1;:13:::0;;;;;:233;;;;;;;;::::1;::::0;;;;;::::1;;;-1:-1:-1::0;;18756:233:21;::::1;;::::0;;;;-1:-1:-1;;;;;;18756:233:21;;;;;;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;18756:233:21;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;19004:17;;7109:74:28;;;19004:17:21::1;::::0;-1:-1:-1;7082:18:28;;-1:-1:-1;19004:17:21::1;;;;;;;17896:1132;;;17702:1326:::0;;;;;:::o;3415:628::-;2335:13:19;;;;;;;:48;;2371:12;;;;2370:13;2335:48;;;3113:4;1098:20:1;1144:8;2351:16:19;2327:107;;;;-1:-1:-1;;;2327:107:19;;11971:2:28;2327:107:19;;;11953:21:28;12010:2;11990:18;;;11983:30;12049:34;12029:18;;;12022:62;-1:-1:-1;;;12100:18:28;;;12093:44;12154:19;;2327:107:19;11769:410:28;2327:107:19;2445:19;2468:13;;;;;;2467:14;2491:98;;;;2525:13;:20;;-1:-1:-1;;2559:19:19;;;;;2491:98;3676:16:21::1;:14;:16::i;:::-;3738:3;:10:::0;;-1:-1:-1;;;;;;3738:10:21;;::::1;-1:-1:-1::0;;;;;3738:10:21;;::::1;::::0;;;::::1;::::0;;;3823:9:::1;:33:::0;;;::::1;::::0;;::::1;;::::0;;3866:9:::1;:22:::0;;;::::1;::::0;;::::1;;::::0;;3898:10:::1;:23:::0;;;3931:8:::1;:21:::0;;;3962:5:::1;:14:::0;;;::::1;::::0;;::::1;;::::0;;3986:6:::1;:16:::0;;;::::1;::::0;;::::1;;::::0;;4012:10:::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;2611:66:19;;;;2661:5;2645:21;;-1:-1:-1;;2645:21:19;;;2611:66;2046:637;3415:628:21;;;;;;;:::o;8434:1492::-;-1:-1:-1;;;;;8520:12:21;;8496:21;8520:12;;;:5;:12;;;;;8550:17;;;;;;8542:45;;;;-1:-1:-1;;;8542:45:21;;16026:2:28;8542:45:21;;;16008:21:28;16065:2;16045:18;;;16038:30;-1:-1:-1;;;16084:18:28;;;16077:45;16139:18;;8542:45:21;15824:339:28;8542:45:21;-1:-1:-1;;;;;8628:26:21;;8597:28;8628:26;;;:19;:26;;;;;;;;8597:57;;;;;;;;;;;;;;;;;;;8628:26;;8597:57;;;8628:26;8597:57;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8597:57:21;;;;;;;;;;;;;;;;;;;;;;;8664:25;8692:11;:18;8664:46;;8720:31;8768:17;8754:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8754:32:21;;8720:66;;8801:9;8796:136;8816:17;8812:1;:21;8796:136;;;8881:11;8893:1;8881:14;;;;;;;;:::i;:::-;;;;;;;;;;;8874:47;;-1:-1:-1;;;8874:47:21;;8915:4;8874:47;;;7109:74:28;-1:-1:-1;;;;;8874:32:21;;;;;;7082:18:28;;8874:47:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8854:14;8869:1;8854:17;;;;;;;;:::i;:::-;;;;;;;;;;:67;8835:3;;;;:::i;:::-;;;;8796:136;;;-1:-1:-1;8972:3:21;;8965:36;;-1:-1:-1;;;8965:36:21;;8995:4;8965:36;;;7109:74:28;8941:21:21;;-1:-1:-1;;;;;8972:3:21;;8965:21;;7082:18:28;;8965:36:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9022:9;;9041:12;;9011:46;;-1:-1:-1;;;9011:46:21;;;;;18781:25:28;;;;9022:9:21;18822:18:28;;;18815:34;8941:60:21;;-1:-1:-1;;;;;;9022:9:21;;9011:29;;18754:18:28;;9011:46:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9092:3:21;;9085:36;;-1:-1:-1;;;9085:36:21;;9115:4;9085:36;;;7109:74:28;9067:15:21;;-1:-1:-1;9124:13:21;;-1:-1:-1;;;;;;9092:3:21;;;;9085:21;;7082:18:28;;9085:36:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;9067:70;-1:-1:-1;9067:70:21;9187:6;:25;;;;-1:-1:-1;9197:10:21;;:15;;9187:25;9183:277;;;9228:17;1910:5;9259:10;;9249:7;:20;;;;:::i;:::-;9248:40;;;;:::i;:::-;9324:3;;9329:4;;9228:60;;-1:-1:-1;9302:43:21;;-1:-1:-1;;;;;9324:3:21;;;;9329:4;9228:60;9302:21;:43::i;:::-;9365:4;;9359:45;;-1:-1:-1;;;9359:45:21;;;;;16524:25:28;;;9393:10:21;16565:18:28;;;16558:83;-1:-1:-1;;;;;9365:4:21;;;;9359:22;;16497:18:28;;9359:45:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9440:9;9429:8;:20;;;;:::i;:::-;9418:31;;9214:246;9183:277;9481:14;;;;9497:17;;;;9469:65;;-1:-1:-1;;;;;9481:14:21;;;;;;;9497:17;9516:7;9525:8;9469:11;:65::i;:::-;9549:9;9544:320;9564:17;9560:1;:21;9544:320;;;9602:24;9695:14;9710:1;9695:17;;;;;;;;:::i;:::-;;;;;;;9636:11;9648:1;9636:14;;;;;;;;:::i;:::-;;;;;;;;;;;9629:47;;-1:-1:-1;;;9629:47:21;;9670:4;9629:47;;;7109:74:28;-1:-1:-1;;;;;9629:32:21;;;;;;7082:18:28;;9629:47:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;;;;:::i;:::-;9602:110;-1:-1:-1;9730:20:21;;9726:128;;9770:69;9787:11;9799:1;9787:14;;;;;;;;:::i;:::-;;;;;;;;;;;9803:17;;;;-1:-1:-1;;;;;9803:17:21;9822:16;9770;:69::i;:::-;-1:-1:-1;9583:3:21;;;;:::i;:::-;;;;9544:320;;;-1:-1:-1;9878:41:21;9891:7;9900:18;9910:8;9891:7;9900:18;:::i;:::-;9878:41;;;18781:25:28;;;18837:2;18822:18;;18815:34;;;;18754:18;9878:41:21;;;;;;;8486:1440;;;;;;;8434:1492;;:::o;20613:143::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;20686:9:21::1;:22:::0;;-1:-1:-1;;;;;;20686:22:21::1;-1:-1:-1::0;;;;;20686:22:21;::::1;::::0;;::::1;::::0;;;20723:26:::1;::::0;7109:74:28;;;20723:26:21::1;::::0;7097:2:28;7082:18;20723:26:21::1;6963:226:28::0;4161:137:21;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;4230:4:21::1;::::0;-1:-1:-1;;;;;4230:4:21::1;:18:::0;4222:47:::1;;;::::0;-1:-1:-1;;;4222:47:21;;10470:2:28;4222:47:21::1;::::0;::::1;10452:21:28::0;10509:2;10489:18;;;10482:30;-1:-1:-1;;;10528:18:28;;;10521:46;10584:18;;4222:47:21::1;10268:340:28::0;4222:47:21::1;4279:4;:12:::0;;-1:-1:-1;;;;;;4279:12:21::1;-1:-1:-1::0;;;;;4279:12:21;;;::::1;::::0;;;::::1;::::0;;4161:137::o;14652:139::-;14748:10;;14736:48;;-1:-1:-1;;;14736:48:21;;14778:4;14736:48;;;7109:74:28;14697:12:21;;-1:-1:-1;;;;;14748:10:21;;14736:33;;7082:18:28;;14736:48:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14721:63;14652:139;-1:-1:-1;;;;14652:139:21:o;20377:230::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;-1:-1:-1;;;;;20493:12:21;;::::1;20469:21;20493:12:::0;;;:5:::1;:12;::::0;;;;;;;;20515:17:::1;::::0;::::1;:33:::0;;-1:-1:-1;;;;;;20515:33:21::1;::::0;;::::1;::::0;;::::1;::::0;;20563:37;;7429:34:28;;;7479:18;;;7472:43;;;;20563:37:21::1;::::0;7341:18:28;20563:37:21::1;7194:327:28::0;5796:99:21;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;5864:15:21::1;:24:::0;;;::::1;;;;-1:-1:-1::0;;5864:24:21;;::::1;::::0;;;::::1;::::0;;5796:99::o;20907:150::-;1360:6:24;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;-1:-1:-1;;;;;21005:27:21;;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;:45;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;21005:45:21::1;::::0;;;::::1;;::::0;;20907:150::o;2170:198:24:-;1360:6;;-1:-1:-1;;;;;1360:6:24;950:10:3;1500:23:24;1492:68;;;;-1:-1:-1;;;1492:68:24;;12386:2:28;1492:68:24;;;12368:21:28;;;12405:18;;;12398:30;-1:-1:-1;;;;;;;;;;;12444:18:28;;;12437:62;12516:18;;1492:68:24;12184:356:28;1492:68:24;-1:-1:-1;;;;;2258:22:24;::::1;2250:73;;;::::0;-1:-1:-1;;;2250:73:24;;10063:2:28;2250:73:24::1;::::0;::::1;10045:21:28::0;10102:2;10082:18;;;10075:30;10141:34;10121:18;;;10114:62;-1:-1:-1;;;10192:18:28;;;10185:36;10238:19;;2250:73:24::1;9861:402:28::0;2250:73:24::1;2333:28;2352:8;2333:18;:28::i;14117:429:21:-:0;-1:-1:-1;;;;;14253:12:21;;;14229:21;14253:12;;;:5;:12;;;;;14297:15;;;;14253:12;;14297:15;14283:10;:29;14275:66;;;;-1:-1:-1;;;14275:66:21;;14980:2:28;14275:66:21;;;14962:21:28;15019:2;14999:18;;;14992:30;15058:26;15038:18;;;15031:54;15102:18;;14275:66:21;14778:348:28;14275:66:21;14366:21;;;;14351:63;;-1:-1:-1;;;14351:63:21;;14394:10;14351:63;;;8103:74:28;8193:18;;;8186:34;;;-1:-1:-1;;;;;14366:21:21;;;;14351:42;;8076:18:28;;14351:63:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14435:9:21;;14455:12;;14424:53;;-1:-1:-1;;;14424:53:21;;-1:-1:-1;;;;;14435:9:21;;;;-1:-1:-1;14424:30:21;;-1:-1:-1;14424:53:21;;14469:7;;14424:53;;18781:25:28;;;18837:2;18822:18;;18815:34;18769:2;18754:18;;18599:256;14424:53:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14514:15:21;;;;14487:52;;-1:-1:-1;;;;;;14487:26:21;;;;14514:15;14531:7;14487:26;:52::i;16750:146::-;16847:10;;16835:54;;-1:-1:-1;;;16835:54:21;;16883:4;16835:54;;;7109:74:28;16798:15:21;;-1:-1:-1;;;;;16847:10:21;;16835:39;;7082:18:28;;16835:54:21;6963:226:28;16131:332:21;16189:10;;16185:237;;16215:19;16237:17;:15;:17::i;:::-;16290:3;;16295:10;;16215:39;;-1:-1:-1;16268:46:21;;-1:-1:-1;;;;;16290:3:21;;;;16295:10;16307:6;16268:21;:46::i;:::-;16340:10;;16328:39;;-1:-1:-1;;;16328:39:21;;;;;16314:25:28;;;-1:-1:-1;;;;;16340:10:21;;;;16328:31;;16287:18:28;;16328:39:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16386:25;16399:11;16386:25;;;;16314::28;;16302:2;16287:18;;16168:177;16386:25:21;;;;;;;;16201:221;16185:237;16436:20;;16314:25:28;;;16436:20:21;;16302:2:28;16287:18;16436:20:21;16168:177:28;894:241:26;1059:68;;-1:-1:-1;;;;;7807:15:28;;;1059:68:26;;;7789:34:28;7859:15;;7839:18;;;7832:43;7891:18;;;7884:34;;;1032:96:26;;1052:5;;-1:-1:-1;;;1082:27:26;7701:18:28;;1059:68:26;;;;-1:-1:-1;;1059:68:26;;;;;;;;;;;;;;;;;;;;;;;;;;;1032:19;:96::i;10802:259:21:-;10930:43;;-1:-1:-1;;;10930:43:21;;10962:4;10930:43;;;7429:34:28;-1:-1:-1;;;;;7499:15:28;;;7479:18;;;7472:43;10976:7:21;;10930:23;;;;;;7341:18:28;;10930:43:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;10926:129;;;10999:45;;-1:-1:-1;;;10999:45:21;;-1:-1:-1;;;;;8121:55:28;;;10999:45:21;;;8103:74:28;-1:-1:-1;;8193:18:28;;;8186:34;10999:21:21;;;;;8076:18:28;;10999:45:21;7929:297:28;2522:187:24;2614:6;;;-1:-1:-1;;;;;2630:17:24;;;-1:-1:-1;;;;;;2630:17:24;;;;;;;2662:40;;2614:6;;;2630:17;2614:6;;2662:40;;2595:16;;2662:40;2585:124;2522:187;:::o;964:131::-;2918:13:19;;;;;;;2910:69;;;;-1:-1:-1;;;2910:69:19;;;;;;;:::i;:::-;1026:26:24::1;:24;:26::i;:::-;1062;:24;:26::i;11392:1240:21:-:0;11543:9;11538:966;11562:8;:15;11558:19;;11538:966;;;11598:20;11621:8;11630:1;11621:11;;;;;;;;:::i;:::-;;;;;;;;;;;11598:34;;11650:7;:16;;;;;;;;;;;;11646:848;;;11708:3;;11760:13;;;;-1:-1:-1;;;;;11708:3:21;;;;11686:19;;1910:5;;11750:23;;:7;:23;:::i;:::-;11749:43;;;;:::i;:::-;11815:13;;;;11729:63;;-1:-1:-1;;;;11815:13:21;;;;11810:232;;11926:4;;11920:63;;-1:-1:-1;;;11920:63:21;;;;;16524:25:28;;;11977:4:21;16565:18:28;;;16558:83;-1:-1:-1;;;;;11926:4:21;;;;11920:37;;16497:18:28;;11920:63:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12019:4:21;;-1:-1:-1;;;;;12019:4:21;;-1:-1:-1;;;11810:232:21;12064:17;;;;-1:-1:-1;;;12064:17:21;;;;12059:382;;12140:10;;;;12105:57;;12127:11;;-1:-1:-1;;;;;12140:10:21;12152:9;12105:21;:57::i;:::-;12200:10;;;;12184:65;;-1:-1:-1;;;12184:65:21;;;;;16524:25:28;;;-1:-1:-1;;;;;16585:55:28;;;16565:18;;;16558:83;12200:10:21;;;;12184:41;;16497:18:28;;12184:65:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12059:382;;;12325:10;;;;12296:51;;-1:-1:-1;;;12296:51:21;;-1:-1:-1;;;;;12325:10:21;;;12296:51;;;8103:74:28;8193:18;;;8186:34;;;12296:28:21;;;;;;8076:18:28;;12296:51:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;12387:10:21;;;;12374:48;;;-1:-1:-1;;;;;12387:10:21;;;7789:34:28;;7859:15;;;7854:2;7839:18;;7832:43;7891:18;;7884:34;;;12374:48:21;;7716:2:28;7701:18;12374:48:21;;;;;;;12059:382;12458:21;12470:9;12458:21;;:::i;:::-;;;11668:826;;11646:848;-1:-1:-1;11579:3:21;;;;:::i;:::-;;;;11538:966;;;-1:-1:-1;12535:3:21;;12513:46;;-1:-1:-1;;;;;12535:3:21;12540:8;12550;12513:21;:46::i;:::-;12621:3;;12569:56;;-1:-1:-1;;;12569:56:21;;;;;16524:25:28;;;-1:-1:-1;;;;;12621:3:21;;;16565:18:28;;;16558:83;12569:41:21;;;;;;16497:18:28;;12569:56:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11392:1240;;;;:::o;10207:292::-;10332:40;;-1:-1:-1;;;10332:40:21;;-1:-1:-1;;;;;8121:55:28;;;10332:40:21;;;8103:74:28;8193:18;;;8186:34;;;10332:21:21;;;;;8076:18:28;;10332:40:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;10382:57:21;;-1:-1:-1;;;10382:57:21;;;;;16524:25:28;;;-1:-1:-1;;;;;16585:55:28;;;16565:18;;;16558:83;10382:41:21;;;;;16497:18:28;;10382:57:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;10454:38:21;;;-1:-1:-1;;;;;7807:15:28;;;7789:34;;7859:15;;7854:2;7839:18;;7832:43;7891:18;;;7884:34;;;10454:38:21;;7716:2:28;7701:18;10454:38:21;7526:398:28;683:205:26;822:58;;-1:-1:-1;;;;;8121:55:28;;822:58:26;;;8103:74:28;8193:18;;;8186:34;;;795:86:26;;815:5;;-1:-1:-1;;;845:23:26;8076:18:28;;822:58:26;7929:297:28;3189:706:26;3608:23;3634:69;3662:4;3634:69;;;;;;;;;;;;;;;;;3642:5;-1:-1:-1;;;;;3634:27:26;;;:69;;;;;:::i;:::-;3717:17;;3608:95;;-1:-1:-1;3717:21:26;3713:176;;3812:10;3801:30;;;;;;;;;;;;:::i;:::-;3793:85;;;;-1:-1:-1;;;3793:85:26;;14569:2:28;3793:85:26;;;14551:21:28;14608:2;14588:18;;;14581:30;14647:34;14627:18;;;14620:62;-1:-1:-1;;;14698:18:28;;;14691:40;14748:19;;3793:85:26;14367:406:28;797:69:3;2918:13:19;;;;;;;2910:69;;;;-1:-1:-1;;;2910:69:19;;;;;;;:::i;1101:111:24:-;2918:13:19;;;;;;;2910:69;;;;-1:-1:-1;;;2910:69:19;;;;;;;:::i;:::-;1173:32:24::1;950:10:3::0;1173:18:24::1;:32::i;3514:223:0:-:0;3647:12;3678:52;3700:6;3708:4;3714:1;3717:12;3678:21;:52::i;:::-;3671:59;;3514:223;;;;;;:::o;4601:499::-;4766:12;4823:5;4798:21;:30;;4790:81;;;;-1:-1:-1;;;4790:81:0;;11158:2:28;4790:81:0;;;11140:21:28;11197:2;11177:18;;;11170:30;11236:34;11216:18;;;11209:62;-1:-1:-1;;;11287:18:28;;;11280:36;11333:19;;4790:81:0;10956:402:28;4790:81:0;1098:20:1;;4881:60:0;;;;-1:-1:-1;;;4881:60:0;;13452:2:28;4881:60:0;;;13434:21:28;13491:2;13471:18;;;13464:30;13530:31;13510:18;;;13503:59;13579:18;;4881:60:0;13250:353:28;4881:60:0;4953:12;4967:23;4994:6;-1:-1:-1;;;;;4994:11:0;5013:5;5020:4;4994:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4952:73;;;;5042:51;5059:7;5068:10;5080:12;5042:16;:51::i;:::-;5035:58;4601:499;-1:-1:-1;;;;;;;4601:499:0:o;7214:692::-;7360:12;7388:7;7384:516;;;-1:-1:-1;7418:10:0;7411:17;;7384:516;7529:17;;:21;7525:365;;7723:10;7717:17;7783:15;7770:10;7766:2;7762:19;7755:44;7525:365;7862:12;7855:20;;-1:-1:-1;;;7855:20:0;;;;;;;;:::i;14:719:28:-;57:5;110:3;103:4;95:6;91:17;87:27;77:55;;128:1;125;118:12;77:55;164:6;151:20;190:18;227:2;223;220:10;217:36;;;233:18;;:::i;:::-;308:2;302:9;276:2;362:13;;-1:-1:-1;;358:22:28;;;382:2;354:31;350:40;338:53;;;406:18;;;426:22;;;403:46;400:72;;;452:18;;:::i;:::-;492:10;488:2;481:22;527:2;519:6;512:18;573:3;566:4;561:2;553:6;549:15;545:26;542:35;539:55;;;590:1;587;580:12;539:55;654:2;647:4;639:6;635:17;628:4;620:6;616:17;603:54;701:1;694:4;689:2;681:6;677:15;673:26;666:37;721:6;712:15;;;;;;14:719;;;;:::o;738:247::-;797:6;850:2;838:9;829:7;825:23;821:32;818:52;;;866:1;863;856:12;818:52;905:9;892:23;924:31;949:5;924:31;:::i;990:251::-;1060:6;1113:2;1101:9;1092:7;1088:23;1084:32;1081:52;;;1129:1;1126;1119:12;1081:52;1161:9;1155:16;1180:31;1205:5;1180:31;:::i;1246:388::-;1314:6;1322;1375:2;1363:9;1354:7;1350:23;1346:32;1343:52;;;1391:1;1388;1381:12;1343:52;1430:9;1417:23;1449:31;1474:5;1449:31;:::i;:::-;1499:5;-1:-1:-1;1556:2:28;1541:18;;1528:32;1569:33;1528:32;1569:33;:::i;:::-;1621:7;1611:17;;;1246:388;;;;;:::o;1639:1024::-;1752:6;1760;1768;1776;1784;1792;1800;1853:3;1841:9;1832:7;1828:23;1824:33;1821:53;;;1870:1;1867;1860:12;1821:53;1909:9;1896:23;1928:31;1953:5;1928:31;:::i;:::-;1978:5;-1:-1:-1;2035:2:28;2020:18;;2007:32;2048:33;2007:32;2048:33;:::i;:::-;2100:7;-1:-1:-1;2159:2:28;2144:18;;2131:32;2172:33;2131:32;2172:33;:::i;:::-;2224:7;-1:-1:-1;2283:2:28;2268:18;;2255:32;2296:33;2255:32;2296:33;:::i;:::-;2348:7;-1:-1:-1;2407:3:28;2392:19;;2379:33;2421;2379;2421;:::i;:::-;2473:7;-1:-1:-1;2532:3:28;2517:19;;2504:33;2546;2504;2546;:::i;:::-;2598:7;2588:17;;;2652:3;2641:9;2637:19;2624:33;2614:43;;1639:1024;;;;;;;;;;:::o;2668:382::-;2733:6;2741;2794:2;2782:9;2773:7;2769:23;2765:32;2762:52;;;2810:1;2807;2800:12;2762:52;2849:9;2836:23;2868:31;2893:5;2868:31;:::i;:::-;2918:5;-1:-1:-1;2975:2:28;2960:18;;2947:32;2988:30;2947:32;2988:30;:::i;3055:315::-;3123:6;3131;3184:2;3172:9;3163:7;3159:23;3155:32;3152:52;;;3200:1;3197;3190:12;3152:52;3239:9;3226:23;3258:31;3283:5;3258:31;:::i;:::-;3308:5;3360:2;3345:18;;;;3332:32;;-1:-1:-1;;;3055:315:28:o;3375:241::-;3431:6;3484:2;3472:9;3463:7;3459:23;3455:32;3452:52;;;3500:1;3497;3490:12;3452:52;3539:9;3526:23;3558:28;3580:5;3558:28;:::i;3621:245::-;3688:6;3741:2;3729:9;3720:7;3716:23;3712:32;3709:52;;;3757:1;3754;3747:12;3709:52;3789:9;3783:16;3808:28;3830:5;3808:28;:::i;3871:180::-;3930:6;3983:2;3971:9;3962:7;3958:23;3954:32;3951:52;;;3999:1;3996;3989:12;3951:52;-1:-1:-1;4022:23:28;;3871:180;-1:-1:-1;3871:180:28:o;4056:184::-;4126:6;4179:2;4167:9;4158:7;4154:23;4150:32;4147:52;;;4195:1;4192;4185:12;4147:52;-1:-1:-1;4218:16:28;;4056:184;-1:-1:-1;4056:184:28:o;4245:816::-;4360:6;4368;4376;4384;4392;4445:3;4433:9;4424:7;4420:23;4416:33;4413:53;;;4462:1;4459;4452:12;4413:53;4498:9;4485:23;4475:33;;4558:2;4547:9;4543:18;4530:32;4571:31;4596:5;4571:31;:::i;:::-;4621:5;-1:-1:-1;4677:2:28;4662:18;;4649:32;4700:18;4730:14;;;4727:34;;;4757:1;4754;4747:12;4727:34;4780:50;4822:7;4813:6;4802:9;4798:22;4780:50;:::i;:::-;4770:60;;4883:2;4872:9;4868:18;4855:32;4839:48;;4912:2;4902:8;4899:16;4896:36;;;4928:1;4925;4918:12;4896:36;;4951:52;4995:7;4984:8;4973:9;4969:24;4951:52;:::i;:::-;4245:816;;;;-1:-1:-1;4245:816:28;;5050:3;5035:19;5022:33;;4245:816;-1:-1:-1;;;4245:816:28:o;5066:248::-;5134:6;5142;5195:2;5183:9;5174:7;5170:23;5166:32;5163:52;;;5211:1;5208;5201:12;5163:52;-1:-1:-1;;5234:23:28;;;5304:2;5289:18;;;5276:32;;-1:-1:-1;5066:248:28:o;5319:724::-;5417:6;5425;5433;5441;5449;5457;5510:3;5498:9;5489:7;5485:23;5481:33;5478:53;;;5527:1;5524;5517:12;5478:53;5563:9;5550:23;5540:33;;5620:2;5609:9;5605:18;5592:32;5582:42;;5671:2;5660:9;5656:18;5643:32;5633:42;;5725:2;5714:9;5710:18;5697:32;5738:31;5763:5;5738:31;:::i;:::-;5788:5;-1:-1:-1;5845:3:28;5830:19;;5817:33;5859:30;5817:33;5859:30;:::i;:::-;5908:7;-1:-1:-1;5967:3:28;5952:19;;5939:33;5981:30;5939:33;5981:30;:::i;:::-;6030:7;6020:17;;;5319:724;;;;;;;;:::o;6048:368::-;6145:6;6153;6161;6169;6222:3;6210:9;6201:7;6197:23;6193:33;6190:53;;;6239:1;6236;6229:12;6190:53;-1:-1:-1;;6262:16:28;;6318:2;6303:18;;6297:25;6362:2;6347:18;;6341:25;6406:2;6391:18;;;6385:25;6262:16;;6297:25;;-1:-1:-1;6385:25:28;;-1:-1:-1;6048:368:28;-1:-1:-1;6048:368:28:o;6421:258::-;6463:3;6501:5;6495:12;6528:6;6523:3;6516:19;6544:63;6600:6;6593:4;6588:3;6584:14;6577:4;6570:5;6566:16;6544:63;:::i;:::-;6661:2;6640:15;-1:-1:-1;;6636:29:28;6627:39;;;;6668:4;6623:50;;6421:258;-1:-1:-1;;6421:258:28:o;6684:274::-;6813:3;6851:6;6845:13;6867:53;6913:6;6908:3;6901:4;6893:6;6889:17;6867:53;:::i;:::-;6936:16;;;;;6684:274;-1:-1:-1;;6684:274:28:o;8888:220::-;9037:2;9026:9;9019:21;9000:4;9057:45;9098:2;9087:9;9083:18;9075:6;9057:45;:::i;9113:391::-;9318:2;9307:9;9300:21;9281:4;9344:45;9385:2;9374:9;9370:18;9362:6;9344:45;:::i;:::-;9437:9;9429:6;9425:22;9420:2;9409:9;9405:18;9398:50;9465:33;9491:6;9483;9465:33;:::i;:::-;9457:41;9113:391;-1:-1:-1;;;;;9113:391:28:o;13608:407::-;13810:2;13792:21;;;13849:2;13829:18;;;13822:30;13888:34;13883:2;13868:18;;13861:62;-1:-1:-1;;;13954:2:28;13939:18;;13932:41;14005:3;13990:19;;13608:407::o;19804:128::-;19844:3;19875:1;19871:6;19868:1;19865:13;19862:39;;;19881:18;;:::i;:::-;-1:-1:-1;19917:9:28;;19804:128::o;19937:217::-;19977:1;20003;19993:132;;20047:10;20042:3;20038:20;20035:1;20028:31;20082:4;20079:1;20072:15;20110:4;20107:1;20100:15;19993:132;-1:-1:-1;20139:9:28;;19937:217::o;20159:168::-;20199:7;20265:1;20261;20257:6;20253:14;20250:1;20247:21;20242:1;20235:9;20228:17;20224:45;20221:71;;;20272:18;;:::i;:::-;-1:-1:-1;20312:9:28;;20159:168::o;20332:125::-;20372:4;20400:1;20397;20394:8;20391:34;;;20405:18;;:::i;:::-;-1:-1:-1;20442:9:28;;20332:125::o;20462:258::-;20534:1;20544:113;20558:6;20555:1;20552:13;20544:113;;;20634:11;;;20628:18;20615:11;;;20608:39;20580:2;20573:10;20544:113;;;20675:6;20672:1;20669:13;20666:48;;;-1:-1:-1;;20710:1:28;20692:16;;20685:27;20462:258::o;20725:135::-;20764:3;-1:-1:-1;;20785:17:28;;20782:43;;;20805:18;;:::i;:::-;-1:-1:-1;20852:1:28;20841:13;;20725:135::o;20865:127::-;20926:10;20921:3;20917:20;20914:1;20907:31;20957:4;20954:1;20947:15;20981:4;20978:1;20971:15;20997:127;21058:10;21053:3;21049:20;21046:1;21039:31;21089:4;21086:1;21079:15;21113:4;21110:1;21103:15;21129:127;21190:10;21185:3;21181:20;21178:1;21171:31;21221:4;21218:1;21211:15;21245:4;21242:1;21235:15;21261:154;-1:-1:-1;;;;;21340:5:28;21336:54;21329:5;21326:65;21316:93;;21405:1;21402;21395:12;21420:118;21506:5;21499:13;21492:21;21485:5;21482:32;21472:60;;21528:1;21525;21518:12
Swarm Source
ipfs://8728e401c047672437cb974868e48c5aa55abfa8f67efc73ebb1ec52d6a722bd
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.