Polygon Sponsored slots available. Book your slot here!
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 326 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Trigger Liquidat... | 25813634 | 1002 days ago | IN | 0 POL | 0.00297055 | ||||
Trigger Liquidat... | 25783125 | 1003 days ago | IN | 0 POL | 0.00360885 | ||||
Trigger Liquidat... | 25744071 | 1004 days ago | IN | 0 POL | 0.00341245 | ||||
Trigger Liquidat... | 25704779 | 1005 days ago | IN | 0 POL | 0.00349592 | ||||
Trigger Liquidat... | 25664876 | 1006 days ago | IN | 0 POL | 0.00287235 | ||||
Trigger Liquidat... | 25626420 | 1007 days ago | IN | 0 POL | 0.00316695 | ||||
Trigger Liquidat... | 25588748 | 1008 days ago | IN | 0 POL | 0.00226351 | ||||
Trigger Liquidat... | 25512131 | 1010 days ago | IN | 0 POL | 0.00198855 | ||||
Trigger Liquidat... | 25474883 | 1011 days ago | IN | 0 POL | 0.0018658 | ||||
Trigger Liquidat... | 25438118 | 1012 days ago | IN | 0 POL | 0.00306875 | ||||
Trigger Liquidat... | 25401831 | 1013 days ago | IN | 0 POL | 0.00250901 | ||||
Trigger Liquidat... | 25369848 | 1014 days ago | IN | 0 POL | 0.00201801 | ||||
Trigger Liquidat... | 25337280 | 1015 days ago | IN | 0 POL | 0.00252865 | ||||
Trigger Liquidat... | 25305666 | 1016 days ago | IN | 0 POL | 0.00169886 | ||||
Trigger Liquidat... | 25274383 | 1017 days ago | IN | 0 POL | 0.00165467 | ||||
Trigger Liquidat... | 25243641 | 1018 days ago | IN | 0 POL | 0.00173814 | ||||
Trigger Liquidat... | 25210872 | 1019 days ago | IN | 0 POL | 0.00206711 | ||||
Trigger Liquidat... | 25172587 | 1020 days ago | IN | 0 POL | 0.00300983 | ||||
Trigger Liquidat... | 25133370 | 1021 days ago | IN | 0 POL | 0.00203274 | ||||
Trigger Liquidat... | 25097694 | 1022 days ago | IN | 0 POL | 0.00179215 | ||||
Trigger Liquidat... | 25064775 | 1023 days ago | IN | 0 POL | 0.00195418 | ||||
Trigger Liquidat... | 25027901 | 1024 days ago | IN | 0 POL | 0.0014593 | ||||
Trigger Liquidat... | 25021759 | 1024 days ago | IN | 0 POL | 0.02808446 | ||||
Trigger Liquidat... | 24989020 | 1025 days ago | IN | 0 POL | 0.0023568 | ||||
Trigger Liquidat... | 24949805 | 1026 days ago | IN | 0 POL | 0.0017676 |
Loading...
Loading
Contract Name:
PLiquidator
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-25 */ pragma solidity 0.8.2; interface ISavingsManager { /** @dev Admin privs */ function distributeUnallocatedInterest(address _mAsset) external; /** @dev Liquidator */ function depositLiquidation(address _mAsset, uint256 _liquidation) external; /** @dev Liquidator */ function collectAndStreamInterest(address _mAsset) external; /** @dev Public privs */ function collectAndDistributeInterest(address _mAsset) external; /** @dev getter for public lastBatchCollected mapping */ function lastBatchCollected(address _mAsset) external view returns (uint256); } struct BassetPersonal { // Address of the bAsset address addr; // Address of the bAsset address integrator; // An ERC20 can charge transfer fee, for example USDT, DGX tokens. bool hasTxFee; // takes a byte in storage // Status of the bAsset BassetStatus status; } // Status of the Basset - has it broken its peg? enum BassetStatus { Default, Normal, BrokenBelowPeg, BrokenAbovePeg, Blacklisted, Liquidating, Liquidated, Failed } struct BassetData { // 1 Basset * ratio / ratioScale == x Masset (relative value) // If ratio == 10e8 then 1 bAsset = 10 mAssets // A ratio is divised as 10^(18-tokenDecimals) * measurementMultiple(relative value of 1 base unit) uint128 ratio; // Amount of the Basset that is held in Collateral uint128 vaultBalance; } abstract contract IMasset { // Mint function mint( address _input, uint256 _inputQuantity, uint256 _minOutputQuantity, address _recipient ) external virtual returns (uint256 mintOutput); function mintMulti( address[] calldata _inputs, uint256[] calldata _inputQuantities, uint256 _minOutputQuantity, address _recipient ) external virtual returns (uint256 mintOutput); function getMintOutput(address _input, uint256 _inputQuantity) external view virtual returns (uint256 mintOutput); function getMintMultiOutput(address[] calldata _inputs, uint256[] calldata _inputQuantities) external view virtual returns (uint256 mintOutput); // Swaps function swap( address _input, address _output, uint256 _inputQuantity, uint256 _minOutputQuantity, address _recipient ) external virtual returns (uint256 swapOutput); function getSwapOutput( address _input, address _output, uint256 _inputQuantity ) external view virtual returns (uint256 swapOutput); // Redemption function redeem( address _output, uint256 _mAssetQuantity, uint256 _minOutputQuantity, address _recipient ) external virtual returns (uint256 outputQuantity); function redeemMasset( uint256 _mAssetQuantity, uint256[] calldata _minOutputQuantities, address _recipient ) external virtual returns (uint256[] memory outputQuantities); function redeemExactBassets( address[] calldata _outputs, uint256[] calldata _outputQuantities, uint256 _maxMassetQuantity, address _recipient ) external virtual returns (uint256 mAssetRedeemed); function getRedeemOutput(address _output, uint256 _mAssetQuantity) external view virtual returns (uint256 bAssetOutput); function getRedeemExactBassetsOutput( address[] calldata _outputs, uint256[] calldata _outputQuantities ) external view virtual returns (uint256 mAssetAmount); // Views function getBasket() external view virtual returns (bool, bool); function getBasset(address _token) external view virtual returns (BassetPersonal memory personal, BassetData memory data); function getBassets() external view virtual returns (BassetPersonal[] memory personal, BassetData[] memory data); function bAssetIndexes(address) external view virtual returns (uint8); function getPrice() external view virtual returns (uint256 price, uint256 k); // SavingsManager function collectInterest() external virtual returns (uint256 swapFeesGained, uint256 newSupply); function collectPlatformInterest() external virtual returns (uint256 mintAmount, uint256 newSupply); // Admin function setCacheSize(uint256 _cacheSize) external virtual; function setFees(uint256 _swapFee, uint256 _redemptionFee) external virtual; function setTransferFeesFlag(address _bAsset, bool _flag) external virtual; function migrateBassets(address[] calldata _bAssets, address _newIntegration) external virtual; } interface IPLiquidator { function createLiquidation( address _integration, address _sellToken, address _bAsset, address[] calldata _uniswapPath, uint256 _minReturn ) external; function updateBasset( address _integration, address _bAsset, address[] calldata _uniswapPath, uint256 _minReturn ) external; function deleteLiquidation(address _integration) external; function triggerLiquidation(address _integration) external; } interface IUniswapV2Router02 { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, // calculated off chain address[] calldata path, // also worked out off chain address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); } contract ModuleKeys { // Governance // =========== // keccak256("Governance"); bytes32 internal constant KEY_GOVERNANCE = 0x9409903de1e6fd852dfc61c9dacb48196c48535b60e25abf92acc92dd689078d; //keccak256("Staking"); bytes32 internal constant KEY_STAKING = 0x1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034; //keccak256("ProxyAdmin"); bytes32 internal constant KEY_PROXY_ADMIN = 0x96ed0203eb7e975a4cbcaa23951943fa35c5d8288117d50c12b3d48b0fab48d1; // mStable // ======= // keccak256("OracleHub"); bytes32 internal constant KEY_ORACLE_HUB = 0x8ae3a082c61a7379e2280f3356a5131507d9829d222d853bfa7c9fe1200dd040; // keccak256("Manager"); bytes32 internal constant KEY_MANAGER = 0x6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f; //keccak256("Recollateraliser"); bytes32 internal constant KEY_RECOLLATERALISER = 0x39e3ed1fc335ce346a8cbe3e64dd525cf22b37f1e2104a755e761c3c1eb4734f; //keccak256("MetaToken"); bytes32 internal constant KEY_META_TOKEN = 0xea7469b14936af748ee93c53b2fe510b9928edbdccac3963321efca7eb1a57a2; // keccak256("SavingsManager"); bytes32 internal constant KEY_SAVINGS_MANAGER = 0x12fe936c77a1e196473c4314f3bed8eeac1d757b319abb85bdda70df35511bf1; // keccak256("Liquidator"); bytes32 internal constant KEY_LIQUIDATOR = 0x1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d4; // keccak256("InterestValidator"); bytes32 internal constant KEY_INTEREST_VALIDATOR = 0xc10a28f028c7f7282a03c90608e38a4a646e136e614e4b07d119280c5f7f839f; } interface INexus { function governor() external view returns (address); function getModule(bytes32 key) external view returns (address); function proposeModule(bytes32 _key, address _addr) external; function cancelProposedModule(bytes32 _key) external; function acceptProposedModule(bytes32 _key) external; function acceptProposedModules(bytes32[] calldata _keys) external; function requestLockModule(bytes32 _key) external; function cancelLockModule(bytes32 _key) external; function lockModule(bytes32 _key) external; } abstract contract ImmutableModule is ModuleKeys { INexus public immutable nexus; /** * @dev Initialization function for upgradable proxy contracts * @param _nexus Nexus contract address */ constructor(address _nexus) { require(_nexus != address(0), "Nexus address is zero"); nexus = INexus(_nexus); } /** * @dev Modifier to allow function calls only from the Governor. */ modifier onlyGovernor() { _onlyGovernor(); _; } function _onlyGovernor() internal view { require(msg.sender == _governor(), "Only governor can execute"); } /** * @dev Modifier to allow function calls only from the Governance. * Governance is either Governor address or Governance address. */ modifier onlyGovernance() { require( msg.sender == _governor() || msg.sender == _governance(), "Only governance can execute" ); _; } /** * @dev Returns Governor address from the Nexus * @return Address of Governor Contract */ function _governor() internal view returns (address) { return nexus.governor(); } /** * @dev Returns Governance Module address from the Nexus * @return Address of the Governance (Phase 2) */ function _governance() internal view returns (address) { return nexus.getModule(KEY_GOVERNANCE); } /** * @dev Return SavingsManager Module address from the Nexus * @return Address of the SavingsManager Module contract */ function _savingsManager() internal view returns (address) { return nexus.getModule(KEY_SAVINGS_MANAGER); } /** * @dev Return Recollateraliser Module address from the Nexus * @return Address of the Recollateraliser Module contract (Phase 2) */ function _recollateraliser() internal view returns (address) { return nexus.getModule(KEY_RECOLLATERALISER); } /** * @dev Return Recollateraliser Module address from the Nexus * @return Address of the Recollateraliser Module contract (Phase 2) */ function _liquidator() internal view returns (address) { return nexus.getModule(KEY_LIQUIDATOR); } /** * @dev Return ProxyAdmin Module address from the Nexus * @return Address of the ProxyAdmin Module contract */ function _proxyAdmin() internal view returns (address) { return nexus.getModule(KEY_PROXY_ADMIN); } } interface IBasicToken { function decimals() external view returns (uint8); } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // SPDX-License-Identifier: GPL-3.0-or-later /** * @title PLiquidator * @author mStable * @notice The Liquidator allows rewards to be swapped for another token and sent * to SavingsManager for distribution * @dev VERSION: 1.0 * DATE: 2021-04-22 */ contract PLiquidator is IPLiquidator, ImmutableModule { using SafeERC20 for IERC20; event LiquidationModified(address indexed integration); event LiquidationEnded(address indexed integration); event Liquidated(address indexed sellToken, address mUSD, uint256 mUSDAmount, address buyToken); address public immutable mUSD; IUniswapV2Router02 public immutable quickSwap; mapping(address => PLiquidation) public liquidations; mapping(address => uint256) public minReturn; struct PLiquidation { address sellToken; address bAsset; address[] uniswapPath; uint256 lastTriggered; } constructor( address _nexus, address _quickswapRouter, address _mUSD ) ImmutableModule(_nexus) { require(_quickswapRouter != address(0), "Invalid quickSwap address"); quickSwap = IUniswapV2Router02(_quickswapRouter); require(_mUSD != address(0), "Invalid mUSD address"); mUSD = _mUSD; } /*************************************** GOVERNANCE ****************************************/ /** * @dev Create a liquidation * @param _integration The integration contract address from which to receive sellToken * @param _sellToken Token harvested from the integration contract * @param _bAsset The asset to buy on Uniswap * @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI] * @param _minReturn Minimum exact amount of bAsset to get for each (whole) sellToken unit */ function createLiquidation( address _integration, address _sellToken, address _bAsset, address[] calldata _uniswapPath, uint256 _minReturn ) external override onlyGovernance { require( liquidations[_integration].sellToken == address(0), "Liquidation exists for this bAsset" ); require( _integration != address(0) && _sellToken != address(0) && _bAsset != address(0) && _uniswapPath.length >= 2 && _minReturn > 0, "Invalid inputs" ); require(_validUniswapPath(_sellToken, _bAsset, _uniswapPath), "Invalid uniswap path"); liquidations[_integration] = PLiquidation({ sellToken: _sellToken, bAsset: _bAsset, uniswapPath: _uniswapPath, lastTriggered: 0 }); minReturn[_integration] = _minReturn; emit LiquidationModified(_integration); } /** * @dev Update a liquidation * @param _integration The integration contract in question * @param _bAsset New asset to buy on Uniswap * @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI] * @param _minReturn Minimum exact amount of bAsset to get for each (whole) sellToken unit */ function updateBasset( address _integration, address _bAsset, address[] calldata _uniswapPath, uint256 _minReturn ) external override onlyGovernance { PLiquidation memory liquidation = liquidations[_integration]; address oldBasset = liquidation.bAsset; require(oldBasset != address(0), "Liquidation does not exist"); require(_minReturn > 0, "Must set some minimum value"); require(_bAsset != address(0), "Invalid bAsset"); require( _validUniswapPath(liquidation.sellToken, _bAsset, _uniswapPath), "Invalid uniswap path" ); liquidations[_integration].bAsset = _bAsset; liquidations[_integration].uniswapPath = _uniswapPath; minReturn[_integration] = _minReturn; emit LiquidationModified(_integration); } /** * @dev Validates a given uniswap path - valid if sellToken at position 0 and bAsset at end * @param _sellToken Token harvested from the integration contract * @param _bAsset New asset to buy on Uniswap * @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI] */ function _validUniswapPath( address _sellToken, address _bAsset, address[] memory _uniswapPath ) internal pure returns (bool) { uint256 len = _uniswapPath.length; return _sellToken == _uniswapPath[0] && _bAsset == _uniswapPath[len - 1]; } /** * @dev Delete a liquidation */ function deleteLiquidation(address _integration) external override onlyGovernance { PLiquidation memory liquidation = liquidations[_integration]; require(liquidation.bAsset != address(0), "Liquidation does not exist"); delete liquidations[_integration]; delete minReturn[_integration]; emit LiquidationEnded(_integration); } /*************************************** LIQUIDATION ****************************************/ /** * @dev Triggers a liquidation, flow (once per week): * - Sells $COMP for $USDC (or other) on Uniswap (up to trancheAmount) * - Mint mUSD from USDC * - Send to SavingsManager * @param _integration Integration for which to trigger liquidation */ function triggerLiquidation(address _integration) external override { // solium-disable-next-line security/no-tx-origin require(tx.origin == msg.sender, "Must be EOA"); PLiquidation memory liquidation = liquidations[_integration]; address bAsset = liquidation.bAsset; require(bAsset != address(0), "Liquidation does not exist"); require(block.timestamp > liquidation.lastTriggered + 22 hours, "Must wait for interval"); liquidations[_integration].lastTriggered = block.timestamp; // Cache variables address sellToken = liquidation.sellToken; // 1. Transfer sellTokens from integration contract if there are some // Assumes infinite approval uint256 integrationBal = IERC20(sellToken).balanceOf(_integration); if (integrationBal > 0) { IERC20(sellToken).safeTransferFrom(_integration, address(this), integrationBal); } // 2. Get the amount to sell based on the tranche amount we want to buy // Check contract balance uint256 sellTokenBal = IERC20(sellToken).balanceOf(address(this)); require(sellTokenBal > 0, "No sell tokens to liquidate"); // 3. Make the swap // 3.1 Approve Uniswap and make the swap IERC20(sellToken).safeApprove(address(quickSwap), 0); IERC20(sellToken).safeApprove(address(quickSwap), sellTokenBal); // 3.2. Make the sale > https://uniswap.org/docs/v2/smart-contracts/router02/#swapexacttokensfortokens // min amount out = sellAmount * priceFloor / 1e18 // e.g. 1e18 * 100e6 / 1e18 = 100e6 // e.g. 30e8 * 100e6 / 1e8 = 3000e6 // e.g. 30e18 * 100e18 / 1e18 = 3000e18 uint256 sellTokenDec = IBasicToken(sellToken).decimals(); uint256 minOut = (sellTokenBal * minReturn[_integration]) / (10**sellTokenDec); require(minOut > 0, "Must have some price floor"); quickSwap.swapExactTokensForTokens( sellTokenBal, minOut, liquidation.uniswapPath, address(this), block.timestamp + 1800 ); // 3.3. Mint via mUSD uint256 minted = _mint(bAsset, mUSD); // 4.0. Send to SavingsManager address savings = _savingsManager(); IERC20(mUSD).safeApprove(savings, 0); IERC20(mUSD).safeApprove(savings, minted); ISavingsManager(savings).depositLiquidation(mUSD, minted); emit Liquidated(sellToken, mUSD, minted, bAsset); } function _mint(address _bAsset, address _mUSD) internal returns (uint256 minted) { uint256 bAssetBal = IERC20(_bAsset).balanceOf(address(this)); IERC20(_bAsset).safeApprove(_mUSD, 0); IERC20(_bAsset).safeApprove(_mUSD, bAssetBal); uint256 bAssetDec = IBasicToken(_bAsset).decimals(); // e.g. 100e6 * 95e16 / 1e6 = 100e18 uint256 minOut = (bAssetBal * 90e16) / (10**bAssetDec); minted = IMasset(_mUSD).mint(_bAsset, bAssetBal, minOut, address(this)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nexus","type":"address"},{"internalType":"address","name":"_quickswapRouter","type":"address"},{"internalType":"address","name":"_mUSD","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sellToken","type":"address"},{"indexed":false,"internalType":"address","name":"mUSD","type":"address"},{"indexed":false,"internalType":"uint256","name":"mUSDAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyToken","type":"address"}],"name":"Liquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"integration","type":"address"}],"name":"LiquidationEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"integration","type":"address"}],"name":"LiquidationModified","type":"event"},{"inputs":[{"internalType":"address","name":"_integration","type":"address"},{"internalType":"address","name":"_sellToken","type":"address"},{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"address[]","name":"_uniswapPath","type":"address[]"},{"internalType":"uint256","name":"_minReturn","type":"uint256"}],"name":"createLiquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_integration","type":"address"}],"name":"deleteLiquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"liquidations","outputs":[{"internalType":"address","name":"sellToken","type":"address"},{"internalType":"address","name":"bAsset","type":"address"},{"internalType":"uint256","name":"lastTriggered","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mUSD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nexus","outputs":[{"internalType":"contract INexus","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quickSwap","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_integration","type":"address"}],"name":"triggerLiquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_integration","type":"address"},{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"address[]","name":"_uniswapPath","type":"address[]"},{"internalType":"uint256","name":"_minReturn","type":"uint256"}],"name":"updateBasset","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200214738038062002147833981016040819052620000349162000199565b826001600160a01b038116620000915760405162461bcd60e51b815260206004820152601560248201527f4e657875732061646472657373206973207a65726f000000000000000000000060448201526064015b60405180910390fd5b60601b6001600160601b0319166080526001600160a01b038216620000f95760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420717569636b53776170206164647265737300000000000000604482015260640162000088565b6001600160601b0319606083901b1660c0526001600160a01b038116620001635760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d5553442061646472657373000000000000000000000000604482015260640162000088565b60601b6001600160601b03191660a05250620001e29050565b80516001600160a01b03811681146200019457600080fd5b919050565b600080600060608486031215620001ae578283fd5b620001b9846200017c565b9250620001c9602085016200017c565b9150620001d9604085016200017c565b90509250925092565b60805160601c60a05160601c60c05160601c611ee0620002676000396000818160e501528181610c7501528181610caa0152610dd50152600081816101e601528181610e9701528181610ed601528181610f0b01528181610f490152610fb80152600081816101ac015281816110340152818161110001526115990152611ee06000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063937d4c4211610066578063937d4c4214610132578063a164140214610194578063a3f5c1d2146101a7578063b350df5d146101ce578063f09a1d00146101e157610093565b80630ac1ff80146100985780633d0eaf0d146100cb5780634086571e146100e05780637e9fd2221461011f575b600080fd5b6100b86100a6366004611951565b60016020526000908152604090205481565b6040519081526020015b60405180910390f35b6100de6100d9366004611a0b565b610208565b005b6101077f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100c2565b6100de61012d366004611951565b6104df565b61016e610140366004611951565b6000602081905290815260409020805460018201546003909201546001600160a01b03918216929091169083565b604080516001600160a01b039485168152939092166020840152908201526060016100c2565b6100de6101a2366004611989565b610695565b6101077f000000000000000000000000000000000000000000000000000000000000000081565b6100de6101dc366004611951565b610985565b6101077f000000000000000000000000000000000000000000000000000000000000000081565b610210611030565b6001600160a01b0316336001600160a01b0316148061024757506102326110c8565b6001600160a01b0316336001600160a01b0316145b61026c5760405162461bcd60e51b815260040161026390611bdd565b60405180910390fd5b6001600160a01b03808616600090815260208181526040808320815160808101835281548616815260018201549095168584015260028101805483518186028101860185528181529596959294938601938301828280156102f657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102d8575b5050509183525050600391909101546020918201528101519091506001600160a01b0381166103375760405162461bcd60e51b815260040161026390611c14565b600083116103875760405162461bcd60e51b815260206004820152601b60248201527f4d7573742073657420736f6d65206d696e696d756d2076616c756500000000006044820152606401610263565b6001600160a01b0386166103ce5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a590818905cdcd95d60921b6044820152606401610263565b61041082600001518787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061114b92505050565b6104535760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840eadcd2e6eec2e040e0c2e8d60631b6044820152606401610263565b6001600160a01b0387811660009081526020819052604090206001810180546001600160a01b0319169289169290921790915561049490600201868661181a565b506001600160a01b038716600081815260016020526040808220869055517f52f63ab5789c9a266379c35974b035fb9f7079ec0effab1b31e7ad82fadb488a9190a250505050505050565b6104e7611030565b6001600160a01b0316336001600160a01b0316148061051e57506105096110c8565b6001600160a01b0316336001600160a01b0316145b61053a5760405162461bcd60e51b815260040161026390611bdd565b6001600160a01b03808216600090815260208181526040808320815160808101835281548616815260018201549095168584015260028101805483518186028101860185528181529596959294938601938301828280156105c457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105a6575b5050509183525050600391909101546020918201528101519091506001600160a01b03166106045760405162461bcd60e51b815260040161026390611c14565b6001600160a01b038216600090815260208190526040812080546001600160a01b03199081168255600182018054909116905590610645600283018261187d565b5060006003919091018190556001600160a01b038316808252600160205260408083208390555190917fe513b42585b0ceec0d56d56fe3a23861c15a2f74eb4c32c94334d63d68ff4dcf91a25050565b61069d611030565b6001600160a01b0316336001600160a01b031614806106d457506106bf6110c8565b6001600160a01b0316336001600160a01b0316145b6106f05760405162461bcd60e51b815260040161026390611bdd565b6001600160a01b0386811660009081526020819052604090205416156107635760405162461bcd60e51b815260206004820152602260248201527f4c69717569646174696f6e2065786973747320666f7220746869732062417373604482015261195d60f21b6064820152608401610263565b6001600160a01b0386161580159061078357506001600160a01b03851615155b801561079757506001600160a01b03841615155b80156107a4575060028210155b80156107b05750600081115b6107ed5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b6044820152606401610263565b61082b858585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061114b92505050565b61086e5760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840eadcd2e6eec2e040e0c2e8d60631b6044820152606401610263565b6040518060800160405280866001600160a01b03168152602001856001600160a01b03168152602001848480806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093855250505060209182018190526001600160a01b03808a168252818352604091829020845181549083166001600160a01b03199182161782558585015160018301805491909416911617909155908301518051919261092e9260028501929091019061189e565b50606091909101516003909101556001600160a01b038616600081815260016020526040808220849055517f52f63ab5789c9a266379c35974b035fb9f7079ec0effab1b31e7ad82fadb488a9190a2505050505050565b3233146109c25760405162461bcd60e51b815260206004820152600b60248201526a4d75737420626520454f4160a81b6044820152606401610263565b6001600160a01b0380821660009081526020818152604080832081516080810183528154861681526001820154909516858401526002810180548351818602810186018552818152959695929493860193830182828015610a4c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a2e575b5050509183525050600391909101546020918201528101519091506001600160a01b038116610a8d5760405162461bcd60e51b815260040161026390611c14565b6060820151610a9f9062013560611cbb565b4211610ae65760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081dd85a5d08199bdc881a5b9d195c9d985b60521b6044820152606401610263565b6001600160a01b0383811660008181526020819052604080822042600390910155855190516370a0823160e01b81526004810193909352929091908316906370a082319060240160206040518083038186803b158015610b4557600080fd5b505afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611b55565b90508015610b9a57610b9a6001600160a01b0383168630846111e2565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610bdc57600080fd5b505afa158015610bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c149190611b55565b905060008111610c665760405162461bcd60e51b815260206004820152601b60248201527f4e6f2073656c6c20746f6b656e7320746f206c697175696461746500000000006044820152606401610263565b610c9b6001600160a01b0384167f00000000000000000000000000000000000000000000000000000000000000006000611253565b610ccf6001600160a01b0384167f000000000000000000000000000000000000000000000000000000000000000083611253565b6000836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0a57600080fd5b505afa158015610d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d429190611b6d565b60ff1690506000610d5482600a611d39565b6001600160a01b038916600090815260016020526040902054610d779085611e07565b610d819190611cd3565b905060008111610dd35760405162461bcd60e51b815260206004820152601a60248201527f4d757374206861766520736f6d6520707269636520666c6f6f720000000000006044820152606401610263565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338ed173984838a604001513042610708610e189190611cbb565b6040518663ffffffff1660e01b8152600401610e38959493929190611c4b565b600060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e8e9190810190611a76565b506000610ebb877f000000000000000000000000000000000000000000000000000000000000000061137c565b90506000610ec7611561565b9050610efe6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016826000611253565b610f326001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168284611253565b6040516313e8da7160e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201849052821690634fa369c490604401600060405180830381600087803b158015610f9c57600080fd5b505af1158015610fb0573d6000803e3d6000fd5b5050604080517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081168252602082018790528c8116828401529151918b1693507fbf8c93ffab42c7a8745e30d00eef080c6704962d26f0b42a0e9d9589b7417af1925081900360600190a250505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561108b57600080fd5b505afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c3919061196d565b905090565b6040516385acd64160e01b81527f9409903de1e6fd852dfc61c9dacb48196c48535b60e25abf92acc92dd689078d60048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906385acd641906024015b60206040518083038186803b15801561108b57600080fd5b805160009082828261116d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316856001600160a01b03161480156111d757508261119c600183611e26565b815181106111ba57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316846001600160a01b0316145b9150505b9392505050565b6040516001600160a01b038085166024830152831660448201526064810182905261124d9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526115d0565b50505050565b8015806112dc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156112a257600080fd5b505afa1580156112b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112da9190611b55565b155b6113475760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610263565b6040516001600160a01b03831660248201526044810182905261137790849063095ea7b360e01b90606401611216565b505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b1580156113c057600080fd5b505afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190611b55565b905061140f6001600160a01b038516846000611253565b6114236001600160a01b0385168483611253565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561145e57600080fd5b505afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190611b6d565b60ff16905060006114a882600a611d39565b6114ba84670c7d713b49da0000611e07565b6114c49190611cd3565b604051637ba5ff4760e11b81526001600160a01b03888116600483015260248201869052604482018390523060648301529192509086169063f74bfe8e90608401602060405180830381600087803b15801561151f57600080fd5b505af1158015611533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115579190611b55565b9695505050505050565b6040516385acd64160e01b81527f12fe936c77a1e196473c4314f3bed8eeac1d757b319abb85bdda70df35511bf160048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906385acd64190602401611133565b6000611625826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116a29092919063ffffffff16565b80519091501561137757808060200190518101906116439190611b35565b6113775760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610263565b60606116b184846000856116b9565b949350505050565b60608247101561171a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610263565b843b6117685760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610263565b600080866001600160a01b031685876040516117849190611b8e565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b50915091506117d68282866117e1565b979650505050505050565b606083156117f05750816111db565b8251156118005782518084602001fd5b8160405162461bcd60e51b81526004016102639190611baa565b82805482825590600052602060002090810192821561186d579160200282015b8281111561186d5781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061183a565b506118799291506118f3565b5090565b508054600082559060005260206000209081019061189b91906118f3565b50565b82805482825590600052602060002090810192821561186d579160200282015b8281111561186d57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906118be565b5b8082111561187957600081556001016118f4565b60008083601f840112611919578081fd5b50813567ffffffffffffffff811115611930578182fd5b602083019150836020808302850101111561194a57600080fd5b9250929050565b600060208284031215611962578081fd5b81356111db81611e95565b60006020828403121561197e578081fd5b81516111db81611e95565b60008060008060008060a087890312156119a1578182fd5b86356119ac81611e95565b955060208701356119bc81611e95565b945060408701356119cc81611e95565b9350606087013567ffffffffffffffff8111156119e7578283fd5b6119f389828a01611908565b979a9699509497949695608090950135949350505050565b600080600080600060808688031215611a22578081fd5b8535611a2d81611e95565b94506020860135611a3d81611e95565b9350604086013567ffffffffffffffff811115611a58578182fd5b611a6488828901611908565b96999598509660600135949350505050565b60006020808385031215611a88578182fd5b825167ffffffffffffffff80821115611a9f578384fd5b818501915085601f830112611ab2578384fd5b815181811115611ac457611ac4611e7f565b838102604051601f19603f83011681018181108582111715611ae857611ae8611e7f565b604052828152858101935084860182860187018a1015611b06578788fd5b8795505b83861015611b28578051855260019590950194938601938601611b0a565b5098975050505050505050565b600060208284031215611b46578081fd5b815180151581146111db578182fd5b600060208284031215611b66578081fd5b5051919050565b600060208284031215611b7e578081fd5b815160ff811681146111db578182fd5b60008251611ba0818460208701611e3d565b9190910192915050565b6000602082528251806020840152611bc9816040850160208701611e3d565b601f01601f19169190910160400192915050565b6020808252601b908201527f4f6e6c7920676f7665726e616e63652063616e20657865637574650000000000604082015260600190565b6020808252601a908201527f4c69717569646174696f6e20646f6573206e6f74206578697374000000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015611c9a5784516001600160a01b031683529383019391830191600101611c75565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115611cce57611cce611e69565b500190565b600082611cee57634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611611d055750611d30565b818704821115611d1757611d17611e69565b80861615611d2457918102915b9490941c938002611cf6565b94509492505050565b60006111db6000198484600082611d52575060016111db565b81611d5f575060006111db565b8160018114611d755760028114611d7f57611dac565b60019150506111db565b60ff841115611d9057611d90611e69565b6001841b915084821115611da657611da6611e69565b506111db565b5060208310610133831016604e8410600b8410161715611ddf575081810a83811115611dda57611dda611e69565b6111db565b611dec8484846001611cf3565b808604821115611dfe57611dfe611e69565b02949350505050565b6000816000190483118215151615611e2157611e21611e69565b500290565b600082821015611e3857611e38611e69565b500390565b60005b83811015611e58578181015183820152602001611e40565b8381111561124d5750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461189b57600080fdfea2646970667358221220aea34608535fe8e0c6e63dd5b475c67b2b1b7cf2c00902e64d775f94d0f69b3064736f6c634300080200330000000000000000000000003c6fbb8cbfcb75ecec5128e9f73307f2cb33f2f6000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b21
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063937d4c4211610066578063937d4c4214610132578063a164140214610194578063a3f5c1d2146101a7578063b350df5d146101ce578063f09a1d00146101e157610093565b80630ac1ff80146100985780633d0eaf0d146100cb5780634086571e146100e05780637e9fd2221461011f575b600080fd5b6100b86100a6366004611951565b60016020526000908152604090205481565b6040519081526020015b60405180910390f35b6100de6100d9366004611a0b565b610208565b005b6101077f000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff81565b6040516001600160a01b0390911681526020016100c2565b6100de61012d366004611951565b6104df565b61016e610140366004611951565b6000602081905290815260409020805460018201546003909201546001600160a01b03918216929091169083565b604080516001600160a01b039485168152939092166020840152908201526060016100c2565b6100de6101a2366004611989565b610695565b6101077f0000000000000000000000003c6fbb8cbfcb75ecec5128e9f73307f2cb33f2f681565b6100de6101dc366004611951565b610985565b6101077f000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b2181565b610210611030565b6001600160a01b0316336001600160a01b0316148061024757506102326110c8565b6001600160a01b0316336001600160a01b0316145b61026c5760405162461bcd60e51b815260040161026390611bdd565b60405180910390fd5b6001600160a01b03808616600090815260208181526040808320815160808101835281548616815260018201549095168584015260028101805483518186028101860185528181529596959294938601938301828280156102f657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102d8575b5050509183525050600391909101546020918201528101519091506001600160a01b0381166103375760405162461bcd60e51b815260040161026390611c14565b600083116103875760405162461bcd60e51b815260206004820152601b60248201527f4d7573742073657420736f6d65206d696e696d756d2076616c756500000000006044820152606401610263565b6001600160a01b0386166103ce5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a590818905cdcd95d60921b6044820152606401610263565b61041082600001518787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061114b92505050565b6104535760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840eadcd2e6eec2e040e0c2e8d60631b6044820152606401610263565b6001600160a01b0387811660009081526020819052604090206001810180546001600160a01b0319169289169290921790915561049490600201868661181a565b506001600160a01b038716600081815260016020526040808220869055517f52f63ab5789c9a266379c35974b035fb9f7079ec0effab1b31e7ad82fadb488a9190a250505050505050565b6104e7611030565b6001600160a01b0316336001600160a01b0316148061051e57506105096110c8565b6001600160a01b0316336001600160a01b0316145b61053a5760405162461bcd60e51b815260040161026390611bdd565b6001600160a01b03808216600090815260208181526040808320815160808101835281548616815260018201549095168584015260028101805483518186028101860185528181529596959294938601938301828280156105c457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105a6575b5050509183525050600391909101546020918201528101519091506001600160a01b03166106045760405162461bcd60e51b815260040161026390611c14565b6001600160a01b038216600090815260208190526040812080546001600160a01b03199081168255600182018054909116905590610645600283018261187d565b5060006003919091018190556001600160a01b038316808252600160205260408083208390555190917fe513b42585b0ceec0d56d56fe3a23861c15a2f74eb4c32c94334d63d68ff4dcf91a25050565b61069d611030565b6001600160a01b0316336001600160a01b031614806106d457506106bf6110c8565b6001600160a01b0316336001600160a01b0316145b6106f05760405162461bcd60e51b815260040161026390611bdd565b6001600160a01b0386811660009081526020819052604090205416156107635760405162461bcd60e51b815260206004820152602260248201527f4c69717569646174696f6e2065786973747320666f7220746869732062417373604482015261195d60f21b6064820152608401610263565b6001600160a01b0386161580159061078357506001600160a01b03851615155b801561079757506001600160a01b03841615155b80156107a4575060028210155b80156107b05750600081115b6107ed5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b6044820152606401610263565b61082b858585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061114b92505050565b61086e5760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840eadcd2e6eec2e040e0c2e8d60631b6044820152606401610263565b6040518060800160405280866001600160a01b03168152602001856001600160a01b03168152602001848480806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093855250505060209182018190526001600160a01b03808a168252818352604091829020845181549083166001600160a01b03199182161782558585015160018301805491909416911617909155908301518051919261092e9260028501929091019061189e565b50606091909101516003909101556001600160a01b038616600081815260016020526040808220849055517f52f63ab5789c9a266379c35974b035fb9f7079ec0effab1b31e7ad82fadb488a9190a2505050505050565b3233146109c25760405162461bcd60e51b815260206004820152600b60248201526a4d75737420626520454f4160a81b6044820152606401610263565b6001600160a01b0380821660009081526020818152604080832081516080810183528154861681526001820154909516858401526002810180548351818602810186018552818152959695929493860193830182828015610a4c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a2e575b5050509183525050600391909101546020918201528101519091506001600160a01b038116610a8d5760405162461bcd60e51b815260040161026390611c14565b6060820151610a9f9062013560611cbb565b4211610ae65760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081dd85a5d08199bdc881a5b9d195c9d985b60521b6044820152606401610263565b6001600160a01b0383811660008181526020819052604080822042600390910155855190516370a0823160e01b81526004810193909352929091908316906370a082319060240160206040518083038186803b158015610b4557600080fd5b505afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611b55565b90508015610b9a57610b9a6001600160a01b0383168630846111e2565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610bdc57600080fd5b505afa158015610bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c149190611b55565b905060008111610c665760405162461bcd60e51b815260206004820152601b60248201527f4e6f2073656c6c20746f6b656e7320746f206c697175696461746500000000006044820152606401610263565b610c9b6001600160a01b0384167f000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff6000611253565b610ccf6001600160a01b0384167f000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff83611253565b6000836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d0a57600080fd5b505afa158015610d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d429190611b6d565b60ff1690506000610d5482600a611d39565b6001600160a01b038916600090815260016020526040902054610d779085611e07565b610d819190611cd3565b905060008111610dd35760405162461bcd60e51b815260206004820152601a60248201527f4d757374206861766520736f6d6520707269636520666c6f6f720000000000006044820152606401610263565b7f000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff6001600160a01b03166338ed173984838a604001513042610708610e189190611cbb565b6040518663ffffffff1660e01b8152600401610e38959493929190611c4b565b600060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e8e9190810190611a76565b506000610ebb877f000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b2161137c565b90506000610ec7611561565b9050610efe6001600160a01b037f000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b2116826000611253565b610f326001600160a01b037f000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b21168284611253565b6040516313e8da7160e21b81526001600160a01b037f000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b218116600483015260248201849052821690634fa369c490604401600060405180830381600087803b158015610f9c57600080fd5b505af1158015610fb0573d6000803e3d6000fd5b5050604080517f000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b216001600160a01b039081168252602082018790528c8116828401529151918b1693507fbf8c93ffab42c7a8745e30d00eef080c6704962d26f0b42a0e9d9589b7417af1925081900360600190a250505050505050505050565b60007f0000000000000000000000003c6fbb8cbfcb75ecec5128e9f73307f2cb33f2f66001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561108b57600080fd5b505afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c3919061196d565b905090565b6040516385acd64160e01b81527f9409903de1e6fd852dfc61c9dacb48196c48535b60e25abf92acc92dd689078d60048201526000907f0000000000000000000000003c6fbb8cbfcb75ecec5128e9f73307f2cb33f2f66001600160a01b0316906385acd641906024015b60206040518083038186803b15801561108b57600080fd5b805160009082828261116d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316856001600160a01b03161480156111d757508261119c600183611e26565b815181106111ba57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316846001600160a01b0316145b9150505b9392505050565b6040516001600160a01b038085166024830152831660448201526064810182905261124d9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526115d0565b50505050565b8015806112dc5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156112a257600080fd5b505afa1580156112b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112da9190611b55565b155b6113475760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610263565b6040516001600160a01b03831660248201526044810182905261137790849063095ea7b360e01b90606401611216565b505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b1580156113c057600080fd5b505afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190611b55565b905061140f6001600160a01b038516846000611253565b6114236001600160a01b0385168483611253565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561145e57600080fd5b505afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190611b6d565b60ff16905060006114a882600a611d39565b6114ba84670c7d713b49da0000611e07565b6114c49190611cd3565b604051637ba5ff4760e11b81526001600160a01b03888116600483015260248201869052604482018390523060648301529192509086169063f74bfe8e90608401602060405180830381600087803b15801561151f57600080fd5b505af1158015611533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115579190611b55565b9695505050505050565b6040516385acd64160e01b81527f12fe936c77a1e196473c4314f3bed8eeac1d757b319abb85bdda70df35511bf160048201526000907f0000000000000000000000003c6fbb8cbfcb75ecec5128e9f73307f2cb33f2f66001600160a01b0316906385acd64190602401611133565b6000611625826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116a29092919063ffffffff16565b80519091501561137757808060200190518101906116439190611b35565b6113775760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610263565b60606116b184846000856116b9565b949350505050565b60608247101561171a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610263565b843b6117685760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610263565b600080866001600160a01b031685876040516117849190611b8e565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b50915091506117d68282866117e1565b979650505050505050565b606083156117f05750816111db565b8251156118005782518084602001fd5b8160405162461bcd60e51b81526004016102639190611baa565b82805482825590600052602060002090810192821561186d579160200282015b8281111561186d5781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061183a565b506118799291506118f3565b5090565b508054600082559060005260206000209081019061189b91906118f3565b50565b82805482825590600052602060002090810192821561186d579160200282015b8281111561186d57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906118be565b5b8082111561187957600081556001016118f4565b60008083601f840112611919578081fd5b50813567ffffffffffffffff811115611930578182fd5b602083019150836020808302850101111561194a57600080fd5b9250929050565b600060208284031215611962578081fd5b81356111db81611e95565b60006020828403121561197e578081fd5b81516111db81611e95565b60008060008060008060a087890312156119a1578182fd5b86356119ac81611e95565b955060208701356119bc81611e95565b945060408701356119cc81611e95565b9350606087013567ffffffffffffffff8111156119e7578283fd5b6119f389828a01611908565b979a9699509497949695608090950135949350505050565b600080600080600060808688031215611a22578081fd5b8535611a2d81611e95565b94506020860135611a3d81611e95565b9350604086013567ffffffffffffffff811115611a58578182fd5b611a6488828901611908565b96999598509660600135949350505050565b60006020808385031215611a88578182fd5b825167ffffffffffffffff80821115611a9f578384fd5b818501915085601f830112611ab2578384fd5b815181811115611ac457611ac4611e7f565b838102604051601f19603f83011681018181108582111715611ae857611ae8611e7f565b604052828152858101935084860182860187018a1015611b06578788fd5b8795505b83861015611b28578051855260019590950194938601938601611b0a565b5098975050505050505050565b600060208284031215611b46578081fd5b815180151581146111db578182fd5b600060208284031215611b66578081fd5b5051919050565b600060208284031215611b7e578081fd5b815160ff811681146111db578182fd5b60008251611ba0818460208701611e3d565b9190910192915050565b6000602082528251806020840152611bc9816040850160208701611e3d565b601f01601f19169190910160400192915050565b6020808252601b908201527f4f6e6c7920676f7665726e616e63652063616e20657865637574650000000000604082015260600190565b6020808252601a908201527f4c69717569646174696f6e20646f6573206e6f74206578697374000000000000604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015611c9a5784516001600160a01b031683529383019391830191600101611c75565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115611cce57611cce611e69565b500190565b600082611cee57634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611611d055750611d30565b818704821115611d1757611d17611e69565b80861615611d2457918102915b9490941c938002611cf6565b94509492505050565b60006111db6000198484600082611d52575060016111db565b81611d5f575060006111db565b8160018114611d755760028114611d7f57611dac565b60019150506111db565b60ff841115611d9057611d90611e69565b6001841b915084821115611da657611da6611e69565b506111db565b5060208310610133831016604e8410600b8410161715611ddf575081810a83811115611dda57611dda611e69565b6111db565b611dec8484846001611cf3565b808604821115611dfe57611dfe611e69565b02949350505050565b6000816000190483118215151615611e2157611e21611e69565b500290565b600082821015611e3857611e38611e69565b500390565b60005b83811015611e58578181015183820152602001611e40565b8381111561124d5750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461189b57600080fdfea2646970667358221220aea34608535fe8e0c6e63dd5b475c67b2b1b7cf2c00902e64d775f94d0f69b3064736f6c63430008020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003c6fbb8cbfcb75ecec5128e9f73307f2cb33f2f6000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b21
-----Decoded View---------------
Arg [0] : _nexus (address): 0x3C6fbB8cbfCB75ecEC5128e9f73307f2cB33f2f6
Arg [1] : _quickswapRouter (address): 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff
Arg [2] : _mUSD (address): 0xE840B73E5287865EEc17d250bFb1536704B43B21
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003c6fbb8cbfcb75ecec5128e9f73307f2cb33f2f6
Arg [1] : 000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff
Arg [2] : 000000000000000000000000e840b73e5287865eec17d250bfb1536704b43b21
Deployed Bytecode Sourcemap
25493:8538:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25961:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7096:25:1;;;7084:2;7069:18;25961:44:0;;;;;;;;28528:881;;;;;;:::i;:::-;;:::i;:::-;;25848:45;;;;;;;;-1:-1:-1;;;;;5106:32:1;;;5088:51;;5076:2;5061:18;25848:45:0;5043:102:1;30101:378:0;;;;;;:::i;:::-;;:::i;25902:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25902:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;5717:15:1;;;5699:34;;5769:15;;;;5764:2;5749:18;;5742:43;5801:18;;;5794:34;5649:2;5634:18;25902:52:0;5616:218:1;27118:1045:0;;;;;;:::i;:::-;;:::i;8658:29::-;;;;;30913:2586;;;;;;:::i;:::-;;:::i;25812:29::-;;;;;28528:881;9501:11;:9;:11::i;:::-;-1:-1:-1;;;;;9487:25:0;:10;-1:-1:-1;;;;;9487:25:0;;:56;;;;9530:13;:11;:13::i;:::-;-1:-1:-1;;;;;9516:27:0;:10;-1:-1:-1;;;;;9516:27:0;;9487:56;9465:133;;;;-1:-1:-1;;;9465:133:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;28763:26:0;;::::1;28729:31;28763:26:::0;;;::::1;::::0;;;;;;;28729:60;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;:31;;:60;28763:26;;28729:60;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;28729:60:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;28729:60:0;;;-1:-1:-1;;28729:60:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;28822:18;::::1;::::0;28729:60;;-1:-1:-1;;;;;;28859:23:0;::::1;28851:62;;;;-1:-1:-1::0;;;28851:62:0::1;;;;;;;:::i;:::-;28947:1;28934:10;:14;28926:54;;;::::0;-1:-1:-1;;;28926:54:0;;8534:2:1;28926:54:0::1;::::0;::::1;8516:21:1::0;8573:2;8553:18;;;8546:30;8612:29;8592:18;;;8585:57;8659:18;;28926:54:0::1;8506:177:1::0;28926:54:0::1;-1:-1:-1::0;;;;;28999:21:0;::::1;28991:48;;;::::0;-1:-1:-1;;;28991:48:0;;10685:2:1;28991:48:0::1;::::0;::::1;10667:21:1::0;10724:2;10704:18;;;10697:30;-1:-1:-1;;;10743:18:1;;;10736:44;10797:18;;28991:48:0::1;10657:164:1::0;28991:48:0::1;29072:63;29090:11;:21;;;29113:7;29122:12;;29072:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29072:17:0::1;::::0;-1:-1:-1;;;29072:63:0:i:1;:::-;29050:133;;;::::0;-1:-1:-1;;;29050:133:0;;8890:2:1;29050:133:0::1;::::0;::::1;8872:21:1::0;8929:2;8909:18;;;8902:30;-1:-1:-1;;;8948:18:1;;;8941:50;9008:18;;29050:133:0::1;8862:170:1::0;29050:133:0::1;-1:-1:-1::0;;;;;29196:26:0;;::::1;:12;:26:::0;;;::::1;::::0;;;;;;:33:::1;::::0;::::1;:43:::0;;-1:-1:-1;;;;;;29196:43:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;29250:53:::1;::::0;:38:::1;;29291:12:::0;;29250:53:::1;:::i;:::-;-1:-1:-1::0;;;;;;29314:23:0;::::1;;::::0;;;:9:::1;:23;::::0;;;;;:36;;;29368:33;::::1;::::0;29314:23;29368:33:::1;9609:1;;28528:881:::0;;;;;:::o;30101:378::-;9501:11;:9;:11::i;:::-;-1:-1:-1;;;;;9487:25:0;:10;-1:-1:-1;;;;;9487:25:0;;:56;;;;9530:13;:11;:13::i;:::-;-1:-1:-1;;;;;9516:27:0;:10;-1:-1:-1;;;;;9516:27:0;;9487:56;9465:133;;;;-1:-1:-1;;;9465:133:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30228:26:0;;::::1;30194:31;30228:26:::0;;;::::1;::::0;;;;;;;30194:60;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;:31;;:60;30228:26;;30194:60;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;30194:60:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;30194:60:0;;;-1:-1:-1;;30194:60:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;30273:18;::::1;::::0;30194:60;;-1:-1:-1;;;;;;30273:32:0::1;30265:71;;;;-1:-1:-1::0;;;30265:71:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30356:26:0;::::1;:12;:26:::0;;;::::1;::::0;;;;;;30349:33;;-1:-1:-1;;;;;;30349:33:0;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;30356:26;30349:33:::1;;::::0;::::1;30356:12:::0;30349:33:::1;:::i;:::-;-1:-1:-1::0;30349:33:0::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;;;;30400:23:0;::::1;::::0;;;:9:::1;:23;::::0;;;;;30393:30;;;30441;30400:23;;30441:30:::1;::::0;::::1;9609:1;30101:378:::0;:::o;27118:1045::-;9501:11;:9;:11::i;:::-;-1:-1:-1;;;;;9487:25:0;:10;-1:-1:-1;;;;;9487:25:0;;:56;;;;9530:13;:11;:13::i;:::-;-1:-1:-1;;;;;9516:27:0;:10;-1:-1:-1;;;;;9516:27:0;;9487:56;9465:133;;;;-1:-1:-1;;;9465:133:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27375:26:0;;::::1;27423:1;27375:26:::0;;;::::1;::::0;;;;;;:36;::::1;:50:::0;27353:134:::1;;;::::0;-1:-1:-1;;;27353:134:0;;11386:2:1;27353:134:0::1;::::0;::::1;11368:21:1::0;11425:2;11405:18;;;11398:30;11464:34;11444:18;;;11437:62;-1:-1:-1;;;11515:18:1;;;11508:32;11557:19;;27353:134:0::1;11358:224:1::0;27353:134:0::1;-1:-1:-1::0;;;;;27522:26:0;::::1;::::0;;::::1;::::0;:71:::1;;-1:-1:-1::0;;;;;;27569:24:0;::::1;::::0;::::1;27522:71;:113;;;;-1:-1:-1::0;;;;;;27614:21:0;::::1;::::0;::::1;27522:113;:158;;;;-1:-1:-1::0;27679:1:0::1;27656:24:::0;::::1;;27522:158;:193;;;;;27714:1;27701:10;:14;27522:193;27500:257;;;::::0;-1:-1:-1;;;27500:257:0;;9239:2:1;27500:257:0::1;::::0;::::1;9221:21:1::0;9278:2;9258:18;;;9251:30;-1:-1:-1;;;9297:18:1;;;9290:44;9351:18;;27500:257:0::1;9211:164:1::0;27500:257:0::1;27776:52;27794:10;27806:7;27815:12;;27776:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27776:17:0::1;::::0;-1:-1:-1;;;27776:52:0:i:1;:::-;27768:85;;;::::0;-1:-1:-1;;;27768:85:0;;8890:2:1;27768:85:0::1;::::0;::::1;8872:21:1::0;8929:2;8909:18;;;8902:30;-1:-1:-1;;;8948:18:1;;;8941:50;9008:18;;27768:85:0::1;8862:170:1::0;27768:85:0::1;27895:162;;;;;;;;27934:10;-1:-1:-1::0;;;;;27895:162:0::1;;;;;27967:7;-1:-1:-1::0;;;;;27895:162:0::1;;;;;28002:12;;27895:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;27895:162:0;;;-1:-1:-1;;;27895:162:0::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;27866:26:0;;::::1;::::0;;;;;;;;;;:191;;;;;;::::1;-1:-1:-1::0;;;;;;27866:191:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;;::::1;::::0;;;:26;;:191:::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;27866:191:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;28068:23:0;::::1;;::::0;;;:9:::1;:23;::::0;;;;;:36;;;28122:33;::::1;::::0;28068:23;28122:33:::1;27118:1045:::0;;;;;;:::o;30913:2586::-;31059:9;31072:10;31059:23;31051:47;;;;-1:-1:-1;;;31051:47:0;;9989:2:1;31051:47:0;;;9971:21:1;10028:2;10008:18;;;10001:30;-1:-1:-1;;;10047:18:1;;;10040:41;10098:18;;31051:47:0;9961:161:1;31051:47:0;-1:-1:-1;;;;;31145:26:0;;;31111:31;31145:26;;;;;;;;;;;31111:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:60;31145:26;;31111:60;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31111:60:0;;;;;;;;;;;;;;;;-1:-1:-1;;;31111:60:0;;;-1:-1:-1;;31111:60:0;;;;;;;;;;;31201:18;;;31111:60;;-1:-1:-1;;;;;;31238:20:0;;31230:59;;;;-1:-1:-1;;;31230:59:0;;;;;;;:::i;:::-;31328:25;;;;:36;;31356:8;31328:36;:::i;:::-;31310:15;:54;31302:89;;;;-1:-1:-1;;;31302:89:0;;11789:2:1;31302:89:0;;;11771:21:1;11828:2;11808:18;;;11801:30;-1:-1:-1;;;11847:18:1;;;11840:52;11909:18;;31302:89:0;11761:172:1;31302:89:0;-1:-1:-1;;;;;31402:26:0;;;:12;:26;;;;;;;;;;;31445:15;31402:40;;;;:58;31521:21;;31700:41;;-1:-1:-1;;;31700:41:0;;;;;5088:51:1;;;;31521:21:0;31402:12;;31700:27;;;;;;5061:18:1;;31700:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31675:66;-1:-1:-1;31756:18:0;;31752:130;;31791:79;-1:-1:-1;;;;;31791:34:0;;31826:12;31848:4;31855:14;31791:34;:79::i;:::-;32036:42;;-1:-1:-1;;;32036:42:0;;32072:4;32036:42;;;5088:51:1;32013:20:0;;-1:-1:-1;;;;;32036:27:0;;;;;5061:18:1;;32036:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32013:65;;32112:1;32097:12;:16;32089:56;;;;-1:-1:-1;;;32089:56:0;;10329:2:1;32089:56:0;;;10311:21:1;10368:2;10348:18;;;10341:30;10407:29;10387:18;;;10380:57;10454:18;;32089:56:0;10301:177:1;32089:56:0;32235:52;-1:-1:-1;;;;;32235:29:0;;32273:9;32285:1;32235:29;:52::i;:::-;32298:63;-1:-1:-1;;;;;32298:29:0;;32336:9;32348:12;32298:29;:63::i;:::-;32683:20;32718:9;-1:-1:-1;;;;;32706:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32683:56;;;-1:-1:-1;32750:14:0;32811:16;32683:56;32811:2;:16;:::i;:::-;-1:-1:-1;;;;;32783:23:0;;;;;;:9;:23;;;;;;32768:38;;:12;:38;:::i;:::-;32767:61;;;;:::i;:::-;32750:78;;32856:1;32847:6;:10;32839:49;;;;-1:-1:-1;;;32839:49:0;;13329:2:1;32839:49:0;;;13311:21:1;13368:2;13348:18;;;13341:30;13407:28;13387:18;;;13380:56;13453:18;;32839:49:0;13301:176:1;32839:49:0;32899:9;-1:-1:-1;;;;;32899:34:0;;32948:12;32975:6;32996:11;:23;;;33042:4;33062:15;33080:4;33062:22;;;;:::i;:::-;32899:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32899:196:0;;;;;;;;;;;;:::i;:::-;;33139:14;33156:19;33162:6;33170:4;33156:5;:19::i;:::-;33139:36;;33228:15;33246:17;:15;:17::i;:::-;33228:35;-1:-1:-1;33274:36:0;-1:-1:-1;;;;;33281:4:0;33274:24;33228:35;33308:1;33274:24;:36::i;:::-;33321:41;-1:-1:-1;;;;;33328:4:0;33321:24;33346:7;33355:6;33321:24;:41::i;:::-;33373:57;;-1:-1:-1;;;33373:57:0;;-1:-1:-1;;;;;33417:4:0;6031:32:1;;33373:57:0;;;6013:51:1;6080:18;;;6073:34;;;33373:43:0;;;;;5986:18:1;;33373:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33448:43:0;;;33470:4;-1:-1:-1;;;;;6376:15:1;;;6358:34;;6423:2;6408:18;;6401:34;;;6471:15;;;6451:18;;;6444:43;33448::0;;;;;;-1:-1:-1;33448:43:0;;-1:-1:-1;33448:43:0;;;6308:2:1;33448:43:0;;;30913:2586;;;;;;;;;;:::o;9742:95::-;9786:7;9813:5;-1:-1:-1;;;;;9813:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9806:23;;9742:95;:::o;9977:112::-;10050:31;;-1:-1:-1;;;10050:31:0;;6468:66;10050:31;;;7096:25:1;10023:7:0;;10050:5;-1:-1:-1;;;;;10050:15:0;;;;7069:18:1;;10050:31:0;;;;;;;;;;;;;;;;;;;29748:293;29931:19;;29900:4;;29931:12;29900:4;29982:15;;;-1:-1:-1;;;29982:15:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29968:29:0;:10;-1:-1:-1;;;;;29968:29:0;;:65;;;;-1:-1:-1;30012:12:0;30025:7;30031:1;30025:3;:7;:::i;:::-;30012:21;;;;;;-1:-1:-1;;;30012:21:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30001:32:0;:7;-1:-1:-1;;;;;30001:32:0;;29968:65;29961:72;;;29748:293;;;;;;:::o;22183:205::-;22311:68;;-1:-1:-1;;;;;5717:15:1;;;22311:68:0;;;5699:34:1;5769:15;;5749:18;;;5742:43;5801:18;;;5794:34;;;22284:96:0;;22304:5;;-1:-1:-1;;;22334:27:0;5634:18:1;;22311:68:0;;;;-1:-1:-1;;22311:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22311:68:0;-1:-1:-1;;;;;;22311:68:0;;;;;;;;;;22284:19;:96::i;:::-;22183:205;;;;:::o;22657:622::-;23027:10;;;23026:62;;-1:-1:-1;23043:39:0;;-1:-1:-1;;;23043:39:0;;23067:4;23043:39;;;5362:34:1;-1:-1:-1;;;;;5432:15:1;;;5412:18;;;5405:43;23043:15:0;;;;;5297:18:1;;23043:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23026:62;23018:152;;;;-1:-1:-1;;;23018:152:0;;12906:2:1;23018:152:0;;;12888:21:1;12945:2;12925:18;;;12918:30;12984:34;12964:18;;;12957:62;-1:-1:-1;;;13035:18:1;;;13028:52;13097:19;;23018:152:0;12878:244:1;23018:152:0;23208:62;;-1:-1:-1;;;;;6031:32:1;;23208:62:0;;;6013:51:1;6080:18;;;6073:34;;;23181:90:0;;23201:5;;-1:-1:-1;;;23231:22:0;5986:18:1;;23208:62:0;5968:145:1;23181:90:0;22657:622;;;:::o;33507:521::-;33619:40;;-1:-1:-1;;;33619:40:0;;33653:4;33619:40;;;5088:51:1;33572:14:0;;;;-1:-1:-1;;;;;33619:25:0;;;;;5061:18:1;;33619:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33599:60;-1:-1:-1;33670:37:0;-1:-1:-1;;;;;33670:27:0;;33698:5;33705:1;33670:27;:37::i;:::-;33718:45;-1:-1:-1;;;;;33718:27:0;;33746:5;33753:9;33718:27;:45::i;:::-;33776:17;33808:7;-1:-1:-1;;;;;33796:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33776:51;;;-1:-1:-1;33884:14:0;33924:13;33776:51;33924:2;:13;:::i;:::-;33902:17;:9;33914:5;33902:17;:::i;:::-;33901:37;;;;:::i;:::-;33958:62;;-1:-1:-1;;;33958:62:0;;-1:-1:-1;;;;;6785:15:1;;;33958:62:0;;;6767:34:1;6817:18;;;6810:34;;;6860:18;;;6853:34;;;34014:4:0;6903:18:1;;;6896:43;33884:54:0;;-1:-1:-1;33958:19:0;;;;;;6701::1;;33958:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33949:71;33507:521;-1:-1:-1;;;;;;33507:521:0:o;10242:121::-;10319:36;;-1:-1:-1;;;10319:36:0;;7612:66;10319:36;;;7096:25:1;10292:7:0;;10319:5;-1:-1:-1;;;;;10319:15:0;;;;7069:18:1;;10319:36:0;7051:76:1;24432:761:0;24856:23;24882:69;24910:4;24882:69;;;;;;;;;;;;;;;;;24890:5;-1:-1:-1;;;;;24882:27:0;;;:69;;;;;:::i;:::-;24966:17;;24856:95;;-1:-1:-1;24966:21:0;24962:224;;25108:10;25097:30;;;;;;;;;;;;:::i;:::-;25089:85;;;;-1:-1:-1;;;25089:85:0;;12140:2:1;25089:85:0;;;12122:21:1;12179:2;12159:18;;;12152:30;12218:34;12198:18;;;12191:62;-1:-1:-1;;;12269:18:1;;;12262:40;12319:19;;25089:85:0;12112:232:1;17598:195:0;17701:12;17733:52;17755:6;17763:4;17769:1;17772:12;17733:21;:52::i;:::-;17726:59;17598:195;-1:-1:-1;;;;17598:195:0:o;18650:530::-;18777:12;18835:5;18810:21;:30;;18802:81;;;;-1:-1:-1;;;18802:81:0;;9582:2:1;18802:81:0;;;9564:21:1;9621:2;9601:18;;;9594:30;9660:34;9640:18;;;9633:62;-1:-1:-1;;;9711:18:1;;;9704:36;9757:19;;18802:81:0;9554:228:1;18802:81:0;15047:20;;18894:60;;;;-1:-1:-1;;;18894:60:0;;11028:2:1;18894:60:0;;;11010:21:1;11067:2;11047:18;;;11040:30;11106:31;11086:18;;;11079:59;11155:18;;18894:60:0;11000:179:1;18894:60:0;19028:12;19042:23;19069:6;-1:-1:-1;;;;;19069:11:0;19089:5;19097:4;19069:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19027:75;;;;19120:52;19138:7;19147:10;19159:12;19120:17;:52::i;:::-;19113:59;18650:530;-1:-1:-1;;;;;;;18650:530:0:o;21190:742::-;21305:12;21334:7;21330:595;;;-1:-1:-1;21365:10:0;21358:17;;21330:595;21479:17;;:21;21475:439;;21742:10;21736:17;21803:15;21790:10;21786:2;21782:19;21775:44;21690:148;21885:12;21878:20;;-1:-1:-1;;;21878:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:394:1;;;141:3;134:4;126:6;122:17;118:27;108:2;;164:6;156;149:22;108:2;-1:-1:-1;192:20:1;;235:18;224:30;;221:2;;;274:8;264;257:26;221:2;318:4;310:6;306:17;294:29;;381:3;374:4;366;358:6;354:17;346:6;342:30;338:41;335:50;332:2;;;398:1;395;388:12;332:2;98:310;;;;;:::o;413:257::-;;525:2;513:9;504:7;500:23;496:32;493:2;;;546:6;538;531:22;493:2;590:9;577:23;609:31;634:5;609:31;:::i;675:261::-;;798:2;786:9;777:7;773:23;769:32;766:2;;;819:6;811;804:22;766:2;856:9;850:16;875:31;900:5;875:31;:::i;941:944::-;;;;;;;1156:3;1144:9;1135:7;1131:23;1127:33;1124:2;;;1178:6;1170;1163:22;1124:2;1222:9;1209:23;1241:31;1266:5;1241:31;:::i;:::-;1291:5;-1:-1:-1;1348:2:1;1333:18;;1320:32;1361:33;1320:32;1361:33;:::i;:::-;1413:7;-1:-1:-1;1472:2:1;1457:18;;1444:32;1485:33;1444:32;1485:33;:::i;:::-;1537:7;-1:-1:-1;1595:2:1;1580:18;;1567:32;1622:18;1611:30;;1608:2;;;1659:6;1651;1644:22;1608:2;1703:70;1765:7;1756:6;1745:9;1741:22;1703:70;:::i;:::-;1114:771;;;;-1:-1:-1;1114:771:1;;;;;1874:3;1859:19;;;1846:33;;1114:771;-1:-1:-1;;;;1114:771:1:o;1890:802::-;;;;;;2088:3;2076:9;2067:7;2063:23;2059:33;2056:2;;;2110:6;2102;2095:22;2056:2;2154:9;2141:23;2173:31;2198:5;2173:31;:::i;:::-;2223:5;-1:-1:-1;2280:2:1;2265:18;;2252:32;2293:33;2252:32;2293:33;:::i;:::-;2345:7;-1:-1:-1;2403:2:1;2388:18;;2375:32;2430:18;2419:30;;2416:2;;;2467:6;2459;2452:22;2416:2;2511:70;2573:7;2564:6;2553:9;2549:22;2511:70;:::i;:::-;2046:646;;;;-1:-1:-1;2600:8:1;2682:2;2667:18;2654:32;;2046:646;-1:-1:-1;;;;2046:646:1:o;2697:1162::-;;2823:2;2866;2854:9;2845:7;2841:23;2837:32;2834:2;;;2887:6;2879;2872:22;2834:2;2925:9;2919:16;2954:18;2995:2;2987:6;2984:14;2981:2;;;3016:6;3008;3001:22;2981:2;3059:6;3048:9;3044:22;3034:32;;3104:7;3097:4;3093:2;3089:13;3085:27;3075:2;;3131:6;3123;3116:22;3075:2;3165;3159:9;3187:2;3183;3180:10;3177:2;;;3193:18;;:::i;:::-;3240:2;3236;3232:11;3272:2;3266:9;3335:2;3331:7;3326:2;3322;3318:11;3314:25;3306:6;3302:38;3390:6;3378:10;3375:22;3370:2;3358:10;3355:18;3352:46;3349:2;;;3401:18;;:::i;:::-;3437:2;3430:22;3487:18;;;3521:15;;;;-1:-1:-1;3556:11:1;;;3586;;;3582:20;;3579:33;-1:-1:-1;3576:2:1;;;3630:6;3622;3615:22;3576:2;3657:6;3648:15;;3672:156;3686:2;3683:1;3680:9;3672:156;;;3743:10;;3731:23;;3704:1;3697:9;;;;;3774:12;;;;3806;;3672:156;;;-1:-1:-1;3847:6:1;2803:1056;-1:-1:-1;;;;;;;;2803:1056:1:o;3864:297::-;;3984:2;3972:9;3963:7;3959:23;3955:32;3952:2;;;4005:6;3997;3990:22;3952:2;4042:9;4036:16;4095:5;4088:13;4081:21;4074:5;4071:32;4061:2;;4122:6;4114;4107:22;4166:194;;4289:2;4277:9;4268:7;4264:23;4260:32;4257:2;;;4310:6;4302;4295:22;4257:2;-1:-1:-1;4338:16:1;;4247:113;-1:-1:-1;4247:113:1:o;4365:293::-;;4486:2;4474:9;4465:7;4461:23;4457:32;4454:2;;;4507:6;4499;4492:22;4454:2;4544:9;4538:16;4594:4;4587:5;4583:16;4576:5;4573:27;4563:2;;4619:6;4611;4604:22;4663:274;;4830:6;4824:13;4846:53;4892:6;4887:3;4880:4;4872:6;4868:17;4846:53;:::i;:::-;4915:16;;;;;4800:137;-1:-1:-1;;4800:137:1:o;7588:383::-;;7737:2;7726:9;7719:21;7769:6;7763:13;7812:6;7807:2;7796:9;7792:18;7785:34;7828:66;7887:6;7882:2;7871:9;7867:18;7862:2;7854:6;7850:15;7828:66;:::i;:::-;7955:2;7934:15;-1:-1:-1;;7930:29:1;7915:45;;;;7962:2;7911:54;;7709:262;-1:-1:-1;;7709:262:1:o;7976:351::-;8178:2;8160:21;;;8217:2;8197:18;;;8190:30;8256:29;8251:2;8236:18;;8229:57;8318:2;8303:18;;8150:177::o;12349:350::-;12551:2;12533:21;;;12590:2;12570:18;;;12563:30;12629:28;12624:2;12609:18;;12602:56;12690:2;12675:18;;12523:176::o;13664:975::-;;13966:3;13955:9;13951:19;13997:6;13986:9;13979:25;14023:2;14061:6;14056:2;14045:9;14041:18;14034:34;14104:3;14099:2;14088:9;14084:18;14077:31;14128:6;14163;14157:13;14194:6;14186;14179:22;14232:3;14221:9;14217:19;14210:26;;14271:2;14263:6;14259:15;14245:29;;14292:4;14305:195;14319:6;14316:1;14313:13;14305:195;;;14384:13;;-1:-1:-1;;;;;14380:39:1;14368:52;;14475:15;;;;14440:12;;;;14416:1;14334:9;14305:195;;;-1:-1:-1;;;;;;;14556:32:1;;;;14551:2;14536:18;;14529:60;-1:-1:-1;;;14620:3:1;14605:19;14598:35;14517:3;13927:712;-1:-1:-1;;;13927:712:1:o;14644:128::-;;14715:1;14711:6;14708:1;14705:13;14702:2;;;14721:18;;:::i;:::-;-1:-1:-1;14757:9:1;;14692:80::o;14777:217::-;;14843:1;14833:2;;-1:-1:-1;;;14868:31:1;;14922:4;14919:1;14912:15;14950:4;14875:1;14940:15;14833:2;-1:-1:-1;14979:9:1;;14823:171::o;14999:453::-;15095:6;15118:5;15132:314;15181:1;15218:2;15208:8;15205:16;15195:2;;15225:5;;;15195:2;15266:4;15261:3;15257:14;15251:4;15248:24;15245:2;;;15275:18;;:::i;:::-;15325:2;15315:8;15311:17;15308:2;;;15340:16;;;;15308:2;15419:17;;;;;15379:15;;15132:314;;;15076:376;;;;;;;:::o;15457:139::-;;15546:44;-1:-1:-1;;15573:8:1;15567:4;15601:922;15685:8;15675:2;;-1:-1:-1;15726:1:1;15740:5;;15675:2;15774:4;15764:2;;-1:-1:-1;15811:1:1;15825:5;;15764:2;15856:4;15874:1;15869:59;;;;15942:1;15937:183;;;;15849:271;;15869:59;15899:1;15890:10;;15913:5;;;15937:183;15974:3;15964:8;15961:17;15958:2;;;15981:18;;:::i;:::-;16037:1;16027:8;16023:16;16014:25;;16065:3;16058:5;16055:14;16052:2;;;16072:18;;:::i;:::-;16105:5;;;15849:271;;16204:2;16194:8;16191:16;16185:3;16179:4;16176:13;16172:36;16166:2;16156:8;16153:16;16148:2;16142:4;16139:12;16135:35;16132:77;16129:2;;;-1:-1:-1;16241:19:1;;;16276:14;;;16273:2;;;16293:18;;:::i;:::-;16326:5;;16129:2;16373:42;16411:3;16401:8;16395:4;16392:1;16373:42;:::i;:::-;16448:6;16443:3;16439:16;16430:7;16427:29;16424:2;;;16459:18;;:::i;:::-;16497:20;;15665:858;-1:-1:-1;;;;15665:858:1:o;16528:168::-;;16634:1;16630;16626:6;16622:14;16619:1;16616:21;16611:1;16604:9;16597:17;16593:45;16590:2;;;16641:18;;:::i;:::-;-1:-1:-1;16681:9:1;;16580:116::o;16701:125::-;;16769:1;16766;16763:8;16760:2;;;16774:18;;:::i;:::-;-1:-1:-1;16811:9:1;;16750:76::o;16831:258::-;16903:1;16913:113;16927:6;16924:1;16921:13;16913:113;;;17003:11;;;16997:18;16984:11;;;16977:39;16949:2;16942:10;16913:113;;;17044:6;17041:1;17038:13;17035:2;;;-1:-1:-1;;17079:1:1;17061:16;;17054:27;16884:205::o;17094:127::-;17155:10;17150:3;17146:20;17143:1;17136:31;17186:4;17183:1;17176:15;17210:4;17207:1;17200:15;17226:127;17287:10;17282:3;17278:20;17275:1;17268:31;17318:4;17315:1;17308:15;17342:4;17339:1;17332:15;17358:131;-1:-1:-1;;;;;17433:31:1;;17423:42;;17413:2;;17479:1;17476;17469:12
Swarm Source
ipfs://aea34608535fe8e0c6e63dd5b475c67b2b1b7cf2c00902e64d775f94d0f69b30
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.