Polygon Sponsored slots available. Book your slot here!
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 22,698 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Collateral | 47055421 | 499 days ago | IN | 0 POL | 0.00436056 | ||||
Adjust Trove | 45760248 | 532 days ago | IN | 0 POL | 0.0172986 | ||||
Adjust Trove | 45759301 | 532 days ago | IN | 190.6764 POL | 0.02734085 | ||||
Open Trove | 45757663 | 532 days ago | IN | 300 POL | 0.04810783 | ||||
Open Trove | 44395818 | 566 days ago | IN | 225 POL | 0.07408668 | ||||
Adjust Trove | 42327141 | 619 days ago | IN | 0 POL | 0.06361207 | ||||
Adjust Trove | 42310832 | 620 days ago | IN | 3.05 POL | 0.0528162 | ||||
Open Trove | 42295406 | 620 days ago | IN | 195 POL | 0.09783147 | ||||
Claim Collateral | 39967136 | 681 days ago | IN | 0 POL | 0.00298188 | ||||
Adjust Trove | 39417889 | 695 days ago | IN | 0 POL | 0.03560575 | ||||
Adjust Trove | 39412589 | 696 days ago | IN | 0 POL | 0.09089463 | ||||
Adjust Trove | 39411652 | 696 days ago | IN | 0 POL | 0.04313617 | ||||
Adjust Trove | 39394980 | 696 days ago | IN | 0 POL | 0.05690089 | ||||
Adjust Trove | 39392776 | 696 days ago | IN | 0 POL | 0.04797606 | ||||
Adjust Trove | 39389468 | 696 days ago | IN | 0 POL | 0.09694349 | ||||
Adjust Trove | 39378782 | 696 days ago | IN | 0 POL | 0.0432051 | ||||
Adjust Trove | 39362786 | 697 days ago | IN | 0 POL | 0.09440263 | ||||
Adjust Trove | 39362626 | 697 days ago | IN | 0 POL | 0.06957389 | ||||
Adjust Trove | 39343130 | 697 days ago | IN | 0 POL | 0.13845703 | ||||
Adjust Trove | 39341337 | 697 days ago | IN | 0 POL | 0.05584261 | ||||
Adjust Trove | 39100272 | 704 days ago | IN | 0 POL | 0.10194488 | ||||
Adjust Trove | 39089689 | 704 days ago | IN | 0 POL | 0.07131396 | ||||
Adjust Trove | 39059063 | 705 days ago | IN | 0 POL | 0.03728842 | ||||
Adjust Trove | 39056735 | 705 days ago | IN | 0 POL | 0.04331948 | ||||
Adjust Trove | 39055208 | 705 days ago | IN | 0 POL | 0.04791231 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
45759301 | 532 days ago | 190.6764 POL | ||||
45757663 | 532 days ago | 300 POL | ||||
44395818 | 566 days ago | 225 POL | ||||
42430891 | 617 days ago | 300,000 POL | ||||
42310832 | 620 days ago | 3.05 POL | ||||
42295406 | 620 days ago | 195 POL | ||||
38919027 | 709 days ago | 1,000,000 POL | ||||
38919027 | 709 days ago | 1,000,000 POL | ||||
38822638 | 711 days ago | 980,000 POL | ||||
38822638 | 711 days ago | 980,000 POL | ||||
38822577 | 711 days ago | 980,000 POL | ||||
38822577 | 711 days ago | 980,000 POL | ||||
38814055 | 711 days ago | 1,000,000 POL | ||||
38814055 | 711 days ago | 1,000,000 POL | ||||
38814034 | 711 days ago | 1,000,000 POL | ||||
38814034 | 711 days ago | 1,000,000 POL | ||||
38810343 | 711 days ago | 90,396.0472122 POL | ||||
38810343 | 711 days ago | 90,396.0472122 POL | ||||
38810343 | 711 days ago | 1,000,000 POL | ||||
38810343 | 711 days ago | 1,000,000 POL | ||||
33633492 | 839 days ago | 2,060 POL | ||||
33633239 | 839 days ago | 4,500 POL | ||||
33631249 | 839 days ago | 9,640 POL | ||||
33531951 | 841 days ago | 280 POL | ||||
33530875 | 841 days ago | 480 POL |
Loading...
Loading
Contract Name:
BorrowerOperations
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-27 */ // File: contracts/Interfaces/IBorrowerOperations.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.11; // Common interface for the Trove Manager. interface IBorrowerOperations { // --- Events --- event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event StabilityPoolAddressChanged(address _stabilityPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event LUSDTokenAddressChanged(address _lusdTokenAddress); event LQTYStakingAddressChanged(address _lqtyStakingAddress); event TroveCreated(address indexed _borrower, uint arrayIndex); event TroveUpdated(address indexed _borrower, uint _debt, uint _coll, uint stake, uint8 operation); event LUSDBorrowingFeePaid(address indexed _borrower, uint _LUSDFee); // --- Functions --- function setAddresses( address _troveManagerAddress, address _activePoolAddress, address _defaultPoolAddress, address _stabilityPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _sortedTrovesAddress, address _lusdTokenAddress, address _lqtyStakingAddress ) external; function openTrove(uint _maxFee, uint _LUSDAmount, address _upperHint, address _lowerHint) external payable; function addColl(address _upperHint, address _lowerHint) external payable; function moveETHGainToTrove(address _user, address _upperHint, address _lowerHint) external payable; function withdrawColl(uint _amount, address _upperHint, address _lowerHint) external; function withdrawLUSD(uint _maxFee, uint _amount, address _upperHint, address _lowerHint) external; function repayLUSD(uint _amount, address _upperHint, address _lowerHint) external; function closeTrove() external; function adjustTrove(uint _maxFee, uint _collWithdrawal, uint _debtChange, bool isDebtIncrease, address _upperHint, address _lowerHint) external payable; function claimCollateral() external; function getCompositeDebt(uint _debt) external pure returns (uint); } // File: contracts/Interfaces/IPriceFeed.sol interface IPriceFeed { // --- Events --- event LastGoodPriceUpdated(uint _lastGoodPrice); // --- Function --- function fetchPrice() external returns (uint); } // File: contracts/Interfaces/ILiquityBase.sol interface ILiquityBase { function priceFeed() external view returns (IPriceFeed); } // File: contracts/Interfaces/IStabilityPool.sol /* * The Stability Pool holds LUSD tokens deposited by Stability Pool depositors. * * When a trove is liquidated, then depending on system conditions, some of its LUSD debt gets offset with * LUSD in the Stability Pool: that is, the offset debt evaporates, and an equal amount of LUSD tokens in the Stability Pool is burned. * * Thus, a liquidation causes each depositor to receive a LUSD loss, in proportion to their deposit as a share of total deposits. * They also receive an ETH gain, as the ETH collateral of the liquidated trove is distributed among Stability depositors, * in the same proportion. * * When a liquidation occurs, it depletes every deposit by the same fraction: for example, a liquidation that depletes 40% * of the total LUSD in the Stability Pool, depletes 40% of each deposit. * * A deposit that has experienced a series of liquidations is termed a "compounded deposit": each liquidation depletes the deposit, * multiplying it by some factor in range ]0,1[ * * Please see the implementation spec in the proof document, which closely follows on from the compounded deposit / ETH gain derivations: * https://github.com/liquity/liquity/blob/master/papers/Scalable_Reward_Distribution_with_Compounding_Stakes.pdf * * --- LQTY ISSUANCE TO STABILITY POOL DEPOSITORS --- * * An LQTY issuance event occurs at every deposit operation, and every liquidation. * * Each deposit is tagged with the address of the front end through which it was made. * * All deposits earn a share of the issued LQTY in proportion to the deposit as a share of total deposits. The LQTY earned * by a given deposit, is split between the depositor and the front end through which the deposit was made, based on the front end's kickbackRate. * * Please see the system Readme for an overview: * https://github.com/liquity/dev/blob/main/README.md#lqty-issuance-to-stability-providers */ interface IStabilityPool { // --- Events --- event StabilityPoolETHBalanceUpdated(uint _newBalance); event StabilityPoolLUSDBalanceUpdated(uint _newBalance); event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _newActivePoolAddress); event DefaultPoolAddressChanged(address _newDefaultPoolAddress); event LUSDTokenAddressChanged(address _newLUSDTokenAddress); event SortedTrovesAddressChanged(address _newSortedTrovesAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event CommunityIssuanceAddressChanged(address _newCommunityIssuanceAddress); event P_Updated(uint _P); event S_Updated(uint _S, uint128 _epoch, uint128 _scale); event G_Updated(uint _G, uint128 _epoch, uint128 _scale); event EpochUpdated(uint128 _currentEpoch); event ScaleUpdated(uint128 _currentScale); event FrontEndRegistered(address indexed _frontEnd, uint _kickbackRate); event FrontEndTagSet(address indexed _depositor, address indexed _frontEnd); event DepositSnapshotUpdated(address indexed _depositor, uint _P, uint _S, uint _G); event FrontEndSnapshotUpdated(address indexed _frontEnd, uint _P, uint _G); event UserDepositChanged(address indexed _depositor, uint _newDeposit); event FrontEndStakeChanged(address indexed _frontEnd, uint _newFrontEndStake, address _depositor); event ETHGainWithdrawn(address indexed _depositor, uint _ETH, uint _LUSDLoss); event LQTYPaidToDepositor(address indexed _depositor, uint _LQTY); event LQTYPaidToFrontEnd(address indexed _frontEnd, uint _LQTY); event EtherSent(address _to, uint _amount); // --- Functions --- /* * Called only once on init, to set addresses of other Liquity contracts * Callable only by owner, renounces ownership at the end */ function setAddresses( address _borrowerOperationsAddress, address _troveManagerAddress, address _activePoolAddress, address _lusdTokenAddress, address _sortedTrovesAddress, address _priceFeedAddress, address _communityIssuanceAddress ) external; /* * Initial checks: * - Frontend is registered or zero address * - Sender is not a registered frontend * - _amount is not zero * --- * - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends * - Tags the deposit with the provided front end tag param, if it's a new deposit * - Sends depositor's accumulated gains (LQTY, ETH) to depositor * - Sends the tagged front end's accumulated LQTY gains to the tagged front end * - Increases deposit and tagged front end's stake, and takes new snapshots for each. */ function provideToSP(uint _amount, address _frontEndTag) external; /* * Initial checks: * - _amount is zero or there are no under collateralized troves left in the system * - User has a non zero deposit * --- * - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends * - Removes the deposit's front end tag if it is a full withdrawal * - Sends all depositor's accumulated gains (LQTY, ETH) to depositor * - Sends the tagged front end's accumulated LQTY gains to the tagged front end * - Decreases deposit and tagged front end's stake, and takes new snapshots for each. * * If _amount > userDeposit, the user withdraws all of their compounded deposit. */ function withdrawFromSP(uint _amount) external; /* * Initial checks: * - User has a non zero deposit * - User has an open trove * - User has some ETH gain * --- * - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends * - Sends all depositor's LQTY gain to depositor * - Sends all tagged front end's LQTY gain to the tagged front end * - Transfers the depositor's entire ETH gain from the Stability Pool to the caller's trove * - Leaves their compounded deposit in the Stability Pool * - Updates snapshots for deposit and tagged front end stake */ function withdrawETHGainToTrove(address _upperHint, address _lowerHint) external; /* * Initial checks: * - Frontend (sender) not already registered * - User (sender) has no deposit * - _kickbackRate is in the range [0, 100%] * --- * Front end makes a one-time selection of kickback rate upon registering */ function registerFrontEnd(uint _kickbackRate) external; /* * Initial checks: * - Caller is TroveManager * --- * Cancels out the specified debt against the LUSD contained in the Stability Pool (as far as possible) * and transfers the Trove's ETH collateral from ActivePool to StabilityPool. * Only called by liquidation functions in the TroveManager. */ function offset(uint _debt, uint _coll) external; /* * Returns the total amount of ETH held by the pool, accounted in an internal variable instead of `balance`, * to exclude edge cases like ETH received from a self-destruct. */ function getETH() external view returns (uint); /* * Returns LUSD held in the pool. Changes when users deposit/withdraw, and when Trove debt is offset. */ function getTotalLUSDDeposits() external view returns (uint); /* * Calculates the ETH gain earned by the deposit since its last snapshots were taken. */ function getDepositorETHGain(address _depositor) external view returns (uint); /* * Calculate the LQTY gain earned by a deposit since its last snapshots were taken. * If not tagged with a front end, the depositor gets a 100% cut of what their deposit earned. * Otherwise, their cut of the deposit's earnings is equal to the kickbackRate, set by the front end through * which they made their deposit. */ function getDepositorLQTYGain(address _depositor) external view returns (uint); /* * Return the LQTY gain earned by the front end. */ function getFrontEndLQTYGain(address _frontEnd) external view returns (uint); /* * Return the user's compounded deposit. */ function getCompoundedLUSDDeposit(address _depositor) external view returns (uint); /* * Return the front end's compounded stake. * * The front end's compounded stake is equal to the sum of its depositors' compounded deposits. */ function getCompoundedFrontEndStake(address _frontEnd) external view returns (uint); /* * Fallback function * Only callable by Active Pool, it just accounts for ETH received * receive() external payable; */ } // File: contracts/Dependencies/IERC20.sol /** * Based on the OpenZeppelin IER20 interface: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol * * @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); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); /** * @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 name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/Dependencies/IERC2612.sol /** * @dev Interface of the ERC2612 standard as defined in the EIP. * * Adds the {permit} method, which can be used to change one's * {IERC20-allowance} without having to send a transaction, by signing a * message. This allows users to spend tokens without having to hold Ether. * * See https://eips.ethereum.org/EIPS/eip-2612. * * Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/ */ interface IERC2612 { /** * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens, * given `owner`'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; /** * @dev Returns the current ERC2612 nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases `owner`'s nonce by one. This * prevents a signature from being used multiple times. * * `owner` can limit the time a Permit is valid for by setting `deadline` to * a value in the near future. The deadline argument can be set to uint(-1) to * create Permits that effectively never expire. */ function nonces(address owner) external view returns (uint256); function version() external view returns (string memory); function permitTypeHash() external view returns (bytes32); function domainSeparator() external view returns (bytes32); } // File: contracts/Interfaces/ILUSDToken.sol interface ILUSDToken is IERC20, IERC2612 { // --- Events --- event TroveManagerAddressChanged(address _troveManagerAddress); event StabilityPoolAddressChanged(address _newStabilityPoolAddress); event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event LUSDTokenBalanceUpdated(address _user, uint _amount); // --- Functions --- function mint(address _account, uint256 _amount) external; function burn(address _account, uint256 _amount) external; function sendToPool(address _sender, address poolAddress, uint256 _amount) external; function returnFromPool(address poolAddress, address user, uint256 _amount ) external; } // File: contracts/Interfaces/ILQTYToken.sol interface ILQTYToken is IERC20, IERC2612 { // --- Events --- event CommunityIssuanceAddressSet(address _communityIssuanceAddress); event LQTYStakingAddressSet(address _lqtyStakingAddress); event LockupContractFactoryAddressSet(address _lockupContractFactoryAddress); event SwapAndLiquify(uint256 amountSwapped, uint256 ftmReceived, uint256 amountIntoLiqudity); // --- Functions --- function sendToLQTYStaking(address _sender, uint256 _amount) external; function getDeploymentStartTime() external view returns (uint256); } // File: contracts/Interfaces/ILQTYStaking.sol interface ILQTYStaking { // --- Events -- event LQTYTokenAddressSet(address _lqtyTokenAddress); event LUSDTokenAddressSet(address _lusdTokenAddress); event TroveManagerAddressSet(address _troveManager); event BorrowerOperationsAddressSet(address _borrowerOperationsAddress); event ActivePoolAddressSet(address _activePoolAddress); event StakeChanged(address indexed staker, uint newStake); event StakingGainsWithdrawn(address indexed staker, uint LUSDGain, uint ETHGain, uint LQTYGain); event F_ETHUpdated(uint _F_ETH); event F_LUSDUpdated(uint _F_LUSD); event F_LQTYUpdated(uint _F_LQTY); event TotalLQTYStakedUpdated(uint _totalLQTYStaked); event EtherSent(address _account, uint _amount); event StakerSnapshotsUpdated(address _staker, uint _F_ETH, uint _F_LUSD, uint _F_LQTY); // --- Functions --- function setAddresses ( address _lqtyTokenAddress, address _lusdTokenAddress, address _troveManagerAddress, address _borrowerOperationsAddress, address _activePoolAddress ) external; function stake(uint _LQTYamount) external; function unstake(uint _LQTYamount) external; function increaseF_ETH(uint _ETHFee) external; function increaseF_LUSD(uint _LUSDFee) external; function increaseF_LQTY(uint _LQTYFee) external; function getPendingETHGain(address _user) external view returns (uint); function getPendingLUSDGain(address _user) external view returns (uint); function getPendingLQTYGain(address _user) external view returns (uint); } // File: contracts/Interfaces/ITroveManager.sol // Common interface for the Trove Manager. interface ITroveManager is ILiquityBase { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event LUSDTokenAddressChanged(address _newLUSDTokenAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event StabilityPoolAddressChanged(address _stabilityPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event LQTYTokenAddressChanged(address _lqtyTokenAddress); event LQTYStakingAddressChanged(address _lqtyStakingAddress); event Liquidation(uint _liquidatedDebt, uint _liquidatedColl, uint _collGasCompensation, uint _LUSDGasCompensation); event Redemption(uint _attemptedLUSDAmount, uint _actualLUSDAmount, uint _ETHSent, uint _ETHFee); event TroveUpdated(address indexed _borrower, uint _debt, uint _coll, uint stake, uint8 operation); event TroveLiquidated(address indexed _borrower, uint _debt, uint _coll, uint8 operation); event BaseRateUpdated(uint _baseRate); event LastFeeOpTimeUpdated(uint _lastFeeOpTime); event TotalStakesUpdated(uint _newTotalStakes); event SystemSnapshotsUpdated(uint _totalStakesSnapshot, uint _totalCollateralSnapshot); event LTermsUpdated(uint _L_ETH, uint _L_LUSDDebt); event TroveSnapshotsUpdated(uint _L_ETH, uint _L_LUSDDebt); event TroveIndexUpdated(address _borrower, uint _newIndex); // --- Functions --- function setAddresses( address _borrowerOperationsAddress, address _activePoolAddress, address _defaultPoolAddress, address _stabilityPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _lusdTokenAddress, address _sortedTrovesAddress, address _lqtyTokenAddress, address _lqtyStakingAddress ) external; function stabilityPool() external view returns (IStabilityPool); function lusdToken() external view returns (ILUSDToken); function lqtyToken() external view returns (ILQTYToken); function lqtyStaking() external view returns (ILQTYStaking); function getTroveOwnersCount() external view returns (uint); function getTroveFromTroveOwnersArray(uint _index) external view returns (address); function getNominalICR(address _borrower) external view returns (uint); function getCurrentICR(address _borrower, uint _price) external view returns (uint); function liquidate(address _borrower) external; function liquidateTroves(uint _n) external; function batchLiquidateTroves(address[] calldata _troveArray) external; function redeemCollateral( uint _LUSDAmount, address _firstRedemptionHint, address _upperPartialRedemptionHint, address _lowerPartialRedemptionHint, uint _partialRedemptionHintNICR, uint _maxIterations, uint _maxFee ) external; function updateStakeAndTotalStakes(address _borrower) external returns (uint); function updateTroveRewardSnapshots(address _borrower) external; function addTroveOwnerToArray(address _borrower) external returns (uint index); function applyPendingRewards(address _borrower) external; function getPendingETHReward(address _borrower) external view returns (uint); function getPendingLUSDDebtReward(address _borrower) external view returns (uint); function hasPendingRewards(address _borrower) external view returns (bool); function getEntireDebtAndColl(address _borrower) external view returns ( uint debt, uint coll, uint pendingLUSDDebtReward, uint pendingETHReward ); function closeTrove(address _borrower) external; function removeStake(address _borrower) external; function getRedemptionRate() external view returns (uint); function getRedemptionRateWithDecay() external view returns (uint); function getRedemptionFeeWithDecay(uint _ETHDrawn) external view returns (uint); function getBorrowingRate() external view returns (uint); function getBorrowingRateWithDecay() external view returns (uint); function getBorrowingFee(uint LUSDDebt) external view returns (uint); function getBorrowingFeeWithDecay(uint _LUSDDebt) external view returns (uint); function decayBaseRateFromBorrowing() external; function getTroveStatus(address _borrower) external view returns (uint); function getTroveStake(address _borrower) external view returns (uint); function getTroveDebt(address _borrower) external view returns (uint); function getTroveColl(address _borrower) external view returns (uint); function setTroveStatus(address _borrower, uint num) external; function increaseTroveColl(address _borrower, uint _collIncrease) external returns (uint); function decreaseTroveColl(address _borrower, uint _collDecrease) external returns (uint); function increaseTroveDebt(address _borrower, uint _debtIncrease) external returns (uint); function decreaseTroveDebt(address _borrower, uint _collDecrease) external returns (uint); function getTCR(uint _price) external view returns (uint); function checkRecoveryMode(uint _price) external view returns (bool); } // File: contracts/Interfaces/ICollSurplusPool.sol interface ICollSurplusPool { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _newActivePoolAddress); event CollBalanceUpdated(address indexed _account, uint _newBalance); event EtherSent(address _to, uint _amount); // --- Contract setters --- function setAddresses( address _borrowerOperationsAddress, address _troveManagerAddress, address _activePoolAddress ) external; function getETH() external view returns (uint); function getCollateral(address _account) external view returns (uint); function accountSurplus(address _account, uint _amount) external; function claimColl(address _account) external; } // File: contracts/Interfaces/ISortedTroves.sol // Common interface for the SortedTroves Doubly Linked List. interface ISortedTroves { // --- Events --- event SortedTrovesAddressChanged(address _sortedDoublyLLAddress); event BorrowerOperationsAddressChanged(address _borrowerOperationsAddress); event NodeAdded(address _id, uint _NICR); event NodeRemoved(address _id); // --- Functions --- function setParams(uint256 _size, address _TroveManagerAddress, address _borrowerOperationsAddress) external; function insert(address _id, uint256 _ICR, address _prevId, address _nextId) external; function remove(address _id) external; function reInsert(address _id, uint256 _newICR, address _prevId, address _nextId) external; function contains(address _id) external view returns (bool); function isFull() external view returns (bool); function isEmpty() external view returns (bool); function getSize() external view returns (uint256); function getMaxSize() external view returns (uint256); function getFirst() external view returns (address); function getLast() external view returns (address); function getNext(address _id) external view returns (address); function getPrev(address _id) external view returns (address); function validInsertPosition(uint256 _ICR, address _prevId, address _nextId) external view returns (bool); function findInsertPosition(uint256 _ICR, address _prevId, address _nextId) external view returns (address, address); } // File: contracts/Dependencies/BaseMath.sol contract BaseMath { uint constant public DECIMAL_PRECISION = 1e18; } // File: contracts/Dependencies/SafeMath.sol /** * Based on OpenZeppelin's SafeMath: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol * * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/Dependencies/console.sol // Buidler's helper contract for console logging library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function log() internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log()")); ignored; } function logInt(int p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(int)", p0)); ignored; } function logUint(uint p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0)); ignored; } function logString(string memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0)); ignored; } function logBool(bool p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0)); ignored; } function logAddress(address p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0)); ignored; } function logBytes(bytes memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes)", p0)); ignored; } function logByte(byte p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(byte)", p0)); ignored; } function logBytes1(bytes1 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes1)", p0)); ignored; } function logBytes2(bytes2 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes2)", p0)); ignored; } function logBytes3(bytes3 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes3)", p0)); ignored; } function logBytes4(bytes4 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes4)", p0)); ignored; } function logBytes5(bytes5 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes5)", p0)); ignored; } function logBytes6(bytes6 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes6)", p0)); ignored; } function logBytes7(bytes7 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes7)", p0)); ignored; } function logBytes8(bytes8 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes8)", p0)); ignored; } function logBytes9(bytes9 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes9)", p0)); ignored; } function logBytes10(bytes10 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes10)", p0)); ignored; } function logBytes11(bytes11 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes11)", p0)); ignored; } function logBytes12(bytes12 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes12)", p0)); ignored; } function logBytes13(bytes13 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes13)", p0)); ignored; } function logBytes14(bytes14 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes14)", p0)); ignored; } function logBytes15(bytes15 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes15)", p0)); ignored; } function logBytes16(bytes16 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes16)", p0)); ignored; } function logBytes17(bytes17 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes17)", p0)); ignored; } function logBytes18(bytes18 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes18)", p0)); ignored; } function logBytes19(bytes19 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes19)", p0)); ignored; } function logBytes20(bytes20 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes20)", p0)); ignored; } function logBytes21(bytes21 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes21)", p0)); ignored; } function logBytes22(bytes22 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes22)", p0)); ignored; } function logBytes23(bytes23 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes23)", p0)); ignored; } function logBytes24(bytes24 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes24)", p0)); ignored; } function logBytes25(bytes25 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes25)", p0)); ignored; } function logBytes26(bytes26 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes26)", p0)); ignored; } function logBytes27(bytes27 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes27)", p0)); ignored; } function logBytes28(bytes28 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes28)", p0)); ignored; } function logBytes29(bytes29 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes29)", p0)); ignored; } function logBytes30(bytes30 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes30)", p0)); ignored; } function logBytes31(bytes31 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes31)", p0)); ignored; } function logBytes32(bytes32 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes32)", p0)); ignored; } function log(uint p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0)); ignored; } function log(string memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0)); ignored; } function log(bool p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0)); ignored; } function log(address p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0)); ignored; } function log(uint p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint)", p0, p1)); ignored; } function log(uint p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string)", p0, p1)); ignored; } function log(uint p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool)", p0, p1)); ignored; } function log(uint p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address)", p0, p1)); ignored; } function log(string memory p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint)", p0, p1)); ignored; } function log(string memory p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string)", p0, p1)); ignored; } function log(string memory p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool)", p0, p1)); ignored; } function log(string memory p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address)", p0, p1)); ignored; } function log(bool p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint)", p0, p1)); ignored; } function log(bool p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string)", p0, p1)); ignored; } function log(bool p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool)", p0, p1)); ignored; } function log(bool p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address)", p0, p1)); ignored; } function log(address p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint)", p0, p1)); ignored; } function log(address p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string)", p0, p1)); ignored; } function log(address p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool)", p0, p1)); ignored; } function log(address p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address)", p0, p1)); ignored; } function log(uint p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); ignored; } function log(uint p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); ignored; } function log(uint p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); ignored; } function log(uint p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); ignored; } function log(uint p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); ignored; } function log(bool p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); ignored; } function log(bool p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); ignored; } function log(bool p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); ignored; } function log(bool p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); ignored; } function log(address p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); ignored; } function log(address p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); ignored; } function log(address p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); ignored; } function log(address p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); ignored; } function log(address p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); ignored; } function log(address p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); ignored; } function log(address p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); ignored; } function log(address p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); ignored; } function log(address p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); ignored; } function log(address p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); ignored; } function log(address p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); ignored; } function log(address p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); ignored; } } // File: contracts/Dependencies/LiquityMath.sol library LiquityMath { using SafeMath for uint; uint internal constant DECIMAL_PRECISION = 1e18; /* Precision for Nominal ICR (independent of price). Rationale for the value: * * - Making it “too high” could lead to overflows. * - Making it “too low” could lead to an ICR equal to zero, due to truncation from Solidity floor division. * * This value of 1e20 is chosen for safety: the NICR will only overflow for numerator > ~1e39 ETH, * and will only truncate to 0 if the denominator is at least 1e20 times greater than the numerator. * */ uint internal constant NICR_PRECISION = 1e20; function _min(uint _a, uint _b) internal pure returns (uint) { return (_a < _b) ? _a : _b; } function _max(uint _a, uint _b) internal pure returns (uint) { return (_a >= _b) ? _a : _b; } /* * Multiply two decimal numbers and use normal rounding rules: * -round product up if 19'th mantissa digit >= 5 * -round product down if 19'th mantissa digit < 5 * * Used only inside the exponentiation, _decPow(). */ function decMul(uint x, uint y) internal pure returns (uint decProd) { uint prod_xy = x.mul(y); decProd = prod_xy.add(DECIMAL_PRECISION / 2).div(DECIMAL_PRECISION); } /* * _decPow: Exponentiation function for 18-digit decimal base, and integer exponent n. * * Uses the efficient "exponentiation by squaring" algorithm. O(log(n)) complexity. * * Called by two functions that represent time in units of minutes: * 1) TroveManager._calcDecayedBaseRate * 2) CommunityIssuance._getCumulativeIssuanceFraction * * The exponent is capped to avoid reverting due to overflow. The cap 525600000 equals * "minutes in 1000 years": 60 * 24 * 365 * 1000 * * If a period of > 1000 years is ever used as an exponent in either of the above functions, the result will be * negligibly different from just passing the cap, since: * * In function 1), the decayed base rate will be 0 for 1000 years or > 1000 years * In function 2), the difference in tokens issued at 1000 years and any time > 1000 years, will be negligible */ function _decPow(uint _base, uint _minutes) internal pure returns (uint) { if (_minutes > 525600000) {_minutes = 525600000;} // cap to avoid overflow if (_minutes == 0) {return DECIMAL_PRECISION;} uint y = DECIMAL_PRECISION; uint x = _base; uint n = _minutes; // Exponentiation-by-squaring while (n > 1) { if (n % 2 == 0) { x = decMul(x, x); n = n.div(2); } else { // if (n % 2 != 0) y = decMul(x, y); x = decMul(x, x); n = (n.sub(1)).div(2); } } return decMul(x, y); } function _getAbsoluteDifference(uint _a, uint _b) internal pure returns (uint) { return (_a >= _b) ? _a.sub(_b) : _b.sub(_a); } function _computeNominalCR(uint _coll, uint _debt) internal pure returns (uint) { if (_debt > 0) { return _coll.mul(NICR_PRECISION).div(_debt); } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2**256 - 1; } } function _computeCR(uint _coll, uint _debt, uint _price) internal pure returns (uint) { if (_debt > 0) { uint newCollRatio = _coll.mul(_price).div(_debt); return newCollRatio; } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2**256 - 1; } } } // File: contracts/Interfaces/IPool.sol // Common interface for the Pools. interface IPool { // --- Events --- event ETHBalanceUpdated(uint _newBalance); event LUSDBalanceUpdated(uint _newBalance); event ActivePoolAddressChanged(address _newActivePoolAddress); event DefaultPoolAddressChanged(address _newDefaultPoolAddress); event StabilityPoolAddressChanged(address _newStabilityPoolAddress); event EtherSent(address _to, uint _amount); // --- Functions --- function getETH() external view returns (uint); function getLUSDDebt() external view returns (uint); function increaseLUSDDebt(uint _amount) external; function decreaseLUSDDebt(uint _amount) external; } // File: contracts/Interfaces/IActivePool.sol interface IActivePool is IPool { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolLUSDDebtUpdated(uint _LUSDDebt); event ActivePoolETHBalanceUpdated(uint _ETH); // --- Functions --- function sendETH(address _account, uint _amount) external; } // File: contracts/Interfaces/IDefaultPool.sol interface IDefaultPool is IPool { // --- Events --- event TroveManagerAddressChanged(address _newTroveManagerAddress); event DefaultPoolLUSDDebtUpdated(uint _LUSDDebt); event DefaultPoolETHBalanceUpdated(uint _ETH); // --- Functions --- function sendETHToActivePool(uint _amount) external; } // File: contracts/Dependencies/LiquityBase.sol /* * Base contract for TroveManager, BorrowerOperations and StabilityPool. Contains global system constants and * common functions. */ contract LiquityBase is BaseMath, ILiquityBase { using SafeMath for uint; uint constant public _100pct = 1000000000000000000; // 1e18 == 100% // Minimum collateral ratio for individual troves uint constant public MCR = 1100000000000000000; // 110% // Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered. uint constant public CCR = 1500000000000000000; // 150% // Amount of LUSD to be locked in gas pool on opening troves uint constant public LUSD_GAS_COMPENSATION = 10e18; // Minimum amount of net LUSD debt a trove must have uint constant public MIN_NET_DEBT = 90e18; // uint constant public MIN_NET_DEBT = 0; uint constant public PERCENT_DIVISOR = 200; // dividing by 200 yields 0.5% uint constant public BORROWING_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 5; // 0.5% IActivePool public activePool; IDefaultPool public defaultPool; IPriceFeed public override priceFeed; // --- Gas compensation functions --- // Returns the composite debt (drawn debt + gas compensation) of a trove, for the purpose of ICR calculation function _getCompositeDebt(uint _debt) internal pure returns (uint) { return _debt.add(LUSD_GAS_COMPENSATION); } function _getNetDebt(uint _debt) internal pure returns (uint) { return _debt.sub(LUSD_GAS_COMPENSATION); } // Return the amount of ETH to be drawn from a trove's collateral and sent as gas compensation. function _getCollGasCompensation(uint _entireColl) internal pure returns (uint) { return _entireColl / PERCENT_DIVISOR; } function getEntireSystemColl() public view returns (uint entireSystemColl) { uint activeColl = activePool.getETH(); uint liquidatedColl = defaultPool.getETH(); return activeColl.add(liquidatedColl); } function getEntireSystemDebt() public view returns (uint entireSystemDebt) { uint activeDebt = activePool.getLUSDDebt(); uint closedDebt = defaultPool.getLUSDDebt(); return activeDebt.add(closedDebt); } function _getTCR(uint _price) internal view returns (uint TCR) { uint entireSystemColl = getEntireSystemColl(); uint entireSystemDebt = getEntireSystemDebt(); TCR = LiquityMath._computeCR(entireSystemColl, entireSystemDebt, _price); return TCR; } function _checkRecoveryMode(uint _price) internal view returns (bool) { uint TCR = _getTCR(_price); return TCR < CCR; } function _requireUserAcceptsFee(uint _fee, uint _amount, uint _maxFeePercentage) internal pure { uint feePercentage = _fee.mul(DECIMAL_PRECISION).div(_amount); require(feePercentage <= _maxFeePercentage, "Fee exceeded provided maximum"); } } // File: contracts/Dependencies/Ownable.sol /** * Based on OpenZeppelin's Ownable contract: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.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. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. * * NOTE: This function is not safe, as it doesn’t check owner is calling it. * Make sure you check it before calling it. */ function _renounceOwnership() internal { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } } // File: contracts/Dependencies/CheckContract.sol contract CheckContract { /** * Check that the account is an already deployed non-destroyed contract. * See: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L12 */ function checkContract(address _account) internal view { require(_account != address(0), "Account cannot be zero address"); uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(_account) } require(size > 0, "Account code size cannot be zero"); } } // File: contracts/BorrowerOperations.sol contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOperations { string constant public NAME = "BorrowerOperations"; // --- Connected contract declarations --- ITroveManager public troveManager; address stabilityPoolAddress; address gasPoolAddress; ICollSurplusPool collSurplusPool; ILQTYStaking public lqtyStaking; address public lqtyStakingAddress; ILUSDToken public lusdToken; // A doubly linked list of Troves, sorted by their collateral ratios ISortedTroves public sortedTroves; /* --- Variable container structs --- Used to hold, return and assign variables inside a function, in order to avoid the error: "CompilerError: Stack too deep". */ struct LocalVariables_adjustTrove { uint price; uint collChange; uint netDebtChange; bool isCollIncrease; uint debt; uint coll; uint oldICR; uint newICR; uint newTCR; uint LUSDFee; uint newDebt; uint newColl; uint stake; } struct LocalVariables_openTrove { uint price; uint LUSDFee; uint netDebt; uint compositeDebt; uint ICR; uint NICR; uint stake; uint arrayIndex; } struct ContractsCache { ITroveManager troveManager; IActivePool activePool; ILUSDToken lusdToken; } enum BorrowerOperation { openTrove, closeTrove, adjustTrove } event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event StabilityPoolAddressChanged(address _stabilityPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event LUSDTokenAddressChanged(address _lusdTokenAddress); event LQTYStakingAddressChanged(address _lqtyStakingAddress); event TroveCreated(address indexed _borrower, uint arrayIndex); event TroveUpdated(address indexed _borrower, uint _debt, uint _coll, uint stake, BorrowerOperation operation); event LUSDBorrowingFeePaid(address indexed _borrower, uint _LUSDFee); // --- Dependency setters --- function setAddresses( address _troveManagerAddress, address _activePoolAddress, address _defaultPoolAddress, address _stabilityPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _sortedTrovesAddress, address _lusdTokenAddress, address _lqtyStakingAddress ) external override onlyOwner { // This makes impossible to open a trove with zero withdrawn LUSD assert(MIN_NET_DEBT > 0); checkContract(_troveManagerAddress); checkContract(_activePoolAddress); checkContract(_defaultPoolAddress); checkContract(_stabilityPoolAddress); checkContract(_gasPoolAddress); checkContract(_collSurplusPoolAddress); checkContract(_priceFeedAddress); checkContract(_sortedTrovesAddress); checkContract(_lusdTokenAddress); checkContract(_lqtyStakingAddress); troveManager = ITroveManager(_troveManagerAddress); activePool = IActivePool(_activePoolAddress); defaultPool = IDefaultPool(_defaultPoolAddress); stabilityPoolAddress = _stabilityPoolAddress; gasPoolAddress = _gasPoolAddress; collSurplusPool = ICollSurplusPool(_collSurplusPoolAddress); priceFeed = IPriceFeed(_priceFeedAddress); sortedTroves = ISortedTroves(_sortedTrovesAddress); lusdToken = ILUSDToken(_lusdTokenAddress); lqtyStakingAddress = _lqtyStakingAddress; lqtyStaking = ILQTYStaking(_lqtyStakingAddress); emit TroveManagerAddressChanged(_troveManagerAddress); emit ActivePoolAddressChanged(_activePoolAddress); emit DefaultPoolAddressChanged(_defaultPoolAddress); emit StabilityPoolAddressChanged(_stabilityPoolAddress); emit GasPoolAddressChanged(_gasPoolAddress); emit CollSurplusPoolAddressChanged(_collSurplusPoolAddress); emit PriceFeedAddressChanged(_priceFeedAddress); emit SortedTrovesAddressChanged(_sortedTrovesAddress); emit LUSDTokenAddressChanged(_lusdTokenAddress); emit LQTYStakingAddressChanged(_lqtyStakingAddress); _renounceOwnership(); } // --- Borrower Trove Operations --- function openTrove(uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) external payable override { ContractsCache memory contractsCache = ContractsCache(troveManager, activePool, lusdToken); LocalVariables_openTrove memory vars; vars.price = priceFeed.fetchPrice(); bool isRecoveryMode = _checkRecoveryMode(vars.price); _requireValidMaxFeePercentage(_maxFeePercentage, isRecoveryMode); _requireTroveisNotActive(contractsCache.troveManager, msg.sender); vars.LUSDFee; vars.netDebt = _LUSDAmount; if (!isRecoveryMode) { vars.LUSDFee = _triggerBorrowingFee(contractsCache.troveManager, contractsCache.lusdToken, _LUSDAmount, _maxFeePercentage); vars.netDebt = vars.netDebt.add(vars.LUSDFee); } _requireAtLeastMinNetDebt(vars.netDebt); // ICR is based on the composite debt, i.e. the requested LUSD amount + LUSD borrowing fee + LUSD gas comp. vars.compositeDebt = _getCompositeDebt(vars.netDebt); assert(vars.compositeDebt > 0); vars.ICR = LiquityMath._computeCR(msg.value, vars.compositeDebt, vars.price); vars.NICR = LiquityMath._computeNominalCR(msg.value, vars.compositeDebt); if (isRecoveryMode) { _requireICRisAboveCCR(vars.ICR); } else { _requireICRisAboveMCR(vars.ICR); uint newTCR = _getNewTCRFromTroveChange(msg.value, true, vars.compositeDebt, true, vars.price); // bools: coll increase, debt increase _requireNewTCRisAboveCCR(newTCR); } // Set the trove struct's properties contractsCache.troveManager.setTroveStatus(msg.sender, 1); contractsCache.troveManager.increaseTroveColl(msg.sender, msg.value); contractsCache.troveManager.increaseTroveDebt(msg.sender, vars.compositeDebt); contractsCache.troveManager.updateTroveRewardSnapshots(msg.sender); vars.stake = contractsCache.troveManager.updateStakeAndTotalStakes(msg.sender); sortedTroves.insert(msg.sender, vars.NICR, _upperHint, _lowerHint); vars.arrayIndex = contractsCache.troveManager.addTroveOwnerToArray(msg.sender); emit TroveCreated(msg.sender, vars.arrayIndex); // Move the ether to the Active Pool, and mint the LUSDAmount to the borrower _activePoolAddColl(contractsCache.activePool, msg.value); _withdrawLUSD(contractsCache.activePool, contractsCache.lusdToken, msg.sender, _LUSDAmount, vars.netDebt); // Move the LUSD gas compensation to the Gas Pool _withdrawLUSD(contractsCache.activePool, contractsCache.lusdToken, gasPoolAddress, LUSD_GAS_COMPENSATION, LUSD_GAS_COMPENSATION); emit TroveUpdated(msg.sender, vars.compositeDebt, msg.value, vars.stake, BorrowerOperation.openTrove); emit LUSDBorrowingFeePaid(msg.sender, vars.LUSDFee); } // Send ETH as collateral to a trove function addColl(address _upperHint, address _lowerHint) external payable override { _adjustTrove(msg.sender, 0, 0, false, _upperHint, _lowerHint, 0); } // Send ETH as collateral to a trove. Called by only the Stability Pool. function moveETHGainToTrove(address _borrower, address _upperHint, address _lowerHint) external payable override { _requireCallerIsStabilityPool(); _adjustTrove(_borrower, 0, 0, false, _upperHint, _lowerHint, 0); } // Withdraw ETH collateral from a trove function withdrawColl(uint _collWithdrawal, address _upperHint, address _lowerHint) external override { _adjustTrove(msg.sender, _collWithdrawal, 0, false, _upperHint, _lowerHint, 0); } // Withdraw LUSD tokens from a trove: mint new LUSD tokens to the owner, and increase the trove's debt accordingly function withdrawLUSD(uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) external override { _adjustTrove(msg.sender, 0, _LUSDAmount, true, _upperHint, _lowerHint, _maxFeePercentage); } // Repay LUSD tokens to a Trove: Burn the repaid LUSD tokens, and reduce the trove's debt accordingly function repayLUSD(uint _LUSDAmount, address _upperHint, address _lowerHint) external override { _adjustTrove(msg.sender, 0, _LUSDAmount, false, _upperHint, _lowerHint, 0); } function adjustTrove(uint _maxFeePercentage, uint _collWithdrawal, uint _LUSDChange, bool _isDebtIncrease, address _upperHint, address _lowerHint) external payable override { _adjustTrove(msg.sender, _collWithdrawal, _LUSDChange, _isDebtIncrease, _upperHint, _lowerHint, _maxFeePercentage); } /* * _adjustTrove(): Alongside a debt change, this function can perform either a collateral top-up or a collateral withdrawal. * * It therefore expects either a positive msg.value, or a positive _collWithdrawal argument. * * If both are positive, it will revert. */ function _adjustTrove(address _borrower, uint _collWithdrawal, uint _LUSDChange, bool _isDebtIncrease, address _upperHint, address _lowerHint, uint _maxFeePercentage) internal { ContractsCache memory contractsCache = ContractsCache(troveManager, activePool, lusdToken); LocalVariables_adjustTrove memory vars; vars.price = priceFeed.fetchPrice(); bool isRecoveryMode = _checkRecoveryMode(vars.price); if (_isDebtIncrease) { _requireValidMaxFeePercentage(_maxFeePercentage, isRecoveryMode); _requireNonZeroDebtChange(_LUSDChange); } _requireSingularCollChange(_collWithdrawal); _requireNonZeroAdjustment(_collWithdrawal, _LUSDChange); _requireTroveisActive(contractsCache.troveManager, _borrower); // Confirm the operation is either a borrower adjusting their own trove, or a pure ETH transfer from the Stability Pool to a trove assert(msg.sender == _borrower || (msg.sender == stabilityPoolAddress && msg.value > 0 && _LUSDChange == 0)); contractsCache.troveManager.applyPendingRewards(_borrower); // Get the collChange based on whether or not ETH was sent in the transaction (vars.collChange, vars.isCollIncrease) = _getCollChange(msg.value, _collWithdrawal); vars.netDebtChange = _LUSDChange; // If the adjustment incorporates a debt increase and system is in Normal Mode, then trigger a borrowing fee if (_isDebtIncrease && !isRecoveryMode) { vars.LUSDFee = _triggerBorrowingFee(contractsCache.troveManager, contractsCache.lusdToken, _LUSDChange, _maxFeePercentage); vars.netDebtChange = vars.netDebtChange.add(vars.LUSDFee); // The raw debt change includes the fee } vars.debt = contractsCache.troveManager.getTroveDebt(_borrower); vars.coll = contractsCache.troveManager.getTroveColl(_borrower); // Get the trove's old ICR before the adjustment, and what its new ICR will be after the adjustment vars.oldICR = LiquityMath._computeCR(vars.coll, vars.debt, vars.price); vars.newICR = _getNewICRFromTroveChange(vars.coll, vars.debt, vars.collChange, vars.isCollIncrease, vars.netDebtChange, _isDebtIncrease, vars.price); assert(_collWithdrawal <= vars.coll); // Check the adjustment satisfies all conditions for the current system mode _requireValidAdjustmentInCurrentMode(isRecoveryMode, _collWithdrawal, _isDebtIncrease, vars); // When the adjustment is a debt repayment, check it's a valid amount and that the caller has enough LUSD if (!_isDebtIncrease && _LUSDChange > 0) { _requireAtLeastMinNetDebt(_getNetDebt(vars.debt).sub(vars.netDebtChange)); _requireValidLUSDRepayment(vars.debt, vars.netDebtChange); _requireSufficientLUSDBalance(contractsCache.lusdToken, _borrower, vars.netDebtChange); } (vars.newColl, vars.newDebt) = _updateTroveFromAdjustment(contractsCache.troveManager, _borrower, vars.collChange, vars.isCollIncrease, vars.netDebtChange, _isDebtIncrease); vars.stake = contractsCache.troveManager.updateStakeAndTotalStakes(_borrower); // Re-insert trove in to the sorted list uint newNICR = _getNewNominalICRFromTroveChange(vars.coll, vars.debt, vars.collChange, vars.isCollIncrease, vars.netDebtChange, _isDebtIncrease); sortedTroves.reInsert(_borrower, newNICR, _upperHint, _lowerHint); emit TroveUpdated(_borrower, vars.newDebt, vars.newColl, vars.stake, BorrowerOperation.adjustTrove); emit LUSDBorrowingFeePaid(msg.sender, vars.LUSDFee); // Use the unmodified _LUSDChange here, as we don't send the fee to the user _moveTokensAndETHfromAdjustment( contractsCache.activePool, contractsCache.lusdToken, msg.sender, vars.collChange, vars.isCollIncrease, _LUSDChange, _isDebtIncrease, vars.netDebtChange ); } function closeTrove() external override { ITroveManager troveManagerCached = troveManager; IActivePool activePoolCached = activePool; ILUSDToken lusdTokenCached = lusdToken; _requireTroveisActive(troveManagerCached, msg.sender); uint price = priceFeed.fetchPrice(); _requireNotInRecoveryMode(price); troveManagerCached.applyPendingRewards(msg.sender); uint coll = troveManagerCached.getTroveColl(msg.sender); uint debt = troveManagerCached.getTroveDebt(msg.sender); _requireSufficientLUSDBalance(lusdTokenCached, msg.sender, debt.sub(LUSD_GAS_COMPENSATION)); uint newTCR = _getNewTCRFromTroveChange(coll, false, debt, false, price); _requireNewTCRisAboveCCR(newTCR); troveManagerCached.removeStake(msg.sender); troveManagerCached.closeTrove(msg.sender); emit TroveUpdated(msg.sender, 0, 0, 0, BorrowerOperation.closeTrove); // Burn the repaid LUSD from the user's balance and the gas compensation from the Gas Pool _repayLUSD(activePoolCached, lusdTokenCached, msg.sender, debt.sub(LUSD_GAS_COMPENSATION)); _repayLUSD(activePoolCached, lusdTokenCached, gasPoolAddress, LUSD_GAS_COMPENSATION); // Send the collateral back to the user activePoolCached.sendETH(msg.sender, coll); } /** * Claim remaining collateral from a redemption or from a liquidation with ICR > MCR in Recovery Mode */ function claimCollateral() external override { // send ETH from CollSurplus Pool to owner collSurplusPool.claimColl(msg.sender); } // --- Helper functions --- function _triggerBorrowingFee(ITroveManager _troveManager, ILUSDToken _lusdToken, uint _LUSDAmount, uint _maxFeePercentage) internal returns (uint) { _troveManager.decayBaseRateFromBorrowing(); // decay the baseRate state variable uint LUSDFee = _troveManager.getBorrowingFee(_LUSDAmount); _requireUserAcceptsFee(LUSDFee, _LUSDAmount, _maxFeePercentage); // Send fee to LQTY staking contract lqtyStaking.increaseF_LUSD(LUSDFee); _lusdToken.mint(lqtyStakingAddress, LUSDFee); return LUSDFee; } function _getUSDValue(uint _coll, uint _price) internal pure returns (uint) { uint usdValue = _price.mul(_coll).div(DECIMAL_PRECISION); return usdValue; } function _getCollChange( uint _collReceived, uint _requestedCollWithdrawal ) internal pure returns(uint collChange, bool isCollIncrease) { if (_collReceived != 0) { collChange = _collReceived; isCollIncrease = true; } else { collChange = _requestedCollWithdrawal; } } // Update trove's coll and debt based on whether they increase or decrease function _updateTroveFromAdjustment ( ITroveManager _troveManager, address _borrower, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease ) internal returns (uint, uint) { uint newColl = (_isCollIncrease) ? _troveManager.increaseTroveColl(_borrower, _collChange) : _troveManager.decreaseTroveColl(_borrower, _collChange); uint newDebt = (_isDebtIncrease) ? _troveManager.increaseTroveDebt(_borrower, _debtChange) : _troveManager.decreaseTroveDebt(_borrower, _debtChange); return (newColl, newDebt); } function _moveTokensAndETHfromAdjustment ( IActivePool _activePool, ILUSDToken _lusdToken, address _borrower, uint _collChange, bool _isCollIncrease, uint _LUSDChange, bool _isDebtIncrease, uint _netDebtChange ) internal { if (_isDebtIncrease) { _withdrawLUSD(_activePool, _lusdToken, _borrower, _LUSDChange, _netDebtChange); } else { _repayLUSD(_activePool, _lusdToken, _borrower, _LUSDChange); } if (_isCollIncrease) { _activePoolAddColl(_activePool, _collChange); } else { _activePool.sendETH(_borrower, _collChange); } } // Send ETH to Active Pool and increase its recorded ETH balance function _activePoolAddColl(IActivePool _activePool, uint _amount) internal { (bool success, ) = address(_activePool).call{value: _amount}(""); require(success, "BorrowerOps: Sending ETH to ActivePool failed"); } // Issue the specified amount of LUSD to _account and increases the total active debt (_netDebtIncrease potentially includes a LUSDFee) function _withdrawLUSD(IActivePool _activePool, ILUSDToken _lusdToken, address _account, uint _LUSDAmount, uint _netDebtIncrease) internal { _activePool.increaseLUSDDebt(_netDebtIncrease); _lusdToken.mint(_account, _LUSDAmount); } // Burn the specified amount of LUSD from _account and decreases the total active debt function _repayLUSD(IActivePool _activePool, ILUSDToken _lusdToken, address _account, uint _LUSD) internal { _activePool.decreaseLUSDDebt(_LUSD); _lusdToken.burn(_account, _LUSD); } // --- 'Require' wrapper functions --- function _requireSingularCollChange(uint _collWithdrawal) internal view { require(msg.value == 0 || _collWithdrawal == 0, "BorrowerOperations: Cannot withdraw and add coll"); } function _requireCallerIsBorrower(address _borrower) internal view { require(msg.sender == _borrower, "BorrowerOps: Caller must be the borrower for a withdrawal"); } function _requireNonZeroAdjustment(uint _collWithdrawal, uint _LUSDChange) internal view { require(msg.value != 0 || _collWithdrawal != 0 || _LUSDChange != 0, "BorrowerOps: There must be either a collateral change or a debt change"); } function _requireTroveisActive(ITroveManager _troveManager, address _borrower) internal view { uint status = _troveManager.getTroveStatus(_borrower); require(status == 1, "BorrowerOps: Trove does not exist or is closed"); } function _requireTroveisNotActive(ITroveManager _troveManager, address _borrower) internal view { uint status = _troveManager.getTroveStatus(_borrower); require(status != 1, "BorrowerOps: Trove is active"); } function _requireNonZeroDebtChange(uint _LUSDChange) internal pure { require(_LUSDChange > 0, "BorrowerOps: Debt increase requires non-zero debtChange"); } function _requireNotInRecoveryMode(uint _price) internal view { require(!_checkRecoveryMode(_price), "BorrowerOps: Operation not permitted during Recovery Mode"); } function _requireNoCollWithdrawal(uint _collWithdrawal) internal pure { require(_collWithdrawal == 0, "BorrowerOps: Collateral withdrawal not permitted Recovery Mode"); } function _requireValidAdjustmentInCurrentMode ( bool _isRecoveryMode, uint _collWithdrawal, bool _isDebtIncrease, LocalVariables_adjustTrove memory _vars ) internal view { /* *In Recovery Mode, only allow: * * - Pure collateral top-up * - Pure debt repayment * - Collateral top-up with debt repayment * - A debt increase combined with a collateral top-up which makes the ICR >= 150% and improves the ICR (and by extension improves the TCR). * * In Normal Mode, ensure: * * - The new ICR is above MCR * - The adjustment won't pull the TCR below CCR */ if (_isRecoveryMode) { _requireNoCollWithdrawal(_collWithdrawal); if (_isDebtIncrease) { _requireICRisAboveCCR(_vars.newICR); _requireNewICRisAboveOldICR(_vars.newICR, _vars.oldICR); } } else { // if Normal Mode _requireICRisAboveMCR(_vars.newICR); _vars.newTCR = _getNewTCRFromTroveChange(_vars.collChange, _vars.isCollIncrease, _vars.netDebtChange, _isDebtIncrease, _vars.price); _requireNewTCRisAboveCCR(_vars.newTCR); } } function _requireICRisAboveMCR(uint _newICR) internal pure { require(_newICR >= MCR, "BorrowerOps: An operation that would result in ICR < MCR is not permitted"); } function _requireICRisAboveCCR(uint _newICR) internal pure { require(_newICR >= CCR, "BorrowerOps: Operation must leave trove with ICR >= CCR"); } function _requireNewICRisAboveOldICR(uint _newICR, uint _oldICR) internal pure { require(_newICR >= _oldICR, "BorrowerOps: Cannot decrease your Trove's ICR in Recovery Mode"); } function _requireNewTCRisAboveCCR(uint _newTCR) internal pure { require(_newTCR >= CCR, "BorrowerOps: An operation that would result in TCR < CCR is not permitted"); } function _requireAtLeastMinNetDebt(uint _netDebt) internal pure { require (_netDebt >= MIN_NET_DEBT, "BorrowerOps: Trove's net debt must be greater than minimum"); } function _requireValidLUSDRepayment(uint _currentDebt, uint _debtRepayment) internal pure { require(_debtRepayment <= _currentDebt.sub(LUSD_GAS_COMPENSATION), "BorrowerOps: Amount repaid must not be larger than the Trove's debt"); } function _requireCallerIsStabilityPool() internal view { require(msg.sender == stabilityPoolAddress, "BorrowerOps: Caller is not Stability Pool"); } function _requireSufficientLUSDBalance(ILUSDToken _lusdToken, address _borrower, uint _debtRepayment) internal view { require(_lusdToken.balanceOf(_borrower) >= _debtRepayment, "BorrowerOps: Caller doesnt have enough LUSD to make repayment"); } function _requireValidMaxFeePercentage(uint _maxFeePercentage, bool _isRecoveryMode) internal pure { if (_isRecoveryMode) { require(_maxFeePercentage <= DECIMAL_PRECISION, "Max fee percentage must less than or equal to 100%"); } else { require(_maxFeePercentage >= BORROWING_FEE_FLOOR && _maxFeePercentage <= DECIMAL_PRECISION, "Max fee percentage must be between 0.5% and 100%"); } } // --- ICR and TCR getters --- // Compute the new collateral ratio, considering the change in coll and debt. Assumes 0 pending rewards. function _getNewNominalICRFromTroveChange ( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease ) pure internal returns (uint) { (uint newColl, uint newDebt) = _getNewTroveAmounts(_coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease); uint newNICR = LiquityMath._computeNominalCR(newColl, newDebt); return newNICR; } // Compute the new collateral ratio, considering the change in coll and debt. Assumes 0 pending rewards. function _getNewICRFromTroveChange ( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease, uint _price ) pure internal returns (uint) { (uint newColl, uint newDebt) = _getNewTroveAmounts(_coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease); uint newICR = LiquityMath._computeCR(newColl, newDebt, _price); return newICR; } function _getNewTroveAmounts( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease ) internal pure returns (uint, uint) { uint newColl = _coll; uint newDebt = _debt; newColl = _isCollIncrease ? _coll.add(_collChange) : _coll.sub(_collChange); newDebt = _isDebtIncrease ? _debt.add(_debtChange) : _debt.sub(_debtChange); return (newColl, newDebt); } function _getNewTCRFromTroveChange ( uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease, uint _price ) internal view returns (uint) { uint totalColl = getEntireSystemColl(); uint totalDebt = getEntireSystemDebt(); totalColl = _isCollIncrease ? totalColl.add(_collChange) : totalColl.sub(_collChange); totalDebt = _isDebtIncrease ? totalDebt.add(_debtChange) : totalDebt.sub(_debtChange); uint newTCR = LiquityMath._computeCR(totalColl, totalDebt, _price); return newTCR; } function getCompositeDebt(uint _debt) external pure override returns (uint) { return _getCompositeDebt(_debt); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_activePoolAddress","type":"address"}],"name":"ActivePoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_collSurplusPoolAddress","type":"address"}],"name":"CollSurplusPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_defaultPoolAddress","type":"address"}],"name":"DefaultPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_gasPoolAddress","type":"address"}],"name":"GasPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_lqtyStakingAddress","type":"address"}],"name":"LQTYStakingAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"_LUSDFee","type":"uint256"}],"name":"LUSDBorrowingFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_lusdTokenAddress","type":"address"}],"name":"LUSDTokenAddressChanged","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":"_newPriceFeedAddress","type":"address"}],"name":"PriceFeedAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sortedTrovesAddress","type":"address"}],"name":"SortedTrovesAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_stabilityPoolAddress","type":"address"}],"name":"StabilityPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"arrayIndex","type":"uint256"}],"name":"TroveCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newTroveManagerAddress","type":"address"}],"name":"TroveManagerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"_debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_coll","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"enum BorrowerOperations.BorrowerOperation","name":"operation","type":"uint8"}],"name":"TroveUpdated","type":"event"},{"inputs":[],"name":"BORROWING_FEE_FLOOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMAL_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LUSD_GAS_COMPENSATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_NET_DEBT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_100pct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePool","outputs":[{"internalType":"contract IActivePool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"addColl","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"uint256","name":"_LUSDChange","type":"uint256"},{"internalType":"bool","name":"_isDebtIncrease","type":"bool"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"adjustTrove","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultPool","outputs":[{"internalType":"contract IDefaultPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debt","type":"uint256"}],"name":"getCompositeDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getEntireSystemColl","outputs":[{"internalType":"uint256","name":"entireSystemColl","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntireSystemDebt","outputs":[{"internalType":"uint256","name":"entireSystemDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lqtyStaking","outputs":[{"internalType":"contract ILQTYStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lqtyStakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lusdToken","outputs":[{"internalType":"contract ILUSDToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"moveETHGainToTrove","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"openTrove","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeed","outputs":[{"internalType":"contract IPriceFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"repayLUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_troveManagerAddress","type":"address"},{"internalType":"address","name":"_activePoolAddress","type":"address"},{"internalType":"address","name":"_defaultPoolAddress","type":"address"},{"internalType":"address","name":"_stabilityPoolAddress","type":"address"},{"internalType":"address","name":"_gasPoolAddress","type":"address"},{"internalType":"address","name":"_collSurplusPoolAddress","type":"address"},{"internalType":"address","name":"_priceFeedAddress","type":"address"},{"internalType":"address","name":"_sortedTrovesAddress","type":"address"},{"internalType":"address","name":"_lusdTokenAddress","type":"address"},{"internalType":"address","name":"_lqtyStakingAddress","type":"address"}],"name":"setAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sortedTroves","outputs":[{"internalType":"contract ISortedTroves","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"troveManager","outputs":[{"internalType":"contract ITroveManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"withdrawColl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"withdrawLUSD","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600380546001600160a01b031916339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3613934806100606000396000f3fe6080604052600436106101e35760003560e01c8063761ab22c11610102578063a20baee611610095578063b83f91a211610064578063b83f91a21461061e578063c6a6cf2014610633578063ea9638bf1461067b578063f92d3433146106b3576101e3565b8063a20baee61461045f578063a3a640171461056a578063a3f4df7e1461057f578063ae91875414610609576101e3565b8063860665b3116100d1578063860665b3146104dd578063887105d3146105175780638da5cb5b1461052c5780638f32d59b14610541576101e3565b8063761ab22c14610489578063794e57241461049e578063795d26c3146104b35780637f7dde4a146104c8576101e3565b80634ff814431161017a5780636c37a4af116101495780636c37a4af146103cc5780636f0b0c1c1461044a57806372fe25aa1461045f578063741bef1a14610474576101e3565b80634ff814431461031e5780635530273c146103485780635733d58f1461038957806368647db11461039e576101e3565b80632e86bbd8116101b65780632e86bbd8146102ae5780633cc74225146102c35780633d83908a146102f45780634870dd9a14610309576101e3565b806304491fa7146101e85780630e704d501461022b5780631184e5f8146102405780631bf4355514610287575b600080fd5b3480156101f457600080fd5b506102296004803603606081101561020b57600080fd5b508035906001600160a01b03602082013581169160400135166106c8565b005b34801561023757600080fd5b506102296106df565b34801561024c57600080fd5b506102296004803603608081101561026357600080fd5b508035906020810135906001600160a01b0360408201358116916060013516610b7f565b34801561029357600080fd5b5061029c610b96565b60408051918252519081900360200190f35b3480156102ba57600080fd5b5061029c610ba3565b3480156102cf57600080fd5b506102d8610baf565b604080516001600160a01b039092168252519081900360200190f35b34801561030057600080fd5b506102d8610bbe565b34801561031557600080fd5b5061029c610bcd565b34801561032a57600080fd5b5061029c6004803603602081101561034157600080fd5b5035610bd2565b34801561035457600080fd5b506102296004803603606081101561036b57600080fd5b508035906001600160a01b0360208201358116916040013516610be3565b34801561039557600080fd5b5061029c610bf4565b610229600480360360408110156103b457600080fd5b506001600160a01b0381358116916020013516610c00565b3480156103d857600080fd5b5061022960048036036101408110156103f057600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e0810135821691610100820135811691610120013516610c16565b34801561045657600080fd5b50610229610fd4565b34801561046b57600080fd5b5061029c61104d565b34801561048057600080fd5b506102d8611059565b34801561049557600080fd5b506102d8611068565b3480156104aa57600080fd5b5061029c611077565b3480156104bf57600080fd5b5061029c611083565b3480156104d457600080fd5b506102d8611184565b610229600480360360808110156104f357600080fd5b508035906020810135906001600160a01b0360408201358116916060013516611193565b34801561052357600080fd5b5061029c61186f565b34801561053857600080fd5b506102d861192b565b34801561054d57600080fd5b5061055661193a565b604080519115158252519081900360200190f35b34801561057657600080fd5b506102d861194b565b34801561058b57600080fd5b5061059461195a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105ce5781810151838201526020016105b6565b50505050905090810190601f1680156105fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561061557600080fd5b506102d8611993565b34801561062a57600080fd5b506102d86119a2565b610229600480360360c081101561064957600080fd5b5080359060208101359060408101359060608101351515906001600160a01b03608082013581169160a00135166119b1565b6102296004803603606081101561069157600080fd5b506001600160a01b0381358116916020810135821691604090910135166119c8565b3480156106bf57600080fd5b5061029c6119e2565b6106da336000856000868660006119ed565b505050565b600454600054600a546001600160a01b039283169291821691166107038333612015565b600254604080517f0fdb11cf00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630fdb11cf91600480830192602092919082900301818787803b15801561076257600080fd5b505af1158015610776573d6000803e3d6000fd5b505050506040513d602081101561078c57600080fd5b50519050610799816120da565b604080517f0b07655700000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b03861691630b07655791602480830192600092919082900301818387803b1580156107f957600080fd5b505af115801561080d573d6000803e3d6000fd5b5050604080516309019aaf60e31b81523360048201529051600093506001600160a01b038816925063480cd57891602480820192602092909190829003018186803b15801561085b57600080fd5b505afa15801561086f573d6000803e3d6000fd5b505050506040513d602081101561088557600080fd5b5051604080517fd66a255300000000000000000000000000000000000000000000000000000000815233600482015290519192506000916001600160a01b0388169163d66a2553916024808301926020929190829003018186803b1580156108ec57600080fd5b505afa158015610900573d6000803e3d6000fd5b505050506040513d602081101561091657600080fd5b5051905061093c843361093784678ac7230489e8000063ffffffff61212216565b61216b565b600061094d8360008460008861222b565b9050610958816122b6565b604080517ffe2ba84800000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b0389169163fe2ba84891602480830192600092919082900301818387803b1580156109b857600080fd5b505af11580156109cc573d6000803e3d6000fd5b5050604080517fcbd138ae00000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b038b16935063cbd138ae9250602480830192600092919082900301818387803b158015610a3057600080fd5b505af1158015610a44573d6000803e3d6000fd5b50505050336001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b6000806000600160405180858152602001848152602001838152602001826002811115610a9c57fe5b60ff16815260200194505050505060405180910390a2610ad5868633610ad086678ac7230489e8000063ffffffff61212216565b6122fd565b600654610af790879087906001600160a01b0316678ac7230489e800006122fd565b604080517f64a197f30000000000000000000000000000000000000000000000000000000081523360048201526024810185905290516001600160a01b038816916364a197f391604480830192600092919082900301818387803b158015610b5e57600080fd5b505af1158015610b72573d6000803e3d6000fd5b5050505050505050505050565b610b9033600085600186868a6119ed565b50505050565b6804e1003b28d928000081565b678ac7230489e8000081565b6001546001600160a01b031681565b6004546001600160a01b031681565b60c881565b6000610bdd826123d9565b92915050565b6106da3384600080868660006119ed565b6714d1120d7b16000081565b610c12336000806000868660006119ed565b5050565b610c1e61193a565b610c6f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610c788a6123f3565b610c81896123f3565b610c8a886123f3565b610c93876123f3565b610c9c866123f3565b610ca5856123f3565b610cae846123f3565b610cb7836123f3565b610cc0826123f3565b610cc9816123f3565b6004805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b038d81169182179093556000805483168d85161790556001805483168c85161790556005805483168b85161790556006805483168a8516179055600780548316898516179055600280548316888516179055600b80548316878516179055600a80548316868516179055600980548316938516938417905560088054909216909217905560408051918252517f143219c9e69b09e07e095fcc889b43d8f46ca892bba65f08dc3a0050869a5678916020908290030190a1604080516001600160a01b038b16815290517f78f058b189175430c48dc02699e3a0031ea4ff781536dc2fab847de4babdd8829181900360200190a1604080516001600160a01b038a16815290517f5ee0cae2f063ed938bb55046f6a932fb6ae792bf43624806bb90abe68a50be9b9181900360200190a1604080516001600160a01b038916815290517f82966d27eea39b038ee0fa30cd16532bb24f6e65d31cb58fb227aa5766cdcc7f9181900360200190a1604080516001600160a01b038816815290517fcfb07d791fcafc032b35837b50eb84b74df518cf4cc287e8084f47630fa70fa09181900360200190a1604080516001600160a01b038716815290517fe67f36a6e961157d6eff83b91f3af5a62131ceb6f04954ef74f51c1c05e7f88d9181900360200190a1604080516001600160a01b038616815290517f8c537274438aa850a330284665d81a85dd38267d09e4050d416bfc94142db2649181900360200190a1604080516001600160a01b038516815290517f65f4cf077bc01e4742eb5ad98326f6e95b63548ea24b17f8d5e823111fe788009181900360200190a1604080516001600160a01b038416815290517f227eec0ec317af6ab1a9587ffa1c84332522eb4c583a908f89babc05f8f339bd9181900360200190a1604080516001600160a01b038316815290517f756ebc192164c295bba134b5aacd72cc7aff8098a670d1f0a5f6b3a0b4ce67079181900360200190a1610fc86124a2565b50505050505050505050565b600754604080517fb32beb5b00000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b039092169163b32beb5b9160248082019260009290919082900301818387803b15801561103957600080fd5b505af1158015610b90573d6000803e3d6000fd5b670de0b6b3a764000081565b6002546001600160a01b031681565b6009546001600160a01b031681565b670f43fc2c04ee000081565b6000805460408051632f5a97e560e11b8152905183926001600160a01b031691635eb52fca916004808301926020929190829003018186803b1580156110c857600080fd5b505afa1580156110dc573d6000803e3d6000fd5b505050506040513d60208110156110f257600080fd5b505160015460408051632f5a97e560e11b815290519293506000926001600160a01b0390921691635eb52fca91600480820192602092909190829003018186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d602081101561116957600080fd5b5051905061117d828263ffffffff6124f916565b9250505090565b6000546001600160a01b031681565b61119b613443565b50604080516060810182526004546001600160a01b03908116825260005481166020830152600a5416918101919091526111d3613463565b600260009054906101000a90046001600160a01b03166001600160a01b0316630fdb11cf6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561122357600080fd5b505af1158015611237573d6000803e3d6000fd5b505050506040513d602081101561124d57600080fd5b505180825260009061125e90612553565b905061126a8782612570565b8251611276903361261c565b60408201869052806112b75761129683600001518460400151888a6126f8565b6020830181905260408301516112b19163ffffffff6124f916565b60408301525b6112c482604001516128da565b6112d182604001516123d9565b606083018190526112de57fe5b6112f13483606001518460000151612922565b60808301526060820151611306903490612960565b60a083015280156113235761131e8260800151612995565b611356565b61133082608001516129dc565b600061134934600185606001516001876000015161222b565b9050611354816122b6565b505b8251604080517f5d6b480f0000000000000000000000000000000000000000000000000000000081523360048201526001602482015290516001600160a01b0390921691635d6b480f9160448082019260009290919082900301818387803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b50508451604080517f72423c1700000000000000000000000000000000000000000000000000000000815233600482015234602482015290516001600160a01b0390921693506372423c1792506044808201926020929091908290030181600087803b15801561144457600080fd5b505af1158015611458573d6000803e3d6000fd5b505050506040513d602081101561146e57600080fd5b505082516060830151604080517f9976cf450000000000000000000000000000000000000000000000000000000081523360048201526024810192909252516001600160a01b0390921691639976cf45916044808201926020929091908290030181600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b505050506040513d602081101561150b57600080fd5b50508251604080517f82fe3eb900000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b03909216916382fe3eb99160248082019260009290919082900301818387803b15801561157157600080fd5b505af1158015611585573d6000803e3d6000fd5b5050845160408051630c7940bd60e11b815233600482015290516001600160a01b0390921693506318f2817a92506024808201926020929091908290030181600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050506040513d60208110156115ff57600080fd5b505160c0830152600b5460a0830151604080517f46f7cf8700000000000000000000000000000000000000000000000000000000815233600482015260248101929092526001600160a01b038881166044840152878116606484015290519216916346f7cf879160848082019260009290919082900301818387803b15801561168757600080fd5b505af115801561169b573d6000803e3d6000fd5b50508451604080517f15d549f100000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b0390921693506315d549f192506024808201926020929091908290030181600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b505050506040513d602081101561172e57600080fd5b505160e08301819052604080519182525133917f59cfd0cd754bc5748b6770e94a4ffa5f678d885cb899dcfadc5734edb97c67ab919081900360200190a261177a836020015134612a23565b6117938360200151846040015133898660400151612ab3565b602083015160408401516006546117be9291906001600160a01b0316678ac7230489e8000080612ab3565b336001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b8360600151348560c0015160006040518085815260200184815260200183815260200182600281111561181857fe5b60ff16815260200194505050505060405180910390a2602080830151604080519182525133927fa55c5f48fd29482ad55f4b59bf070cd1ac1a7132a31f7a136ebe8877ae37e1ff928290030190a250505050505050565b6000805460408051630a7b61df60e11b8152905183926001600160a01b0316916314f6c3be916004808301926020929190829003018186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d60208110156118de57600080fd5b505160015460408051630a7b61df60e11b815290519293506000926001600160a01b03909216916314f6c3be91600480820192602092909190829003018186803b15801561113f57600080fd5b6003546001600160a01b031690565b6003546001600160a01b0316331490565b6008546001600160a01b031681565b6040518060400160405280601281526020017f426f72726f7765724f7065726174696f6e73000000000000000000000000000081525081565b600b546001600160a01b031681565b600a546001600160a01b031681565b6119c03386868686868c6119ed565b505050505050565b6119d0612b90565b6106da836000806000868660006119ed565b6611c37937e0800081565b6119f5613443565b50604080516060810182526004546001600160a01b03908116825260005481166020830152600a541691810191909152611a2d6134a8565b600260009054906101000a90046001600160a01b03166001600160a01b0316630fdb11cf6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b505050506040513d6020811015611aa757600080fd5b5051808252600090611ab890612553565b90508615611ad357611aca8482612570565b611ad388612bdb565b611adc89612c1a565b611ae68989612c60565b8251611af2908b612015565b336001600160a01b038b161480611b2857506005546001600160a01b031633148015611b1e5750600034115b8015611b28575087155b611b2e57fe5b82600001516001600160a01b0316630b0765578b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015611b8a57600080fd5b505af1158015611b9e573d6000803e3d6000fd5b50505050611bac348a612cb2565b15156060840152602083015260408201889052868015611bca575080155b15611c0557611be3836000015184604001518a876126f8565b61012083018190526040830151611bff9163ffffffff6124f916565b60408301525b82600001516001600160a01b031663d66a25538b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c5f57600080fd5b505afa158015611c73573d6000803e3d6000fd5b505050506040513d6020811015611c8957600080fd5b505160808301528251604080516309019aaf60e31b81526001600160a01b038d811660048301529151919092169163480cd578916024808301926020929190829003018186803b158015611cdc57600080fd5b505afa158015611cf0573d6000803e3d6000fd5b505050506040513d6020811015611d0657600080fd5b505160a0830181905260808301518351611d21929190612922565b8260c0018181525050611d518260a0015183608001518460200151856060015186604001518c8860000151612cd1565b60e083015260a0820151891115611d6457fe5b611d70818a8985612d04565b86158015611d7e5750600088115b15611dd157611dac611da78360400151611d9b8560800151612d78565b9063ffffffff61212216565b6128da565b611dbe82608001518360400151612d92565b611dd183604001518b846040015161216b565b611def83600001518b8460200151856060015186604001518c612de8565b610140840152610160830152825160408051630c7940bd60e11b81526001600160a01b038d81166004830152915191909216916318f2817a9160248083019260209291908290030181600087803b158015611e4957600080fd5b505af1158015611e5d573d6000803e3d6000fd5b505050506040513d6020811015611e7357600080fd5b505161018083015260a08201516080830151602084015160608501516040860151600094611ea7949093909290918d613048565b600b54604080517f2be212600000000000000000000000000000000000000000000000000000000081526001600160a01b038f81166004830152602482018590528b811660448301528a811660648301529151939450911691632be212609160848082019260009290919082900301818387803b158015611f2757600080fd5b505af1158015611f3b573d6000803e3d6000fd5b505050508a6001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b846101400151856101600151866101800151600260405180858152602001848152602001838152602001826002811115611fa057fe5b60ff16815260200194505050505060405180910390a2610120830151604080519182525133917fa55c5f48fd29482ad55f4b59bf070cd1ac1a7132a31f7a136ebe8877ae37e1ff919081900360200190a2610b728460200151856040015133866020015187606001518e8e8a60400151613079565b6000826001600160a01b03166321e37801836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561206d57600080fd5b505afa158015612081573d6000803e3d6000fd5b505050506040513d602081101561209757600080fd5b50519050600181146106da5760405162461bcd60e51b815260040180806020018281038252602e8152602001806136c2602e913960400191505060405180910390fd5b6120e381612553565b1561211f5760405162461bcd60e51b81526004018080602001828103825260398152602001806135706039913960400191505060405180910390fd5b50565b600061216483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613134565b9392505050565b80836001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156121c257600080fd5b505afa1580156121d6573d6000803e3d6000fd5b505050506040513d60208110156121ec57600080fd5b505110156106da5760405162461bcd60e51b815260040180806020018281038252603d81526020018061372e603d913960400191505060405180910390fd5b60008061223661186f565b90506000612242611083565b90508661225e57612259828963ffffffff61212216565b61226e565b61226e828963ffffffff6124f916565b91508461228a57612285818763ffffffff61212216565b61229a565b61229a818763ffffffff6124f916565b905060006122a9838387612922565b9998505050505050505050565b6714d1120d7b16000081101561211f5760405162461bcd60e51b81526004018080602001828103825260498152602001806136796049913960600191505060405180910390fd5b836001600160a01b03166338d995a8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561234357600080fd5b505af1158015612357573d6000803e3d6000fd5b50505050826001600160a01b0316639dc29fac83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156123bb57600080fd5b505af11580156123cf573d6000803e3d6000fd5b5050505050505050565b6000610bdd82678ac7230489e8000063ffffffff6124f916565b6001600160a01b03811661244e576040805162461bcd60e51b815260206004820152601e60248201527f4163636f756e742063616e6e6f74206265207a65726f20616464726573730000604482015290519081900360640190fd5b803b80610c12576040805162461bcd60e51b815260206004820181905260248201527f4163636f756e7420636f64652073697a652063616e6e6f74206265207a65726f604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36003805473ffffffffffffffffffffffffffffffffffffffff19169055565b600082820183811015612164576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008061255f836131cb565b6714d1120d7b160000119392505050565b80156125c257670de0b6b3a76400008211156125bd5760405162461bcd60e51b81526004018080602001828103825260328152602001806135e06032913960400191505060405180910390fd5b610c12565b6611c37937e0800082108015906125e15750670de0b6b3a76400008211155b610c125760405162461bcd60e51b815260040180806020018281038252603081526020018061385a6030913960400191505060405180910390fd5b6000826001600160a01b03166321e37801836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561267457600080fd5b505afa158015612688573d6000803e3d6000fd5b505050506040513d602081101561269e57600080fd5b5051905060018114156106da576040805162461bcd60e51b815260206004820152601c60248201527f426f72726f7765724f70733a2054726f76652069732061637469766500000000604482015290519081900360640190fd5b6000846001600160a01b0316635dba4c4a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561273557600080fd5b505af1158015612749573d6000803e3d6000fd5b505050506000856001600160a01b031663631203b0856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561279357600080fd5b505afa1580156127a7573d6000803e3d6000fd5b505050506040513d60208110156127bd57600080fd5b505190506127cc8185856131f7565b600854604080517f4677ffb30000000000000000000000000000000000000000000000000000000081526004810184905290516001600160a01b0390921691634677ffb39160248082019260009290919082900301818387803b15801561283257600080fd5b505af1158015612846573d6000803e3d6000fd5b5050600954604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260248101869052905191891693506340c10f19925060448082019260009290919082900301818387803b1580156128b857600080fd5b505af11580156128cc573d6000803e3d6000fd5b509298975050505050505050565b6804e1003b28d928000081101561211f5760405162461bcd60e51b815260040180806020018281038252603a8152602001806137b4603a913960400191505060405180910390fd5b6000821561295557600061294c84612940878663ffffffff61326c16565b9063ffffffff6132c516565b91506121649050565b506000199392505050565b6000811561298c57612985826129408568056bc75e2d6310000063ffffffff61326c16565b9050610bdd565b50600019610bdd565b6714d1120d7b16000081101561211f5760405162461bcd60e51b81526004018080602001828103825260378152602001806135a96037913960400191505060405180910390fd5b670f43fc2c04ee000081101561211f5760405162461bcd60e51b815260040180806020018281038252604981526020018061376b6049913960600191505060405180910390fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612a6e576040519150601f19603f3d011682016040523d82523d6000602084013e612a73565b606091505b50509050806106da5760405162461bcd60e51b815260040180806020018281038252602d815260200180613513602d913960400191505060405180910390fd5b846001600160a01b031663cfb9329a826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612af957600080fd5b505af1158015612b0d573d6000803e3d6000fd5b50505050836001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612b7157600080fd5b505af1158015612b85573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b03163314612bd95760405162461bcd60e51b81526004018080602001828103825260298152602001806138316029913960400191505060405180910390fd5b565b6000811161211f5760405162461bcd60e51b815260040180806020018281038252603781526020018061388a6037913960400191505060405180910390fd5b341580612c25575080155b61211f5760405162461bcd60e51b81526004018080602001828103825260308152602001806135406030913960400191505060405180910390fd5b34151580612c6d57508115155b80612c7757508015155b610c125760405162461bcd60e51b81526004018080602001828103825260468152602001806136126046913960600191505060405180910390fd5b6000808315612cc657508290506001612cca565b8291505b9250929050565b6000806000612ce48a8a8a8a8a8a613307565b915091506000612cf5838387612922565b9b9a5050505050505050505050565b8315612d3d57612d1383613362565b8115612d3857612d268160e00151612995565b612d388160e001518260c0015161339f565b610b90565b612d4a8160e001516129dc565b612d6781602001518260600151836040015185856000015161222b565b6101008201819052610b90906122b6565b6000610bdd82678ac7230489e8000063ffffffff61212216565b612daa82678ac7230489e8000063ffffffff61212216565b811115610c125760405162461bcd60e51b81526004018080602001828103825260438152602001806137ee6043913960600191505060405180910390fd5b600080600085612e8357886001600160a01b031663d3d6f84389896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e5257600080fd5b505af1158015612e66573d6000803e3d6000fd5b505050506040513d6020811015612e7c57600080fd5b5051612f10565b886001600160a01b03166372423c1789896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ee357600080fd5b505af1158015612ef7573d6000803e3d6000fd5b505050506040513d6020811015612f0d57600080fd5b50515b9050600084612faa57896001600160a01b03166312610e928a886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f7957600080fd5b505af1158015612f8d573d6000803e3d6000fd5b505050506040513d6020811015612fa357600080fd5b5051613037565b896001600160a01b0316639976cf458a886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561300a57600080fd5b505af115801561301e573d6000803e3d6000fd5b505050506040513d602081101561303457600080fd5b50515b919a91995090975050505050505050565b600080600061305b898989898989613307565b91509150600061306b8383612960565b9a9950505050505050505050565b81156130915761308c8888888685612ab3565b61309d565b61309d888888866122fd565b83156130b2576130ad8886612a23565b6123cf565b876001600160a01b03166364a197f387876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561311257600080fd5b505af1158015613126573d6000803e3d6000fd5b505050505050505050505050565b600081848411156131c35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613188578181015183820152602001613170565b50505050905090810190601f1680156131b55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806131d661186f565b905060006131e2611083565b90506131ef828286612922565b949350505050565b60006132158361294086670de0b6b3a764000063ffffffff61326c16565b905081811115610b90576040805162461bcd60e51b815260206004820152601d60248201527f4665652065786365656465642070726f7669646564206d6178696d756d000000604482015290519081900360640190fd5b60008261327b57506000610bdd565b8282028284828161328857fe5b04146121645760405162461bcd60e51b81526004018080602001828103825260218152602001806136586021913960400191505060405180910390fd5b600061216483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506133de565b600080878786613326576133218a8963ffffffff61212216565b613336565b6133368a8963ffffffff6124f916565b9150846133525761334d898763ffffffff61212216565b613037565b613037898763ffffffff6124f916565b801561211f5760405162461bcd60e51b815260040180806020018281038252603e8152602001806136f0603e913960400191505060405180910390fd5b80821015610c125760405162461bcd60e51b815260040180806020018281038252603e8152602001806138c1603e913960400191505060405180910390fd5b6000818361342d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613188578181015183820152602001613170565b50600083858161343957fe5b0495945050505050565b604080516060810182526000808252602082018190529181019190915290565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101a00160405280600081526020016000815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe426f72726f7765724f70733a2053656e64696e672045544820746f20416374697665506f6f6c206661696c6564426f72726f7765724f7065726174696f6e733a2043616e6e6f7420776974686472617720616e642061646420636f6c6c426f72726f7765724f70733a204f7065726174696f6e206e6f74207065726d697474656420647572696e67205265636f76657279204d6f6465426f72726f7765724f70733a204f7065726174696f6e206d757374206c656176652074726f7665207769746820494352203e3d204343524d6178206665652070657263656e74616765206d757374206c657373207468616e206f7220657175616c20746f2031303025426f72726f7765724f70733a205468657265206d75737420626520656974686572206120636f6c6c61746572616c206368616e6765206f7220612064656274206368616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77426f72726f7765724f70733a20416e206f7065726174696f6e207468617420776f756c6420726573756c7420696e20544352203c20434352206973206e6f74207065726d6974746564426f72726f7765724f70733a2054726f766520646f6573206e6f74206578697374206f7220697320636c6f736564426f72726f7765724f70733a20436f6c6c61746572616c207769746864726177616c206e6f74207065726d6974746564205265636f76657279204d6f6465426f72726f7765724f70733a2043616c6c657220646f65736e74206861766520656e6f756768204c55534420746f206d616b652072657061796d656e74426f72726f7765724f70733a20416e206f7065726174696f6e207468617420776f756c6420726573756c7420696e20494352203c204d4352206973206e6f74207065726d6974746564426f72726f7765724f70733a2054726f76652773206e65742064656274206d7573742062652067726561746572207468616e206d696e696d756d426f72726f7765724f70733a20416d6f756e7420726570616964206d757374206e6f74206265206c6172676572207468616e207468652054726f766527732064656274426f72726f7765724f70733a2043616c6c6572206973206e6f742053746162696c69747920506f6f6c4d6178206665652070657263656e74616765206d757374206265206265747765656e20302e352520616e642031303025426f72726f7765724f70733a204465627420696e637265617365207265717569726573206e6f6e2d7a65726f20646562744368616e6765426f72726f7765724f70733a2043616e6e6f7420646563726561736520796f75722054726f766527732049435220696e205265636f76657279204d6f6465a26469706673582212206b5eb9ab525507f6867fba3e8d848b44cf6bb718d55f67d94e15f7efab5b39b664736f6c634300060b0033
Deployed Bytecode
0x6080604052600436106101e35760003560e01c8063761ab22c11610102578063a20baee611610095578063b83f91a211610064578063b83f91a21461061e578063c6a6cf2014610633578063ea9638bf1461067b578063f92d3433146106b3576101e3565b8063a20baee61461045f578063a3a640171461056a578063a3f4df7e1461057f578063ae91875414610609576101e3565b8063860665b3116100d1578063860665b3146104dd578063887105d3146105175780638da5cb5b1461052c5780638f32d59b14610541576101e3565b8063761ab22c14610489578063794e57241461049e578063795d26c3146104b35780637f7dde4a146104c8576101e3565b80634ff814431161017a5780636c37a4af116101495780636c37a4af146103cc5780636f0b0c1c1461044a57806372fe25aa1461045f578063741bef1a14610474576101e3565b80634ff814431461031e5780635530273c146103485780635733d58f1461038957806368647db11461039e576101e3565b80632e86bbd8116101b65780632e86bbd8146102ae5780633cc74225146102c35780633d83908a146102f45780634870dd9a14610309576101e3565b806304491fa7146101e85780630e704d501461022b5780631184e5f8146102405780631bf4355514610287575b600080fd5b3480156101f457600080fd5b506102296004803603606081101561020b57600080fd5b508035906001600160a01b03602082013581169160400135166106c8565b005b34801561023757600080fd5b506102296106df565b34801561024c57600080fd5b506102296004803603608081101561026357600080fd5b508035906020810135906001600160a01b0360408201358116916060013516610b7f565b34801561029357600080fd5b5061029c610b96565b60408051918252519081900360200190f35b3480156102ba57600080fd5b5061029c610ba3565b3480156102cf57600080fd5b506102d8610baf565b604080516001600160a01b039092168252519081900360200190f35b34801561030057600080fd5b506102d8610bbe565b34801561031557600080fd5b5061029c610bcd565b34801561032a57600080fd5b5061029c6004803603602081101561034157600080fd5b5035610bd2565b34801561035457600080fd5b506102296004803603606081101561036b57600080fd5b508035906001600160a01b0360208201358116916040013516610be3565b34801561039557600080fd5b5061029c610bf4565b610229600480360360408110156103b457600080fd5b506001600160a01b0381358116916020013516610c00565b3480156103d857600080fd5b5061022960048036036101408110156103f057600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e0810135821691610100820135811691610120013516610c16565b34801561045657600080fd5b50610229610fd4565b34801561046b57600080fd5b5061029c61104d565b34801561048057600080fd5b506102d8611059565b34801561049557600080fd5b506102d8611068565b3480156104aa57600080fd5b5061029c611077565b3480156104bf57600080fd5b5061029c611083565b3480156104d457600080fd5b506102d8611184565b610229600480360360808110156104f357600080fd5b508035906020810135906001600160a01b0360408201358116916060013516611193565b34801561052357600080fd5b5061029c61186f565b34801561053857600080fd5b506102d861192b565b34801561054d57600080fd5b5061055661193a565b604080519115158252519081900360200190f35b34801561057657600080fd5b506102d861194b565b34801561058b57600080fd5b5061059461195a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105ce5781810151838201526020016105b6565b50505050905090810190601f1680156105fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561061557600080fd5b506102d8611993565b34801561062a57600080fd5b506102d86119a2565b610229600480360360c081101561064957600080fd5b5080359060208101359060408101359060608101351515906001600160a01b03608082013581169160a00135166119b1565b6102296004803603606081101561069157600080fd5b506001600160a01b0381358116916020810135821691604090910135166119c8565b3480156106bf57600080fd5b5061029c6119e2565b6106da336000856000868660006119ed565b505050565b600454600054600a546001600160a01b039283169291821691166107038333612015565b600254604080517f0fdb11cf00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691630fdb11cf91600480830192602092919082900301818787803b15801561076257600080fd5b505af1158015610776573d6000803e3d6000fd5b505050506040513d602081101561078c57600080fd5b50519050610799816120da565b604080517f0b07655700000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b03861691630b07655791602480830192600092919082900301818387803b1580156107f957600080fd5b505af115801561080d573d6000803e3d6000fd5b5050604080516309019aaf60e31b81523360048201529051600093506001600160a01b038816925063480cd57891602480820192602092909190829003018186803b15801561085b57600080fd5b505afa15801561086f573d6000803e3d6000fd5b505050506040513d602081101561088557600080fd5b5051604080517fd66a255300000000000000000000000000000000000000000000000000000000815233600482015290519192506000916001600160a01b0388169163d66a2553916024808301926020929190829003018186803b1580156108ec57600080fd5b505afa158015610900573d6000803e3d6000fd5b505050506040513d602081101561091657600080fd5b5051905061093c843361093784678ac7230489e8000063ffffffff61212216565b61216b565b600061094d8360008460008861222b565b9050610958816122b6565b604080517ffe2ba84800000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b0389169163fe2ba84891602480830192600092919082900301818387803b1580156109b857600080fd5b505af11580156109cc573d6000803e3d6000fd5b5050604080517fcbd138ae00000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b038b16935063cbd138ae9250602480830192600092919082900301818387803b158015610a3057600080fd5b505af1158015610a44573d6000803e3d6000fd5b50505050336001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b6000806000600160405180858152602001848152602001838152602001826002811115610a9c57fe5b60ff16815260200194505050505060405180910390a2610ad5868633610ad086678ac7230489e8000063ffffffff61212216565b6122fd565b600654610af790879087906001600160a01b0316678ac7230489e800006122fd565b604080517f64a197f30000000000000000000000000000000000000000000000000000000081523360048201526024810185905290516001600160a01b038816916364a197f391604480830192600092919082900301818387803b158015610b5e57600080fd5b505af1158015610b72573d6000803e3d6000fd5b5050505050505050505050565b610b9033600085600186868a6119ed565b50505050565b6804e1003b28d928000081565b678ac7230489e8000081565b6001546001600160a01b031681565b6004546001600160a01b031681565b60c881565b6000610bdd826123d9565b92915050565b6106da3384600080868660006119ed565b6714d1120d7b16000081565b610c12336000806000868660006119ed565b5050565b610c1e61193a565b610c6f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610c788a6123f3565b610c81896123f3565b610c8a886123f3565b610c93876123f3565b610c9c866123f3565b610ca5856123f3565b610cae846123f3565b610cb7836123f3565b610cc0826123f3565b610cc9816123f3565b6004805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b038d81169182179093556000805483168d85161790556001805483168c85161790556005805483168b85161790556006805483168a8516179055600780548316898516179055600280548316888516179055600b80548316878516179055600a80548316868516179055600980548316938516938417905560088054909216909217905560408051918252517f143219c9e69b09e07e095fcc889b43d8f46ca892bba65f08dc3a0050869a5678916020908290030190a1604080516001600160a01b038b16815290517f78f058b189175430c48dc02699e3a0031ea4ff781536dc2fab847de4babdd8829181900360200190a1604080516001600160a01b038a16815290517f5ee0cae2f063ed938bb55046f6a932fb6ae792bf43624806bb90abe68a50be9b9181900360200190a1604080516001600160a01b038916815290517f82966d27eea39b038ee0fa30cd16532bb24f6e65d31cb58fb227aa5766cdcc7f9181900360200190a1604080516001600160a01b038816815290517fcfb07d791fcafc032b35837b50eb84b74df518cf4cc287e8084f47630fa70fa09181900360200190a1604080516001600160a01b038716815290517fe67f36a6e961157d6eff83b91f3af5a62131ceb6f04954ef74f51c1c05e7f88d9181900360200190a1604080516001600160a01b038616815290517f8c537274438aa850a330284665d81a85dd38267d09e4050d416bfc94142db2649181900360200190a1604080516001600160a01b038516815290517f65f4cf077bc01e4742eb5ad98326f6e95b63548ea24b17f8d5e823111fe788009181900360200190a1604080516001600160a01b038416815290517f227eec0ec317af6ab1a9587ffa1c84332522eb4c583a908f89babc05f8f339bd9181900360200190a1604080516001600160a01b038316815290517f756ebc192164c295bba134b5aacd72cc7aff8098a670d1f0a5f6b3a0b4ce67079181900360200190a1610fc86124a2565b50505050505050505050565b600754604080517fb32beb5b00000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b039092169163b32beb5b9160248082019260009290919082900301818387803b15801561103957600080fd5b505af1158015610b90573d6000803e3d6000fd5b670de0b6b3a764000081565b6002546001600160a01b031681565b6009546001600160a01b031681565b670f43fc2c04ee000081565b6000805460408051632f5a97e560e11b8152905183926001600160a01b031691635eb52fca916004808301926020929190829003018186803b1580156110c857600080fd5b505afa1580156110dc573d6000803e3d6000fd5b505050506040513d60208110156110f257600080fd5b505160015460408051632f5a97e560e11b815290519293506000926001600160a01b0390921691635eb52fca91600480820192602092909190829003018186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d602081101561116957600080fd5b5051905061117d828263ffffffff6124f916565b9250505090565b6000546001600160a01b031681565b61119b613443565b50604080516060810182526004546001600160a01b03908116825260005481166020830152600a5416918101919091526111d3613463565b600260009054906101000a90046001600160a01b03166001600160a01b0316630fdb11cf6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561122357600080fd5b505af1158015611237573d6000803e3d6000fd5b505050506040513d602081101561124d57600080fd5b505180825260009061125e90612553565b905061126a8782612570565b8251611276903361261c565b60408201869052806112b75761129683600001518460400151888a6126f8565b6020830181905260408301516112b19163ffffffff6124f916565b60408301525b6112c482604001516128da565b6112d182604001516123d9565b606083018190526112de57fe5b6112f13483606001518460000151612922565b60808301526060820151611306903490612960565b60a083015280156113235761131e8260800151612995565b611356565b61133082608001516129dc565b600061134934600185606001516001876000015161222b565b9050611354816122b6565b505b8251604080517f5d6b480f0000000000000000000000000000000000000000000000000000000081523360048201526001602482015290516001600160a01b0390921691635d6b480f9160448082019260009290919082900301818387803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b50508451604080517f72423c1700000000000000000000000000000000000000000000000000000000815233600482015234602482015290516001600160a01b0390921693506372423c1792506044808201926020929091908290030181600087803b15801561144457600080fd5b505af1158015611458573d6000803e3d6000fd5b505050506040513d602081101561146e57600080fd5b505082516060830151604080517f9976cf450000000000000000000000000000000000000000000000000000000081523360048201526024810192909252516001600160a01b0390921691639976cf45916044808201926020929091908290030181600087803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b505050506040513d602081101561150b57600080fd5b50508251604080517f82fe3eb900000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b03909216916382fe3eb99160248082019260009290919082900301818387803b15801561157157600080fd5b505af1158015611585573d6000803e3d6000fd5b5050845160408051630c7940bd60e11b815233600482015290516001600160a01b0390921693506318f2817a92506024808201926020929091908290030181600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050506040513d60208110156115ff57600080fd5b505160c0830152600b5460a0830151604080517f46f7cf8700000000000000000000000000000000000000000000000000000000815233600482015260248101929092526001600160a01b038881166044840152878116606484015290519216916346f7cf879160848082019260009290919082900301818387803b15801561168757600080fd5b505af115801561169b573d6000803e3d6000fd5b50508451604080517f15d549f100000000000000000000000000000000000000000000000000000000815233600482015290516001600160a01b0390921693506315d549f192506024808201926020929091908290030181600087803b15801561170457600080fd5b505af1158015611718573d6000803e3d6000fd5b505050506040513d602081101561172e57600080fd5b505160e08301819052604080519182525133917f59cfd0cd754bc5748b6770e94a4ffa5f678d885cb899dcfadc5734edb97c67ab919081900360200190a261177a836020015134612a23565b6117938360200151846040015133898660400151612ab3565b602083015160408401516006546117be9291906001600160a01b0316678ac7230489e8000080612ab3565b336001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b8360600151348560c0015160006040518085815260200184815260200183815260200182600281111561181857fe5b60ff16815260200194505050505060405180910390a2602080830151604080519182525133927fa55c5f48fd29482ad55f4b59bf070cd1ac1a7132a31f7a136ebe8877ae37e1ff928290030190a250505050505050565b6000805460408051630a7b61df60e11b8152905183926001600160a01b0316916314f6c3be916004808301926020929190829003018186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d60208110156118de57600080fd5b505160015460408051630a7b61df60e11b815290519293506000926001600160a01b03909216916314f6c3be91600480820192602092909190829003018186803b15801561113f57600080fd5b6003546001600160a01b031690565b6003546001600160a01b0316331490565b6008546001600160a01b031681565b6040518060400160405280601281526020017f426f72726f7765724f7065726174696f6e73000000000000000000000000000081525081565b600b546001600160a01b031681565b600a546001600160a01b031681565b6119c03386868686868c6119ed565b505050505050565b6119d0612b90565b6106da836000806000868660006119ed565b6611c37937e0800081565b6119f5613443565b50604080516060810182526004546001600160a01b03908116825260005481166020830152600a541691810191909152611a2d6134a8565b600260009054906101000a90046001600160a01b03166001600160a01b0316630fdb11cf6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b505050506040513d6020811015611aa757600080fd5b5051808252600090611ab890612553565b90508615611ad357611aca8482612570565b611ad388612bdb565b611adc89612c1a565b611ae68989612c60565b8251611af2908b612015565b336001600160a01b038b161480611b2857506005546001600160a01b031633148015611b1e5750600034115b8015611b28575087155b611b2e57fe5b82600001516001600160a01b0316630b0765578b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015611b8a57600080fd5b505af1158015611b9e573d6000803e3d6000fd5b50505050611bac348a612cb2565b15156060840152602083015260408201889052868015611bca575080155b15611c0557611be3836000015184604001518a876126f8565b61012083018190526040830151611bff9163ffffffff6124f916565b60408301525b82600001516001600160a01b031663d66a25538b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c5f57600080fd5b505afa158015611c73573d6000803e3d6000fd5b505050506040513d6020811015611c8957600080fd5b505160808301528251604080516309019aaf60e31b81526001600160a01b038d811660048301529151919092169163480cd578916024808301926020929190829003018186803b158015611cdc57600080fd5b505afa158015611cf0573d6000803e3d6000fd5b505050506040513d6020811015611d0657600080fd5b505160a0830181905260808301518351611d21929190612922565b8260c0018181525050611d518260a0015183608001518460200151856060015186604001518c8860000151612cd1565b60e083015260a0820151891115611d6457fe5b611d70818a8985612d04565b86158015611d7e5750600088115b15611dd157611dac611da78360400151611d9b8560800151612d78565b9063ffffffff61212216565b6128da565b611dbe82608001518360400151612d92565b611dd183604001518b846040015161216b565b611def83600001518b8460200151856060015186604001518c612de8565b610140840152610160830152825160408051630c7940bd60e11b81526001600160a01b038d81166004830152915191909216916318f2817a9160248083019260209291908290030181600087803b158015611e4957600080fd5b505af1158015611e5d573d6000803e3d6000fd5b505050506040513d6020811015611e7357600080fd5b505161018083015260a08201516080830151602084015160608501516040860151600094611ea7949093909290918d613048565b600b54604080517f2be212600000000000000000000000000000000000000000000000000000000081526001600160a01b038f81166004830152602482018590528b811660448301528a811660648301529151939450911691632be212609160848082019260009290919082900301818387803b158015611f2757600080fd5b505af1158015611f3b573d6000803e3d6000fd5b505050508a6001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b846101400151856101600151866101800151600260405180858152602001848152602001838152602001826002811115611fa057fe5b60ff16815260200194505050505060405180910390a2610120830151604080519182525133917fa55c5f48fd29482ad55f4b59bf070cd1ac1a7132a31f7a136ebe8877ae37e1ff919081900360200190a2610b728460200151856040015133866020015187606001518e8e8a60400151613079565b6000826001600160a01b03166321e37801836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561206d57600080fd5b505afa158015612081573d6000803e3d6000fd5b505050506040513d602081101561209757600080fd5b50519050600181146106da5760405162461bcd60e51b815260040180806020018281038252602e8152602001806136c2602e913960400191505060405180910390fd5b6120e381612553565b1561211f5760405162461bcd60e51b81526004018080602001828103825260398152602001806135706039913960400191505060405180910390fd5b50565b600061216483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613134565b9392505050565b80836001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156121c257600080fd5b505afa1580156121d6573d6000803e3d6000fd5b505050506040513d60208110156121ec57600080fd5b505110156106da5760405162461bcd60e51b815260040180806020018281038252603d81526020018061372e603d913960400191505060405180910390fd5b60008061223661186f565b90506000612242611083565b90508661225e57612259828963ffffffff61212216565b61226e565b61226e828963ffffffff6124f916565b91508461228a57612285818763ffffffff61212216565b61229a565b61229a818763ffffffff6124f916565b905060006122a9838387612922565b9998505050505050505050565b6714d1120d7b16000081101561211f5760405162461bcd60e51b81526004018080602001828103825260498152602001806136796049913960600191505060405180910390fd5b836001600160a01b03166338d995a8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561234357600080fd5b505af1158015612357573d6000803e3d6000fd5b50505050826001600160a01b0316639dc29fac83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156123bb57600080fd5b505af11580156123cf573d6000803e3d6000fd5b5050505050505050565b6000610bdd82678ac7230489e8000063ffffffff6124f916565b6001600160a01b03811661244e576040805162461bcd60e51b815260206004820152601e60248201527f4163636f756e742063616e6e6f74206265207a65726f20616464726573730000604482015290519081900360640190fd5b803b80610c12576040805162461bcd60e51b815260206004820181905260248201527f4163636f756e7420636f64652073697a652063616e6e6f74206265207a65726f604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36003805473ffffffffffffffffffffffffffffffffffffffff19169055565b600082820183811015612164576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008061255f836131cb565b6714d1120d7b160000119392505050565b80156125c257670de0b6b3a76400008211156125bd5760405162461bcd60e51b81526004018080602001828103825260328152602001806135e06032913960400191505060405180910390fd5b610c12565b6611c37937e0800082108015906125e15750670de0b6b3a76400008211155b610c125760405162461bcd60e51b815260040180806020018281038252603081526020018061385a6030913960400191505060405180910390fd5b6000826001600160a01b03166321e37801836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561267457600080fd5b505afa158015612688573d6000803e3d6000fd5b505050506040513d602081101561269e57600080fd5b5051905060018114156106da576040805162461bcd60e51b815260206004820152601c60248201527f426f72726f7765724f70733a2054726f76652069732061637469766500000000604482015290519081900360640190fd5b6000846001600160a01b0316635dba4c4a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561273557600080fd5b505af1158015612749573d6000803e3d6000fd5b505050506000856001600160a01b031663631203b0856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561279357600080fd5b505afa1580156127a7573d6000803e3d6000fd5b505050506040513d60208110156127bd57600080fd5b505190506127cc8185856131f7565b600854604080517f4677ffb30000000000000000000000000000000000000000000000000000000081526004810184905290516001600160a01b0390921691634677ffb39160248082019260009290919082900301818387803b15801561283257600080fd5b505af1158015612846573d6000803e3d6000fd5b5050600954604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260248101869052905191891693506340c10f19925060448082019260009290919082900301818387803b1580156128b857600080fd5b505af11580156128cc573d6000803e3d6000fd5b509298975050505050505050565b6804e1003b28d928000081101561211f5760405162461bcd60e51b815260040180806020018281038252603a8152602001806137b4603a913960400191505060405180910390fd5b6000821561295557600061294c84612940878663ffffffff61326c16565b9063ffffffff6132c516565b91506121649050565b506000199392505050565b6000811561298c57612985826129408568056bc75e2d6310000063ffffffff61326c16565b9050610bdd565b50600019610bdd565b6714d1120d7b16000081101561211f5760405162461bcd60e51b81526004018080602001828103825260378152602001806135a96037913960400191505060405180910390fd5b670f43fc2c04ee000081101561211f5760405162461bcd60e51b815260040180806020018281038252604981526020018061376b6049913960600191505060405180910390fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612a6e576040519150601f19603f3d011682016040523d82523d6000602084013e612a73565b606091505b50509050806106da5760405162461bcd60e51b815260040180806020018281038252602d815260200180613513602d913960400191505060405180910390fd5b846001600160a01b031663cfb9329a826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612af957600080fd5b505af1158015612b0d573d6000803e3d6000fd5b50505050836001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612b7157600080fd5b505af1158015612b85573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b03163314612bd95760405162461bcd60e51b81526004018080602001828103825260298152602001806138316029913960400191505060405180910390fd5b565b6000811161211f5760405162461bcd60e51b815260040180806020018281038252603781526020018061388a6037913960400191505060405180910390fd5b341580612c25575080155b61211f5760405162461bcd60e51b81526004018080602001828103825260308152602001806135406030913960400191505060405180910390fd5b34151580612c6d57508115155b80612c7757508015155b610c125760405162461bcd60e51b81526004018080602001828103825260468152602001806136126046913960600191505060405180910390fd5b6000808315612cc657508290506001612cca565b8291505b9250929050565b6000806000612ce48a8a8a8a8a8a613307565b915091506000612cf5838387612922565b9b9a5050505050505050505050565b8315612d3d57612d1383613362565b8115612d3857612d268160e00151612995565b612d388160e001518260c0015161339f565b610b90565b612d4a8160e001516129dc565b612d6781602001518260600151836040015185856000015161222b565b6101008201819052610b90906122b6565b6000610bdd82678ac7230489e8000063ffffffff61212216565b612daa82678ac7230489e8000063ffffffff61212216565b811115610c125760405162461bcd60e51b81526004018080602001828103825260438152602001806137ee6043913960600191505060405180910390fd5b600080600085612e8357886001600160a01b031663d3d6f84389896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e5257600080fd5b505af1158015612e66573d6000803e3d6000fd5b505050506040513d6020811015612e7c57600080fd5b5051612f10565b886001600160a01b03166372423c1789896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ee357600080fd5b505af1158015612ef7573d6000803e3d6000fd5b505050506040513d6020811015612f0d57600080fd5b50515b9050600084612faa57896001600160a01b03166312610e928a886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f7957600080fd5b505af1158015612f8d573d6000803e3d6000fd5b505050506040513d6020811015612fa357600080fd5b5051613037565b896001600160a01b0316639976cf458a886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561300a57600080fd5b505af115801561301e573d6000803e3d6000fd5b505050506040513d602081101561303457600080fd5b50515b919a91995090975050505050505050565b600080600061305b898989898989613307565b91509150600061306b8383612960565b9a9950505050505050505050565b81156130915761308c8888888685612ab3565b61309d565b61309d888888866122fd565b83156130b2576130ad8886612a23565b6123cf565b876001600160a01b03166364a197f387876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561311257600080fd5b505af1158015613126573d6000803e3d6000fd5b505050505050505050505050565b600081848411156131c35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613188578181015183820152602001613170565b50505050905090810190601f1680156131b55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806131d661186f565b905060006131e2611083565b90506131ef828286612922565b949350505050565b60006132158361294086670de0b6b3a764000063ffffffff61326c16565b905081811115610b90576040805162461bcd60e51b815260206004820152601d60248201527f4665652065786365656465642070726f7669646564206d6178696d756d000000604482015290519081900360640190fd5b60008261327b57506000610bdd565b8282028284828161328857fe5b04146121645760405162461bcd60e51b81526004018080602001828103825260218152602001806136586021913960400191505060405180910390fd5b600061216483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506133de565b600080878786613326576133218a8963ffffffff61212216565b613336565b6133368a8963ffffffff6124f916565b9150846133525761334d898763ffffffff61212216565b613037565b613037898763ffffffff6124f916565b801561211f5760405162461bcd60e51b815260040180806020018281038252603e8152602001806136f0603e913960400191505060405180910390fd5b80821015610c125760405162461bcd60e51b815260040180806020018281038252603e8152602001806138c1603e913960400191505060405180910390fd5b6000818361342d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613188578181015183820152602001613170565b50600083858161343957fe5b0495945050505050565b604080516060810182526000808252602082018190529181019190915290565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101a00160405280600081526020016000815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe426f72726f7765724f70733a2053656e64696e672045544820746f20416374697665506f6f6c206661696c6564426f72726f7765724f7065726174696f6e733a2043616e6e6f7420776974686472617720616e642061646420636f6c6c426f72726f7765724f70733a204f7065726174696f6e206e6f74207065726d697474656420647572696e67205265636f76657279204d6f6465426f72726f7765724f70733a204f7065726174696f6e206d757374206c656176652074726f7665207769746820494352203e3d204343524d6178206665652070657263656e74616765206d757374206c657373207468616e206f7220657175616c20746f2031303025426f72726f7765724f70733a205468657265206d75737420626520656974686572206120636f6c6c61746572616c206368616e6765206f7220612064656274206368616e6765536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77426f72726f7765724f70733a20416e206f7065726174696f6e207468617420776f756c6420726573756c7420696e20544352203c20434352206973206e6f74207065726d6974746564426f72726f7765724f70733a2054726f766520646f6573206e6f74206578697374206f7220697320636c6f736564426f72726f7765724f70733a20436f6c6c61746572616c207769746864726177616c206e6f74207065726d6974746564205265636f76657279204d6f6465426f72726f7765724f70733a2043616c6c657220646f65736e74206861766520656e6f756768204c55534420746f206d616b652072657061796d656e74426f72726f7765724f70733a20416e206f7065726174696f6e207468617420776f756c6420726573756c7420696e20494352203c204d4352206973206e6f74207065726d6974746564426f72726f7765724f70733a2054726f76652773206e65742064656274206d7573742062652067726561746572207468616e206d696e696d756d426f72726f7765724f70733a20416d6f756e7420726570616964206d757374206e6f74206265206c6172676572207468616e207468652054726f766527732064656274426f72726f7765724f70733a2043616c6c6572206973206e6f742053746162696c69747920506f6f6c4d6178206665652070657263656e74616765206d757374206265206265747765656e20302e352520616e642031303025426f72726f7765724f70733a204465627420696e637265617365207265717569726573206e6f6e2d7a65726f20646562744368616e6765426f72726f7765724f70733a2043616e6e6f7420646563726561736520796f75722054726f766527732049435220696e205265636f76657279204d6f6465a26469706673582212206b5eb9ab525507f6867fba3e8d848b44cf6bb718d55f67d94e15f7efab5b39b664736f6c634300060b0033
Deployed Bytecode Sourcemap
125652:27423:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;134828:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;134828:188:0;;;-1:-1:-1;;;;;134828:188:0;;;;;;;;;;;;:::i;:::-;;139784:1381;;;;;;;;;;;;;:::i;134483:230::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;134483:230:0;;;;;;;;-1:-1:-1;;;;;134483:230:0;;;;;;;;;;;;:::i;120644:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;120527:50;;;;;;;;;;;;;:::i;120950:31::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;120950:31:0;;;;;;;;;;;;;;125856:33;;;;;;;;;;;;;:::i;120742:42::-;;;;;;;;;;;;;:::i;152946:126::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;152946:126:0;;:::i;134156:199::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;134156:199:0;;;-1:-1:-1;;;;;134156:199:0;;;;;;;;;;;;:::i;120398:46::-;;;;;;;;;;;;;:::i;133614:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;133614:166:0;;;;;;;;;;:::i;128227:2308::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;128227:2308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;141298:153::-;;;;;;;;;;;;;:::i;120069:50::-;;;;;;;;;;;;;:::i;120990:36::-;;;;;;;;;;;;;:::i;126045:33::-;;;;;;;;;;;;;:::i;120199:46::-;;;;;;;;;;;;;:::i;121942:236::-;;;;;;;;;;;;;:::i;120912:29::-;;;;;;;;;;;;;:::i;130587:2977::-;;;;;;;;;;;;;;;;-1:-1:-1;130587:2977:0;;;;;;;;-1:-1:-1;;;;;130587:2977:0;;;;;;;;;;;;:::i;121700:234::-;;;;;;;;;;;;;:::i;123922:79::-;;;;;;;;;;;;;:::i;124288:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;126007:31;;;;;;;;;;;;;:::i;125747:50::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;126197:33;;;;;;;;;;;;;:::i;126087:27::-;;;;;;;;;;;;;:::i;135024:306::-;;;;;;;;;;;;;;;;-1:-1:-1;135024:306:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;135024:306:0;;;;;;;;;;;;:::i;133866:237::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;133866:237:0;;;;;;;;;;;;;;;;;;;:::i;120824:71::-;;;;;;;;;;;;;:::i;134828:188::-;134934:74;134947:10;134959:1;134962:11;134975:5;134982:10;134994;135006:1;134934:12;:74::i;:::-;134828:188;;;:::o;139784:1381::-;139870:12;;139835:32;139924:10;139974:9;;-1:-1:-1;;;;;139870:12:0;;;;139924:10;;;;139974:9;139996:53;139870:12;140038:10;139996:21;:53::i;:::-;140073:9;;:22;;;;;;;;140060:10;;-1:-1:-1;;;;;140073:9:0;;:20;;:22;;;;;;;;;;;;;;140060:10;140073:9;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;140073:22:0;;-1:-1:-1;140106:32:0;140073:22;140106:25;:32::i;:::-;140151:50;;;;;;140190:10;140151:50;;;;;;-1:-1:-1;;;;;140151:38:0;;;;;:50;;;;;-1:-1:-1;;140151:50:0;;;;;;;-1:-1:-1;140151:38:0;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;140226:43:0;;;-1:-1:-1;;;140226:43:0;;140258:10;140226:43;;;;;;140214:9;;-1:-1:-1;;;;;;140226:31:0;;;-1:-1:-1;140226:31:0;;:43;;;;;;;;;;;;;;;:31;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;140226:43:0;140292;;;;;;140324:10;140292:43;;;;;;140226;;-1:-1:-1;140280:9:0;;-1:-1:-1;;;;;140292:31:0;;;;;:43;;;;;140226;;140292;;;;;;;:31;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;140292:43:0;;-1:-1:-1;140348:91:0;140378:15;140395:10;140407:31;140292:43;120572:5;140407:31;:8;:31;:::i;:::-;140348:29;:91::i;:::-;140452:11;140466:58;140492:4;140498:5;140505:4;140511:5;140518;140466:25;:58::i;:::-;140452:72;;140535:32;140560:6;140535:24;:32::i;:::-;140580:42;;;;;;140611:10;140580:42;;;;;;-1:-1:-1;;;;;140580:30:0;;;;;:42;;;;;-1:-1:-1;;140580:42:0;;;;;;;-1:-1:-1;140580:30:0;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;140633:41:0;;;;;;140663:10;140633:41;;;;;;-1:-1:-1;;;;;140633:29:0;;;-1:-1:-1;140633:29:0;;-1:-1:-1;140633:41:0;;;;;-1:-1:-1;;140633:41:0;;;;;;;-1:-1:-1;140633:29:0;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;140705:10;-1:-1:-1;;;;;140692:63:0;;140717:1;140720;140723;140726:28;140692:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;140868:90;140879:16;140897:15;140914:10;140926:31;:4;120572:5;140926:31;:8;:31;:::i;:::-;140868:10;:90::i;:::-;141015:14;;140969:84;;140980:16;;140998:15;;-1:-1:-1;;;;;141015:14:0;120572:5;140969:10;:84::i;:::-;141115:42;;;;;;141140:10;141115:42;;;;;;;;;;;;-1:-1:-1;;;;;141115:24:0;;;;;:42;;;;;-1:-1:-1;;141115:42:0;;;;;;;-1:-1:-1;141115:24:0;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;139784:1381;;;;;;;:::o;134483:230::-;134616:89;134629:10;134641:1;134644:11;134657:4;134663:10;134675;134687:17;134616:12;:89::i;:::-;134483:230;;;;:::o;120644:41::-;120680:5;120644:41;:::o;120527:50::-;120572:5;120527:50;:::o;120950:31::-;;;-1:-1:-1;;;;;120950:31:0;;:::o;125856:33::-;;;-1:-1:-1;;;;;125856:33:0;;:::o;120742:42::-;120781:3;120742:42;:::o;152946:126::-;153016:4;153040:24;153058:5;153040:17;:24::i;:::-;153033:31;152946:126;-1:-1:-1;;152946:126:0:o;134156:199::-;134269:78;134282:10;134294:15;134311:1;134314:5;134321:10;134333;134345:1;134269:12;:78::i;120398:46::-;120425:19;120398:46;:::o;133614:166::-;133708:64;133721:10;133733:1;133736;133739:5;133746:10;133758;133770:1;133708:12;:64::i;:::-;133614:166;;:::o;128227:2308::-;124134:9;:7;:9::i;:::-;124126:54;;;;;-1:-1:-1;;;124126:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;128818:35:::1;128832:20;128818:13;:35::i;:::-;128864:33;128878:18;128864:13;:33::i;:::-;128908:34;128922:19;128908:13;:34::i;:::-;128953:36;128967:21;128953:13;:36::i;:::-;129000:30;129014:15;129000:13;:30::i;:::-;129041:38;129055:23;129041:13;:38::i;:::-;129090:32;129104:17;129090:13;:32::i;:::-;129133:35;129147:20;129133:13;:35::i;:::-;129179:32;129193:17;129179:13;:32::i;:::-;129222:34;129236:19;129222:13;:34::i;:::-;129269:12;:50:::0;;-1:-1:-1;;129269:50:0;;::::1;-1:-1:-1::0;;;;;129269:50:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;129330:44:0;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;129385:47:0;;;::::1;::::0;;::::1;;::::0;;129443:20:::1;:44:::0;;;::::1;::::0;;::::1;;::::0;;129498:14:::1;:32:::0;;;::::1;::::0;;::::1;;::::0;;129541:15:::1;:59:::0;;;::::1;::::0;;::::1;;::::0;;129611:9:::1;:41:::0;;;::::1;::::0;;::::1;;::::0;;129663:12:::1;:50:::0;;;::::1;::::0;;::::1;;::::0;;129724:9:::1;:41:::0;;;::::1;::::0;;::::1;;::::0;;129776:18:::1;:40:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;129827:11:::1;:47:::0;;;;::::1;::::0;;::::1;::::0;;129892:48:::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;129956:44;::::0;;-1:-1:-1;;;;;129956:44:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130016:46;::::0;;-1:-1:-1;;;;;130016:46:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130078:50;::::0;;-1:-1:-1;;;;;130078:50:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130144:38;::::0;;-1:-1:-1;;;;;130144:38:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130198:54;::::0;;-1:-1:-1;;;;;130198:54:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130268:42;::::0;;-1:-1:-1;;;;;130268:42:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130326:48;::::0;;-1:-1:-1;;;;;130326:48:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130390:42;::::0;;-1:-1:-1;;;;;130390:42:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130448:46;::::0;;-1:-1:-1;;;;;130448:46:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;130507:20;:18;:20::i;:::-;128227:2308:::0;;;;;;;;;;:::o;141298:153::-;141406:15;;:37;;;;;;141432:10;141406:37;;;;;;-1:-1:-1;;;;;141406:15:0;;;;:25;;:37;;;;;:15;;:37;;;;;;;;:15;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;120069:50;120100:19;120069:50;:::o;120990:36::-;;;-1:-1:-1;;;;;120990:36:0;;:::o;126045:33::-;;;-1:-1:-1;;;;;126045:33:0;;:::o;120199:46::-;120226:19;120199:46;:::o;121942:236::-;121994:21;122046:10;;:24;;;-1:-1:-1;;;122046:24:0;;;;121994:21;;-1:-1:-1;;;;;122046:10:0;;:22;;:24;;;;;;;;;;;;;;:10;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122046:24:0;122099:11;;:25;;;-1:-1:-1;;;122099:25:0;;;;122046:24;;-1:-1:-1;122081:15:0;;-1:-1:-1;;;;;122099:11:0;;;;:23;;:25;;;;;122046:24;;122099:25;;;;;;;;:11;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122099:25:0;;-1:-1:-1;122144:26:0;:10;122099:25;122144:26;:14;:26;:::i;:::-;122137:33;;;;121942:236;:::o;120912:29::-;;;-1:-1:-1;;;;;120912:29:0;;:::o;130587:2977::-;130725:36;;:::i;:::-;-1:-1:-1;130764:51:0;;;;;;;;130779:12;;-1:-1:-1;;;;;130779:12:0;;;130764:51;;-1:-1:-1;130793:10:0;;;130764:51;;;;130805:9;;;130764:51;;;;;;;130826:36;;:::i;:::-;130888:9;;;;;;;;;-1:-1:-1;;;;;130888:9:0;-1:-1:-1;;;;;130888:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;130888:22:0;130875:35;;;:10;;130943:30;;:18;:30::i;:::-;130921:52;;130986:64;131016:17;131035:14;130986:29;:64::i;:::-;131086:27;;131061:65;;131115:10;131061:24;:65::i;:::-;131162:12;;;:26;;;131206:14;131201:230;;131252:107;131273:14;:27;;;131302:14;:24;;;131328:11;131341:17;131252:20;:107::i;:::-;131237:12;;;:122;;;131389:12;;;;:30;;;:16;:30;:::i;:::-;131374:12;;;:45;131201:230;131441:39;131467:4;:12;;;131441:25;:39::i;:::-;131631:31;131649:4;:12;;;131631:17;:31::i;:::-;131610:18;;;:52;;;131673:30;;;;131735:65;131758:9;131769:4;:18;;;131789:4;:10;;;131735:22;:65::i;:::-;131724:8;;;:76;131864:18;;;;131823:60;;131853:9;;131823:29;:60::i;:::-;131811:9;;;:72;131896:339;;;;131931:31;131953:4;:8;;;131931:21;:31::i;:::-;131896:339;;;131995:31;132017:4;:8;;;131995:21;:31::i;:::-;132041:11;132055:80;132081:9;132092:4;132098;:18;;;132118:4;132124;:10;;;132055:25;:80::i;:::-;132041:94;;132190:32;132215:6;132190:24;:32::i;:::-;131896:339;;132293:27;;:57;;;;;;132336:10;132293:57;;;;132348:1;132293:57;;;;;;-1:-1:-1;;;;;132293:42:0;;;;;;:57;;;;;:27;;:57;;;;;;;;:27;:42;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;132361:27:0;;:68;;;;;;132407:10;132361:68;;;;132419:9;132361:68;;;;;;-1:-1:-1;;;;;132361:45:0;;;;-1:-1:-1;132361:45:0;;-1:-1:-1;132361:68:0;;;;;;;;;;;;;;;:27;:45;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;132440:27:0;;132498:18;;;;132440:77;;;;;;132486:10;132440:77;;;;;;;;;;;;-1:-1:-1;;;;;132440:45:0;;;;;;:77;;;;;132361:68;;132440:77;;;;;;;;:27;:45;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;132530:27:0;;:66;;;;;;132585:10;132530:66;;;;;;-1:-1:-1;;;;;132530:54:0;;;;;;:66;;;;;:27;;:66;;;;;;;;:27;:54;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;132620:27:0;;:65;;;-1:-1:-1;;;132620:65:0;;132674:10;132620:65;;;;;;-1:-1:-1;;;;;132620:53:0;;;;-1:-1:-1;132620:53:0;;-1:-1:-1;132620:65:0;;;;;;;;;;;;;;;:27;:53;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;132620:65:0;132607:10;;;:78;132698:12;;132730:9;;;;132698:66;;;;;;132718:10;132698:66;;;;;;;;;;;-1:-1:-1;;;;;132698:66:0;;;;;;;;;;;;;;;;:12;;;:19;;:66;;;;;:12;;:66;;;;;;;;:12;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;132793:27:0;;:60;;;;;;132842:10;132793:60;;;;;;-1:-1:-1;;;;;132793:48:0;;;;-1:-1:-1;132793:48:0;;-1:-1:-1;132793:60:0;;;;;;;;;;;;;;;:27;:48;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;132793:60:0;132775:15;;;:78;;;132869:41;;;;;;;132882:10;;132869:41;;;;;;132793:60;132869:41;;;133010:56;133029:14;:25;;;133056:9;133010:18;:56::i;:::-;133077:105;133091:14;:25;;;133118:14;:24;;;133144:10;133156:11;133169:4;:12;;;133077:13;:105::i;:::-;133266:25;;;;133293:24;;;;133319:14;;133252:128;;133266:25;133293:24;-1:-1:-1;;;;;133319:14:0;120572:5;;133252:13;:128::i;:::-;133411:10;-1:-1:-1;;;;;133398:96:0;;133423:4;:18;;;133443:9;133454:4;:10;;;133466:27;133398:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;133543:12;;;;;133510:46;;;;;;;133531:10;;133510:46;;;;;;;;130587:2977;;;;;;;:::o;121700:234::-;121752:21;121804:10;;:19;;;-1:-1:-1;;;121804:19:0;;;;121752:21;;-1:-1:-1;;;;;121804:10:0;;:17;;:19;;;;;;;;;;;;;;:10;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;121804:19:0;121856:11;;:20;;;-1:-1:-1;;;121856:20:0;;;;121804:19;;-1:-1:-1;121834:19:0;;-1:-1:-1;;;;;121856:11:0;;;;:18;;:20;;;;;121804:19;;121856:20;;;;;;;;:11;:20;;;;;;;;;;123922:79;123987:6;;-1:-1:-1;;;;;123987:6:0;123922:79;:::o;124288:92::-;124366:6;;-1:-1:-1;;;;;124366:6:0;124352:10;:20;;124288:92::o;126007:31::-;;;-1:-1:-1;;;;;126007:31:0;;:::o;125747:50::-;;;;;;;;;;;;;;;;;;;:::o;126197:33::-;;;-1:-1:-1;;;;;126197:33:0;;:::o;126087:27::-;;;-1:-1:-1;;;;;126087:27:0;;:::o;135024:306::-;135208:114;135221:10;135233:15;135250:11;135263:15;135280:10;135292;135304:17;135208:12;:114::i;:::-;135024:306;;;;;;:::o;133866:237::-;133990:31;:29;:31::i;:::-;134032:63;134045:9;134056:1;134059;134062:5;134069:10;134081;134093:1;134032:12;:63::i;120824:71::-;120867:28;120824:71;:::o;135640:4136::-;135827:36;;:::i;:::-;-1:-1:-1;135866:51:0;;;;;;;;135881:12;;-1:-1:-1;;;;;135881:12:0;;;135866:51;;-1:-1:-1;135895:10:0;;;135866:51;;;;135907:9;;;135866:51;;;;;;;135928:38;;:::i;:::-;135992:9;;;;;;;;;-1:-1:-1;;;;;135992:9:0;-1:-1:-1;;;;;135992:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;135992:22:0;135979:35;;;:10;;136047:30;;:18;:30::i;:::-;136025:52;;136094:15;136090:165;;;136126:64;136156:17;136175:14;136126:29;:64::i;:::-;136205:38;136231:11;136205:25;:38::i;:::-;136265:43;136292:15;136265:26;:43::i;:::-;136319:55;136345:15;136362:11;136319:25;:55::i;:::-;136407:27;;136385:61;;136436:9;136385:21;:61::i;:::-;136606:10;-1:-1:-1;;;;;136606:23:0;;;;:100;;-1:-1:-1;136648:20:0;;-1:-1:-1;;;;;136648:20:0;136634:10;:34;:51;;;;;136684:1;136672:9;:13;136634:51;:71;;;;-1:-1:-1;136689:16:0;;136634:71;136599:108;;;;136720:14;:27;;;-1:-1:-1;;;;;136720:47:0;;136768:9;136720:58;;;;;;;;;;;;;-1:-1:-1;;;;;136720:58:0;-1:-1:-1;;;;;136720:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;136919:42;136934:9;136945:15;136919:14;:42::i;:::-;136878:83;;136896:19;;;136878:83;136879:15;;;136878:83;-1:-1:-1;136974:18:0;;:32;;;137141:15;:34;;;;;137161:14;137160:15;137141:34;137137:302;;;137208:107;137229:14;:27;;;137258:14;:24;;;137284:11;137297:17;137208:20;:107::i;:::-;137193:12;;;:122;;;137351:18;;;;:36;;;:22;:36;:::i;:::-;137330:18;;;:57;137137:302;137463:14;:27;;;-1:-1:-1;;;;;137463:40:0;;137504:9;137463:51;;;;;;;;;;;;;-1:-1:-1;;;;;137463:51:0;-1:-1:-1;;;;;137463:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;137463:51:0;137451:9;;;:63;137537:27;;:51;;;-1:-1:-1;;;137537:51:0;;-1:-1:-1;;;;;137537:51:0;;;;;;;;;:40;;;;;;;:51;;;;;137463;;137537;;;;;;;:40;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;137537:51:0;137525:9;;;:63;;;137766:9;;;;137777:10;;137732:56;;137537:51;137766:9;137732:22;:56::i;:::-;137718:4;:11;;:70;;;;;137813:134;137839:4;:9;;;137850:4;:9;;;137861:4;:15;;;137878:4;:19;;;137899:4;:18;;;137919:15;137936:4;:10;;;137813:25;:134::i;:::-;137799:11;;;:148;137984:9;;;;137965:28;;;137958:36;;;;138094:92;138131:14;138147:15;138164;138181:4;138094:36;:92::i;:::-;138331:15;138330:16;:35;;;;;138364:1;138350:11;:15;138330:35;138326:314;;;138382:73;138408:46;138435:4;:18;;;138408:22;138420:4;:9;;;138408:11;:22::i;:::-;:26;:46;:26;:46;:::i;:::-;138382:25;:73::i;:::-;138470:57;138497:4;:9;;;138508:4;:18;;;138470:26;:57::i;:::-;138542:86;138572:14;:24;;;138598:9;138609:4;:18;;;138542:29;:86::i;:::-;138683:141;138710:14;:27;;;138739:9;138750:4;:15;;;138767:4;:19;;;138788:4;:18;;;138808:15;138683:26;:141::i;:::-;138667:12;;;138652:172;138653:12;;;138652:172;138848:27;;:64;;;-1:-1:-1;;;138848:64:0;;-1:-1:-1;;;;;138848:64:0;;;;;;;;;:53;;;;;;;:64;;;;;;;;;;;;;;-1:-1:-1;138848:53:0;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;138848:64:0;138835:10;;;:77;139023:9;;;;139034;;;;138848:64;139045:15;;;139062:19;;;;139083:18;;;;138975:12;;138990:129;;139023:9;;139034;;139045:15;;139103;138990:32;:129::i;:::-;139130:12;;:65;;;;;;-1:-1:-1;;;;;139130:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;138975:144;;-1:-1:-1;139130:12:0;;;:21;;:65;;;;;:12;;:65;;;;;;;;:12;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;139226:9;-1:-1:-1;;;;;139213:94:0;;139237:4;:12;;;139251:4;:12;;;139265:4;:10;;;139277:29;139213:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;139357:12;;;;139323:47;;;;;;;139344:10;;139323:47;;;;;;;;;;139469:299;139515:14;:25;;;139555:14;:24;;;139594:10;139619:4;:15;;;139649:4;:19;;;139683:11;139709:15;139739:4;:18;;;139469:31;:299::i;145930:246::-;146034:11;146048:13;-1:-1:-1;;;;;146048:28:0;;146077:9;146048:39;;;;;;;;;;;;;-1:-1:-1;;;;;146048:39:0;-1:-1:-1;;;;;146048:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;146048:39:0;;-1:-1:-1;146116:1:0;146106:11;;146098:70;;;;-1:-1:-1;;;146098:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146603:178;146685:26;146704:6;146685:18;:26::i;:::-;146684:27;146676:97;;;;-1:-1:-1;;;146676:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146603:178;:::o;30680:136::-;30738:7;30765:43;30769:1;30772;30765:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;30758:50;30680:136;-1:-1:-1;;;30680:136:0:o;149664:258::-;149834:14;149799:10;-1:-1:-1;;;;;149799:20:0;;149820:9;149799:31;;;;;;;;;;;;;-1:-1:-1;;;;;149799:31:0;-1:-1:-1;;;;;149799:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;149799:31:0;:49;;149791:123;;;;-1:-1:-1;;;149791:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;152288:650;152524:4;152546:14;152563:21;:19;:21::i;:::-;152546:38;;152595:14;152612:21;:19;:21::i;:::-;152595:38;;152658:15;:73;;152705:26;:9;152719:11;152705:26;:13;:26;:::i;:::-;152658:73;;;152676:26;:9;152690:11;152676:26;:13;:26;:::i;:::-;152646:85;;152754:15;:73;;152801:26;:9;152815:11;152801:26;:13;:26;:::i;:::-;152754:73;;;152772:26;:9;152786:11;152772:26;:13;:26;:::i;:::-;152742:85;;152840:11;152854:52;152877:9;152888;152899:6;152854:22;:52::i;:::-;152840:66;152288:650;-1:-1:-1;;;;;;;;;152288:650:0:o;148863:181::-;120425:19;148944:7;:14;;148936:100;;;;-1:-1:-1;;;148936:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145030:204;145148:11;-1:-1:-1;;;;;145148:28:0;;145177:5;145148:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145194:10;-1:-1:-1;;;;;145194:15:0;;145210:8;145220:5;145194:32;;;;;;;;;;;;;-1:-1:-1;;;;;145194:32:0;-1:-1:-1;;;;;145194:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145030:204;;;;:::o;121194:126::-;121256:4;121280:32;:5;120572;121280:32;:9;:32;:::i;125263:337::-;-1:-1:-1;;;;;125337:22:0;;125329:65;;;;;-1:-1:-1;;;125329:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;125506:21;;125547:8;125539:53;;;;;-1:-1:-1;;;125539:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;124832:133;124908:6;;124887:40;;124924:1;;-1:-1:-1;;;;;124908:6:0;;124887:40;;124924:1;;124887:40;124938:6;:19;;-1:-1:-1;;124938:19:0;;;124832:133::o;30224:181::-;30282:7;30314:5;;;30338:6;;;;30330:46;;;;;-1:-1:-1;;;30330:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;122485:144;122549:4;122566:8;122577:15;122585:6;122577:7;:15::i;:::-;120425:19;-1:-1:-1;;122485:144:0;-1:-1:-1;;;122485:144:0:o;149930:476::-;150044:15;150040:359;;;29191:4;150084:17;:38;;150076:118;;;;-1:-1:-1;;;150076:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;150040:359;;;120867:28;150235:40;;;;;:82;;;29191:4;150279:17;:38;;150235:82;150227:160;;;;-1:-1:-1;;;150227:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146184:231;146291:11;146305:13;-1:-1:-1;;;;;146305:28:0;;146334:9;146305:39;;;;;;;;;;;;;-1:-1:-1;;;;;146305:39:0;-1:-1:-1;;;;;146305:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;146305:39:0;;-1:-1:-1;146373:1:0;146363:11;;;146355:52;;;;;-1:-1:-1;;;146355:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;141494:574;141636:4;141653:13;-1:-1:-1;;;;;141653:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;141743:12;141758:13;-1:-1:-1;;;;;141758:29:0;;141788:11;141758:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;141758:42:0;;-1:-1:-1;141813:63:0;141758:42;141845:11;141858:17;141813:22;:63::i;:::-;141943:11;;:35;;;;;;;;;;;;;;-1:-1:-1;;;;;141943:11:0;;;;:26;;:35;;;;;:11;;:35;;;;;;;;:11;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;142005:18:0;;141989:44;;;;;;-1:-1:-1;;;;;142005:18:0;;;141989:44;;;;;;;;;;;;:15;;;;-1:-1:-1;141989:15:0;;-1:-1:-1;141989:44:0;;;;;142005:18;;141989:44;;;;;;;;142005:18;141989:15;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142053:7:0;;141494:574;-1:-1:-1;;;;;;;;141494:574:0:o;149052:179::-;120680:5;149136:8;:24;;149127:96;;;;-1:-1:-1;;;149127:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117771:414;117851:4;117872:9;;117868:310;;117898:17;117918:28;117940:5;117918:17;:5;117928:6;117918:17;:9;:17;:::i;:::-;:21;:28;:21;:28;:::i;:::-;117898:48;-1:-1:-1;117963:19:0;;-1:-1:-1;117963:19:0;117868:310;-1:-1:-1;;;117771:414:0;;;;;:::o;117397:366::-;117471:4;117492:9;;117488:268;;117525:36;117555:5;117525:25;:5;114909:4;117525:25;:9;:25;:::i;:36::-;117518:43;;;;117488:268;-1:-1:-1;;;117727:17:0;;148496:160;120425:19;148574:7;:14;;148566:82;;;;-1:-1:-1;;;148566:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;148310:178;120226:19;148388:7;:14;;148380:100;;;;-1:-1:-1;;;148380:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;144293:235;144399:45;;144381:12;;-1:-1:-1;;;;;144399:25:0;;;144432:7;;144381:12;144399:45;144381:12;144399:45;144432:7;144399:25;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;144380:64;;;144463:7;144455:65;;;;-1:-1:-1;;;144455:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;144677:253;144827:11;-1:-1:-1;;;;;144827:28:0;;144856:16;144827:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;144884:10;-1:-1:-1;;;;;144884:15:0;;144900:8;144910:11;144884:38;;;;;;;;;;;;;-1:-1:-1;;;;;144884:38:0;-1:-1:-1;;;;;144884:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;144677:253;;;;;:::o;149493:162::-;149581:20;;-1:-1:-1;;;;;149581:20:0;149567:10;:34;149559:88;;;;-1:-1:-1;;;149559:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149493:162::o;146423:169::-;146523:1;146509:11;:15;146501:83;;;;-1:-1:-1;;;146501:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145288:190;145379:9;:14;;:38;;-1:-1:-1;145397:20:0;;145379:38;145371:99;;;;-1:-1:-1;;;145371:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145673:249;145781:9;:14;;;:38;;-1:-1:-1;145799:20:0;;;145781:38;:58;;;-1:-1:-1;145823:16:0;;;145781:58;145773:141;;;;-1:-1:-1;;;145773:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;142263:393;142412:15;;142470:18;;142466:183;;-1:-1:-1;142518:13:0;;-1:-1:-1;142563:4:0;142466:183;;;142613:24;142600:37;;142466:183;142263:393;;;;;:::o;151197:531::-;151475:4;151498:12;151512;151528:93;151548:5;151555;151562:11;151575:15;151592:11;151605:15;151528:19;:93::i;:::-;151497:124;;;;151634:11;151648:48;151671:7;151680;151689:6;151648:22;:48::i;:::-;151634:62;151197:531;-1:-1:-1;;;;;;;;;;;151197:531:0:o;146981:1321::-;147737:15;147733:562;;;147769:41;147794:15;147769:24;:41::i;:::-;147829:15;147825:165;;;147865:35;147887:5;:12;;;147865:21;:35::i;:::-;147919:55;147947:5;:12;;;147961:5;:12;;;147919:27;:55::i;:::-;147733:562;;;148047:35;148069:5;:12;;;148047:21;:35::i;:::-;148112:116;148138:5;:16;;;148156:5;:20;;;148178:5;:19;;;148199:15;148216:5;:11;;;148112:25;:116::i;:::-;148097:12;;;:131;;;148243:38;;:24;:38::i;121328:120::-;121384:4;121408:32;:5;120572;121408:32;:9;:32;:::i;149239:246::-;149366:39;:12;120572:5;149366:39;:16;:39;:::i;:::-;149348:14;:57;;149340:137;;;;-1:-1:-1;;;149340:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;142744:730;143011:4;143017;143039:12;143055:15;143054:174;;143173:13;-1:-1:-1;;;;;143173:31:0;;143205:9;143216:11;143173:55;;;;;;;;;;;;;-1:-1:-1;;;;;143173:55:0;-1:-1:-1;;;;;143173:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;143173:55:0;143054:174;;;143074:13;-1:-1:-1;;;;;143074:31:0;;143106:9;143117:11;143074:55;;;;;;;;;;;;;-1:-1:-1;;;;;143074:55:0;-1:-1:-1;;;;;143074:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;143074:55:0;143054:174;143039:189;;143239:12;143255:15;143254:174;;143373:13;-1:-1:-1;;;;;143373:31:0;;143405:9;143416:11;143373:55;;;;;;;;;;;;;-1:-1:-1;;;;;143373:55:0;-1:-1:-1;;;;;143373:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;143373:55:0;143254:174;;;143274:13;-1:-1:-1;;;;;143274:31:0;;143306:9;143317:11;143274:55;;;;;;;;;;;;;-1:-1:-1;;;;;143274:55:0;-1:-1:-1;;;;;143274:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;143274:55:0;143254:174;143449:7;;;;-1:-1:-1;142744:730:0;;-1:-1:-1;;;;;;;;142744:730:0:o;150562:517::-;150825:4;150848:12;150862;150878:93;150898:5;150905;150912:11;150925:15;150942:11;150955:15;150878:19;:93::i;:::-;150847:124;;;;150984:12;150999:47;151029:7;151038;150999:29;:47::i;:::-;150984:62;150562:517;-1:-1:-1;;;;;;;;;;150562:517:0:o;143482:733::-;143814:15;143810:218;;;143846:78;143860:11;143873:10;143885:9;143896:11;143909:14;143846:13;:78::i;:::-;143810:218;;;143957:59;143968:11;143981:10;143993:9;144004:11;143957:10;:59::i;:::-;144044:15;144040:168;;;144076:44;144095:11;144108;144076:18;:44::i;:::-;144040:168;;;144153:11;-1:-1:-1;;;;;144153:19:0;;144173:9;144184:11;144153:43;;;;;;;;;;;;;-1:-1:-1;;;;;144153:43:0;-1:-1:-1;;;;;144153:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;143482:733;;;;;;;;:::o;31153:192::-;31239:7;31275:12;31267:6;;;;31259:29;;;;-1:-1:-1;;;31259:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31311:5:0;;;31153:192::o;122186:291::-;122239:8;122260:21;122284;:19;:21::i;:::-;122260:45;;122316:21;122340;:19;:21::i;:::-;122316:45;;122380:66;122403:16;122421;122439:6;122380:22;:66::i;:::-;122374:72;122186:291;-1:-1:-1;;;;122186:291:0:o;122637:262::-;122743:18;122764:40;122796:7;122764:27;:4;29191;122764:27;:8;:27;:::i;:40::-;122743:61;;122840:17;122823:13;:34;;122815:76;;;;;-1:-1:-1;;;122815:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;31596:471;31654:7;31899:6;31895:47;;-1:-1:-1;31929:1:0;31922:8;;31895:47;31966:5;;;31970:1;31966;:5;:1;31990:5;;;;;:10;31982:56;;;;-1:-1:-1;;;31982:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32535:132;32593:7;32620:39;32624:1;32627;32620:39;;;;;;;;;;;;;;;;;:3;:39::i;151736:544::-;151980:4;;152023:5;152054;152082:15;:66;;152126:22;:5;152136:11;152126:22;:9;:22;:::i;:::-;152082:66;;;152100:22;:5;152110:11;152100:22;:9;:22;:::i;:::-;152072:76;;152169:15;:65;;152212:22;:5;152222:11;152212:22;:9;:22;:::i;:::-;152169:65;;;152187:22;:5;152197:11;152187:22;:9;:22;:::i;146789:184::-;146878:20;;146870:95;;;;-1:-1:-1;;;146870:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;148664:191;148773:7;148762;:18;;148754:93;;;;-1:-1:-1;;;148754:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33197:345;33283:7;33385:12;33378:5;33370:28;;;;-1:-1:-1;;;33370:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33409:9;33425:1;33421;:5;;;;;;;33197:345;-1:-1:-1;;;;;33197:345:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://6b5eb9ab525507f6867fba3e8d848b44cf6bb718d55f67d94e15f7efab5b39b6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.