More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Initialize | 12539905 | 1373 days ago | IN | 0 ETH | 0.00291194 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CompoundIntegration
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-31 */ pragma solidity 0.8.2; 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 Interface of the ERC20 standard as defined in the EIP. */ /** * @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"); } } } library MassetHelpers { using SafeERC20 for IERC20; function transferReturnBalance( address _sender, address _recipient, address _bAsset, uint256 _qty ) internal returns (uint256 receivedQty, uint256 recipientBalance) { uint256 balBefore = IERC20(_bAsset).balanceOf(_recipient); IERC20(_bAsset).safeTransferFrom(_sender, _recipient, _qty); recipientBalance = IERC20(_bAsset).balanceOf(_recipient); receivedQty = recipientBalance - balBefore; } function safeInfiniteApprove(address _asset, address _spender) internal { IERC20(_asset).safeApprove(_spender, 0); IERC20(_asset).safeApprove(_spender, 2**256 - 1); } } interface IPlatformIntegration { /** * @dev Deposit the given bAsset to Lending platform * @param _bAsset bAsset address * @param _amount Amount to deposit */ function deposit( address _bAsset, uint256 _amount, bool isTokenFeeCharged ) external returns (uint256 quantityDeposited); /** * @dev Withdraw given bAsset from Lending platform */ function withdraw( address _receiver, address _bAsset, uint256 _amount, bool _hasTxFee ) external; /** * @dev Withdraw given bAsset from Lending platform */ function withdraw( address _receiver, address _bAsset, uint256 _amount, uint256 _totalAmount, bool _hasTxFee ) external; /** * @dev Withdraw given bAsset from the cache */ function withdrawRaw( address _receiver, address _bAsset, uint256 _amount ) external; /** * @dev Returns the current balance of the given bAsset */ function checkBalance(address _bAsset) external returns (uint256 balance); /** * @dev Returns the pToken */ function bAssetToPToken(address _bAsset) external returns (address pToken); } abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } 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); } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } abstract contract AbstractIntegration is IPlatformIntegration, Initializable, ImmutableModule, ReentrancyGuard { event PTokenAdded(address indexed _bAsset, address _pToken); event Deposit(address indexed _bAsset, address _pToken, uint256 _amount); event Withdrawal(address indexed _bAsset, address _pToken, uint256 _amount); event PlatformWithdrawal( address indexed bAsset, address pToken, uint256 totalAmount, uint256 userAmount ); // LP has write access address public immutable lpAddress; // bAsset => pToken (Platform Specific Token Address) mapping(address => address) public override bAssetToPToken; // Full list of all bAssets supported here address[] internal bAssetsMapped; /** * @param _nexus Address of the Nexus * @param _lp Address of LP */ constructor(address _nexus, address _lp) ReentrancyGuard() ImmutableModule(_nexus) { require(_lp != address(0), "Invalid LP address"); lpAddress = _lp; } /** * @dev Simple initializer to set first bAsset/pTokens */ function initialize(address[] calldata _bAssets, address[] calldata _pTokens) public initializer { uint256 len = _bAssets.length; require(len == _pTokens.length, "Invalid inputs"); for (uint256 i = 0; i < len; i++) { _setPTokenAddress(_bAssets[i], _pTokens[i]); } } /** * @dev Modifier to allow function calls only from the Governor. */ modifier onlyLP() { require(msg.sender == lpAddress, "Only the LP can execute"); _; } /*************************************** CONFIG ****************************************/ /** * @dev Provide support for bAsset by passing its pToken address. * This method can only be called by the system Governor * @param _bAsset Address for the bAsset * @param _pToken Address for the corresponding platform token */ function setPTokenAddress(address _bAsset, address _pToken) external onlyGovernor { _setPTokenAddress(_bAsset, _pToken); } /** * @dev Provide support for bAsset by passing its pToken address. * Add to internal mappings and execute the platform specific, * abstract method `_abstractSetPToken` * @param _bAsset Address for the bAsset * @param _pToken Address for the corresponding platform token */ function _setPTokenAddress(address _bAsset, address _pToken) internal { require(bAssetToPToken[_bAsset] == address(0), "pToken already set"); require(_bAsset != address(0) && _pToken != address(0), "Invalid addresses"); bAssetToPToken[_bAsset] = _pToken; bAssetsMapped.push(_bAsset); emit PTokenAdded(_bAsset, _pToken); _abstractSetPToken(_bAsset, _pToken); } function _abstractSetPToken(address _bAsset, address _pToken) internal virtual; /** * @dev Simple helper func to get the min of two values */ function _min(uint256 x, uint256 y) internal pure returns (uint256) { return x > y ? y : x; } } interface ICERC20 { /** * @notice The mint function transfers an asset into the protocol, which begins accumulating * interest based on the current Supply Rate for the asset. The user receives a quantity of * cTokens equal to the underlying tokens supplied, divided by the current Exchange Rate. * @param mintAmount The amount of the asset to be supplied, in units of the underlying asset. * @return 0 on success, otherwise an Error codes */ function mint(uint mintAmount) external returns (uint); /** * @notice The redeem underlying function converts cTokens into a specified quantity of the underlying * asset, and returns them to the user. The amount of cTokens redeemed is equal to the quantity of * underlying tokens received, divided by the current Exchange Rate. The amount redeemed must be less * than the user's Account Liquidity and the market's available liquidity. * @param redeemAmount The amount of underlying to be redeemed. * @return 0 on success, otherwise an Error codes */ function redeemUnderlying(uint redeemAmount) external returns (uint); /** * @notice The user's underlying balance, representing their assets in the protocol, is equal to * the user's cToken balance multiplied by the Exchange Rate. * @param owner The account to get the underlying balance of. * @return The amount of underlying currently owned by the account. */ function balanceOfUnderlying(address owner) external returns (uint); /** * @notice Calculates the exchange rate from the underlying to the CToken * @dev This function does not accrue interest before calculating the exchange rate * @return Calculated exchange rate scaled by 1e18 */ function exchangeRateStored() external view returns (uint); /** * @notice Get the token balance of the `owner` * @param owner The address of the account to query * @return The number of tokens owned by `owner` */ function balanceOf(address owner) external view returns (uint256); } // SPDX-License-Identifier: AGPL-3.0-or-later /** * @title CompoundIntegration * @author mStable * @notice A simple connection to deposit and withdraw bAssets from Compound and Cream * @dev VERSION: 1.0 * DATE: 2021-05-04 */ contract CompoundIntegration is AbstractIntegration { using SafeERC20 for IERC20; event SkippedWithdrawal(address bAsset, uint256 amount); event RewardTokenApproved(address rewardToken, address account); address public immutable rewardToken; /** * @param _nexus Address of the Nexus * @param _lp Address of liquidity provider. eg mAsset or feeder pool * @param _rewardToken Reward token, if any. eg COMP */ constructor( address _nexus, address _lp, address _rewardToken ) AbstractIntegration(_nexus, _lp) { rewardToken = _rewardToken; } /*************************************** ADMIN ****************************************/ /** * @dev Approves Liquidator to spend reward tokens */ function approveRewardToken() external onlyGovernor { address liquidator = nexus.getModule(keccak256("Liquidator")); require(liquidator != address(0), "Liquidator address is zero"); MassetHelpers.safeInfiniteApprove(rewardToken, liquidator); emit RewardTokenApproved(rewardToken, liquidator); } /*************************************** CORE ****************************************/ /** * @dev Deposit a quantity of bAsset into the platform. Credited cTokens * remain here in the vault. Can only be called by whitelisted addresses * (mAsset and corresponding BasketManager) * @param _bAsset Address for the bAsset * @param _amount Units of bAsset to deposit * @param isTokenFeeCharged Flag that signals if an xfer fee is charged on bAsset * @return quantityDeposited Quantity of bAsset that entered the platform */ function deposit( address _bAsset, uint256 _amount, bool isTokenFeeCharged ) external override onlyLP nonReentrant returns (uint256 quantityDeposited) { require(_amount > 0, "Must deposit something"); // Get the Target token ICERC20 cToken = _getCTokenFor(_bAsset); quantityDeposited = _amount; if(isTokenFeeCharged) { // If we charge a fee, account for it uint256 prevBal = _checkBalance(cToken); require(cToken.mint(_amount) == 0, "cToken mint failed"); uint256 newBal = _checkBalance(cToken); quantityDeposited = _min(quantityDeposited, newBal - prevBal); } else { // Else just execute the mint require(cToken.mint(_amount) == 0, "cToken mint failed"); } emit Deposit(_bAsset, address(cToken), quantityDeposited); } /** * @dev Withdraw a quantity of bAsset from Compound * @param _receiver Address to which the withdrawn bAsset should be sent * @param _bAsset Address of the bAsset * @param _amount Units of bAsset to withdraw * @param _hasTxFee Is the bAsset known to have a tx fee? */ function withdraw( address _receiver, address _bAsset, uint256 _amount, bool _hasTxFee ) external override onlyLP nonReentrant { _withdraw(_receiver, _bAsset, _amount, _amount, _hasTxFee); } /** * @dev Withdraw a quantity of bAsset from Compound * @param _receiver Address to which the withdrawn bAsset should be sent * @param _bAsset Address of the bAsset * @param _amount Units of bAsset to withdraw * @param _totalAmount Total units to pull from lending platform * @param _hasTxFee Is the bAsset known to have a tx fee? */ function withdraw( address _receiver, address _bAsset, uint256 _amount, uint256 _totalAmount, bool _hasTxFee ) external override onlyLP nonReentrant { _withdraw(_receiver, _bAsset, _amount, _totalAmount, _hasTxFee); } function _withdraw( address _receiver, address _bAsset, uint256 _amount, uint256 _totalAmount, bool _hasTxFee ) internal { require(_totalAmount > 0, "Must withdraw something"); require(_receiver != address(0), "Must specify recipient"); // Get the Target token ICERC20 cToken = _getCTokenFor(_bAsset); // If redeeming 0 cTokens, just skip, else COMP will revert // Reason for skipping: to ensure that redeemMasset is always able to execute uint256 cTokensToRedeem = _convertUnderlyingToCToken(cToken, _totalAmount); if(cTokensToRedeem == 0) { emit SkippedWithdrawal(_bAsset, _totalAmount); return; } uint256 userWithdrawal = _amount; if(_hasTxFee) { require(_amount == _totalAmount, "Cache inactive with tx fee"); IERC20 b = IERC20(_bAsset); uint256 prevBal = b.balanceOf(address(this)); require(cToken.redeemUnderlying(_amount) == 0, "redeem failed"); uint256 newBal = b.balanceOf(address(this)); userWithdrawal = _min(userWithdrawal, newBal - prevBal); } else { // Redeem Underlying bAsset amount require(cToken.redeemUnderlying(_totalAmount) == 0, "redeem failed"); } // Send redeemed bAsset to the receiver IERC20(_bAsset).safeTransfer(_receiver, userWithdrawal); emit PlatformWithdrawal(_bAsset, address(cToken), _totalAmount, _amount); } /** * @dev Withdraw a quantity of bAsset from the cache. * @param _receiver Address to which the bAsset should be sent * @param _bAsset Address of the bAsset * @param _amount Units of bAsset to withdraw */ function withdrawRaw( address _receiver, address _bAsset, uint256 _amount ) external override onlyLP nonReentrant { require(_amount > 0, "Must withdraw something"); require(_receiver != address(0), "Must specify recipient"); IERC20(_bAsset).safeTransfer(_receiver, _amount); emit Withdrawal(_bAsset, address(0), _amount); } /** * @dev Get the total bAsset value held in the platform * This includes any interest that was generated since depositing * Compound exchange rate between the cToken and bAsset gradually increases, * causing the cToken to be worth more corresponding bAsset. * @param _bAsset Address of the bAsset * @return balance Total value of the bAsset in the platform */ function checkBalance(address _bAsset) external override view returns (uint256 balance) { // balance is always with token cToken decimals ICERC20 cToken = _getCTokenFor(_bAsset); balance = _checkBalance(cToken); } /*************************************** APPROVALS ****************************************/ /** * @dev Re-approve the spending of all bAssets by their corresponding cToken, * if for some reason is it necessary. Only callable through Governance. */ function reApproveAllTokens() external onlyGovernor { uint256 bAssetCount = bAssetsMapped.length; for(uint i = 0; i < bAssetCount; i++){ address bAsset = bAssetsMapped[i]; address cToken = bAssetToPToken[bAsset]; MassetHelpers.safeInfiniteApprove(bAsset, cToken); } } /** * @dev Internal method to respond to the addition of new bAsset / cTokens * We need to approve the cToken and give it permission to spend the bAsset * @param _bAsset Address of the bAsset to approve * @param _cToken This cToken has the approval approval */ function _abstractSetPToken(address _bAsset, address _cToken) internal override { // approve the pool to spend the bAsset MassetHelpers.safeInfiniteApprove(_bAsset, _cToken); } /*************************************** HELPERS ****************************************/ /** * @dev Get the cToken wrapped in the ICERC20 interface for this bAsset. * Fails if the pToken doesn't exist in our mappings. * @param _bAsset Address of the bAsset * @return cToken Corresponding cToken to this bAsset */ function _getCTokenFor(address _bAsset) internal view returns (ICERC20 cToken) { address cTokenAddress = bAssetToPToken[_bAsset]; require(cTokenAddress != address(0), "cToken does not exist"); cToken = ICERC20(cTokenAddress); } /** * @dev Get the total bAsset value held in the platform * underlying = (cTokenAmt * exchangeRate) / 1e18 * @param _cToken cToken for which to check balance * @return balance Total value of the bAsset in the platform */ function _checkBalance(ICERC20 _cToken) internal view returns (uint256 balance) { uint256 cTokenBalance = _cToken.balanceOf(address(this)); uint256 exchangeRate = _cToken.exchangeRateStored(); // e.g. 50e8*205316390724364402565641705 / 1e18 = 1.0265..e18 balance = (cTokenBalance * exchangeRate) / 1e18; } /** * @dev Converts an underlying amount into cToken amount * cTokenAmt = (underlying * 1e18) / exchangeRate * @param _cToken cToken for which to change * @param _underlying Amount of underlying to convert * @return amount Equivalent amount of cTokens */ function _convertUnderlyingToCToken(ICERC20 _cToken, uint256 _underlying) internal view returns (uint256 amount) { uint256 exchangeRate = _cToken.exchangeRateStored(); // e.g. 1e18*1e18 / 205316390724364402565641705 = 50e8 // e.g. 1e8*1e18 / 205316390724364402565641705 = 0.45 or 0 amount = (_underlying * 1e18) / exchangeRate; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_nexus","type":"address"},{"internalType":"address","name":"_lp","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_bAsset","type":"address"},{"indexed":false,"internalType":"address","name":"_pToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_bAsset","type":"address"},{"indexed":false,"internalType":"address","name":"_pToken","type":"address"}],"name":"PTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bAsset","type":"address"},{"indexed":false,"internalType":"address","name":"pToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"PlatformWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RewardTokenApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SkippedWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_bAsset","type":"address"},{"indexed":false,"internalType":"address","name":"_pToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"approveRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bAssetToPToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bAsset","type":"address"}],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"isTokenFeeCharged","type":"bool"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"quantityDeposited","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bAssets","type":"address[]"},{"internalType":"address[]","name":"_pTokens","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nexus","outputs":[{"internalType":"contract INexus","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reApproveAllTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"address","name":"_pToken","type":"address"}],"name":"setPTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_hasTxFee","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_totalAmount","type":"uint256"},{"internalType":"bool","name":"_hasTxFee","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawRaw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162001e2738038062001e27833981016040819052620000349162000137565b8282816001600160a01b038116620000935760405162461bcd60e51b815260206004820152601560248201527f4e657875732061646472657373206973207a65726f000000000000000000000060448201526064015b60405180910390fd5b60601b6001600160601b031916608052600180556001600160a01b038116620000f45760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204c50206164647265737360701b60448201526064016200008a565b6001600160601b0319606091821b811660a05292901b90911660c0525062000180915050565b80516001600160a01b03811681146200013257600080fd5b919050565b6000806000606084860312156200014c578283fd5b62000157846200011a565b925062000167602085016200011a565b915062000177604085016200011a565b90509250925092565b60805160601c60a05160601c60c05160601c611c36620001f16000396000818161021201528181610aeb0152610b1e01526000818161018e01528181610257015281816106dd01528181610764015261094f0152600081816101b501528181610a0c01526113b70152611c366000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639b4dc8cc1161008c578063a755349a11610066578063a755349a146101ea578063c89fc72f146101f2578063e729645414610205578063f7c618c11461020d576100cf565b80639b4dc8cc14610189578063a3f5c1d2146101b0578063a4e28595146101d7576100cf565b80630ed57b3a146100d45780633edd1128146100e95780635f5152261461010f57806371c465851461012257806373cf25f814610163578063934785b714610176575b600080fd5b6100e76100e2366004611860565b610234565b005b6100fc6100f7366004611988565b61024a565b6040519081526020015b60405180910390f35b6100fc61011d366004611828565b610522565b61014b610130366004611828565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610106565b6100e76101713660046119c9565b610540565b6100e76101843660046118d8565b6106d2565b61014b7f000000000000000000000000000000000000000000000000000000000000000081565b61014b7f000000000000000000000000000000000000000000000000000000000000000081565b6100e76101e5366004611898565b610759565b6100e76108c1565b6100e761020036600461192a565b610944565b6100e76109cc565b61014b7f000000000000000000000000000000000000000000000000000000000000000081565b61023c610b76565b6102468282610be0565b5050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461029d5760405162461bcd60e51b815260040161029490611ab5565b60405180910390fd5b600260015414156102c05760405162461bcd60e51b815260040161029490611aec565b60026001558261030b5760405162461bcd60e51b81526020600482015260166024820152754d757374206465706f73697420736f6d657468696e6760501b6044820152606401610294565b600061031685610d45565b9050839150821561041457600061032c82610dad565b60405163140e25ad60e31b8152600481018790529091506001600160a01b0383169063a0712d6890602401602060405180830381600087803b15801561037157600080fd5b505af1158015610385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a99190611a4e565b156103eb5760405162461bcd60e51b815260206004820152601260248201527118d51bdad95b881b5a5b9d0819985a5b195960721b6044820152606401610294565b60006103f683610dad565b905061040b846104068484611b62565b610ec5565b935050506104d0565b60405163140e25ad60e31b8152600481018590526001600160a01b0382169063a0712d6890602401602060405180830381600087803b15801561045657600080fd5b505af115801561046a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048e9190611a4e565b156104d05760405162461bcd60e51b815260206004820152601260248201527118d51bdad95b881b5a5b9d0819985a5b195960721b6044820152606401610294565b604080516001600160a01b038381168252602082018590528716917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62910160405180910390a250600180559392505050565b60008061052e83610d45565b905061053981610dad565b9392505050565b600054610100900460ff1680610559575060005460ff16155b6105bc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610294565b600054610100900460ff161580156105e7576000805460ff1961ff0019909116610100171660011790555b838281146106285760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b6044820152606401610294565b60005b818110156106b7576106a587878381811061065657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061066b9190611828565b86868481811061068b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106a09190611828565b610be0565b806106af81611ba9565b91505061062b565b505080156106cb576000805461ff00191690555b5050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071a5760405162461bcd60e51b815260040161029490611ab5565b6002600154141561073d5760405162461bcd60e51b815260040161029490611aec565b600260015561074f8484848085610eda565b5050600180555050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107a15760405162461bcd60e51b815260040161029490611ab5565b600260015414156107c45760405162461bcd60e51b815260040161029490611aec565b6002600155806108105760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b6044820152606401610294565b6001600160a01b03831661085f5760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081cdc1958da599e481c9958da5c1a595b9d60521b6044820152606401610294565b6108736001600160a01b0383168483611320565b6040805160008152602081018390526001600160a01b038416917f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398910160405180910390a250506001805550565b6108c9610b76565b60035460005b81811015610246576000600382815481106108fa57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0390811680845260029092526040909220549092501661092f8282611388565b5050808061093c90611ba9565b9150506108cf565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461098c5760405162461bcd60e51b815260040161029490611ab5565b600260015414156109af5760405162461bcd60e51b815260040161029490611aec565b60026001556109c18585858585610eda565b505060018055505050565b6109d4610b76565b6040516385acd64160e01b81527f1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d460048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906385acd6419060240160206040518083038186803b158015610a5657600080fd5b505afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8e9190611844565b90506001600160a01b038116610ae65760405162461bcd60e51b815260206004820152601a60248201527f4c697175696461746f722061646472657373206973207a65726f0000000000006044820152606401610294565b610b107f000000000000000000000000000000000000000000000000000000000000000082611388565b604080516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081168252831660208201527f71b4effce66e58c9e4ad29e468e7100f7e8b5d106381fd905a25eee3ea1b6a93910160405180910390a150565b610b7e6113b3565b6001600160a01b0316336001600160a01b031614610bde5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f722063616e2065786563757465000000000000006044820152606401610294565b565b6001600160a01b038281166000908152600260205260409020541615610c3d5760405162461bcd60e51b81526020600482015260126024820152711c151bdad95b88185b1c9958591e481cd95d60721b6044820152606401610294565b6001600160a01b03821615801590610c5d57506001600160a01b03811615155b610c9d5760405162461bcd60e51b8152602060048201526011602482015270496e76616c69642061646472657373657360781b6044820152606401610294565b6001600160a01b03828116600081815260026020908152604080832080549587166001600160a01b031996871681179091556003805460018101825594527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180549095168417909455925190815290917fef6485b84315f9b1483beffa32aae9a0596890395e3d7521f1c5fbb51790e765910160405180910390a2610246828261144b565b6001600160a01b0380821660009081526002602052604081205490911680610da75760405162461bcd60e51b815260206004820152601560248201527418d51bdad95b88191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606401610294565b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038416906370a082319060240160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611a4e565b90506000836001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6657600080fd5b505afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e9190611a4e565b9050670de0b6b3a7640000610eb38284611b43565b610ebd9190611b23565b949350505050565b6000818311610ed45782610539565b50919050565b60008211610f245760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b6044820152606401610294565b6001600160a01b038516610f735760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081cdc1958da599e481c9958da5c1a595b9d60521b6044820152606401610294565b6000610f7e85610d45565b90506000610f8c8285611455565b905080610fdc57604080516001600160a01b0388168152602081018690527f2ca0d37ecfc1b8853f4bc276c69586250b3978c1d467c05d6c143966026724ec910160405180910390a150506106cb565b8483156111fc578486146110325760405162461bcd60e51b815260206004820152601a60248201527f436163686520696e6163746976652077697468207478206665650000000000006044820152606401610294565b6040516370a0823160e01b815230600482015287906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae9190611a4e565b60405163852a12e360e01b8152600481018a90529091506001600160a01b0386169063852a12e390602401602060405180830381600087803b1580156110f357600080fd5b505af1158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190611a4e565b156111685760405162461bcd60e51b815260206004820152600d60248201526c1c995919595b4819985a5b1959609a1b6044820152606401610294565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b1580156111aa57600080fd5b505afa1580156111be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e29190611a4e565b90506111f2846104068484611b62565b93505050506112b3565b60405163852a12e360e01b8152600481018690526001600160a01b0384169063852a12e390602401602060405180830381600087803b15801561123e57600080fd5b505af1158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190611a4e565b156112b35760405162461bcd60e51b815260206004820152600d60248201526c1c995919595b4819985a5b1959609a1b6044820152606401610294565b6112c76001600160a01b0388168983611320565b604080516001600160a01b03858116825260208201889052918101889052908816907fb925ac01b9c34cc156a17a1e3da718f364df34eec9d0c9dc4e59c2bb1e7ba54b9060600160405180910390a25050505050505050565b6040516001600160a01b03831660248201526044810182905261138390849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114de565b505050565b61139d6001600160a01b0383168260006115b0565b6102466001600160a01b038316826000196115b0565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561140e57600080fd5b505afa158015611422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114469190611844565b905090565b6102468282611388565b600080836001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561149157600080fd5b505afa1580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c99190611a4e565b905080610eb384670de0b6b3a7640000611b43565b6000611533826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116d49092919063ffffffff16565b80519091501561138357808060200190518101906115519190611a32565b6113835760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610294565b8015806116395750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156115ff57600080fd5b505afa158015611613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116379190611a4e565b155b6116a45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610294565b6040516001600160a01b03831660248201526044810182905261138390849063095ea7b360e01b9060640161134c565b6060610ebd848460008585843b61172d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610294565b600080866001600160a01b031685876040516117499190611a66565b60006040518083038185875af1925050503d8060008114611786576040519150601f19603f3d011682016040523d82523d6000602084013e61178b565b606091505b509150915061179b8282866117a6565b979650505050505050565b606083156117b5575081610539565b8251156117c55782518084602001fd5b8160405162461bcd60e51b81526004016102949190611a82565b60008083601f8401126117f0578182fd5b50813567ffffffffffffffff811115611807578182fd5b602083019150836020808302850101111561182157600080fd5b9250929050565b600060208284031215611839578081fd5b813561053981611bda565b600060208284031215611855578081fd5b815161053981611bda565b60008060408385031215611872578081fd5b823561187d81611bda565b9150602083013561188d81611bda565b809150509250929050565b6000806000606084860312156118ac578081fd5b83356118b781611bda565b925060208401356118c781611bda565b929592945050506040919091013590565b600080600080608085870312156118ed578081fd5b84356118f881611bda565b9350602085013561190881611bda565b925060408501359150606085013561191f81611bf2565b939692955090935050565b600080600080600060a08688031215611941578081fd5b853561194c81611bda565b9450602086013561195c81611bda565b93506040860135925060608601359150608086013561197a81611bf2565b809150509295509295909350565b60008060006060848603121561199c578283fd5b83356119a781611bda565b92506020840135915060408401356119be81611bf2565b809150509250925092565b600080600080604085870312156119de578384fd5b843567ffffffffffffffff808211156119f5578586fd5b611a01888389016117df565b90965094506020870135915080821115611a19578384fd5b50611a26878288016117df565b95989497509550505050565b600060208284031215611a43578081fd5b815161053981611bf2565b600060208284031215611a5f578081fd5b5051919050565b60008251611a78818460208701611b79565b9190910192915050565b6000602082528251806020840152611aa1816040850160208701611b79565b601f01601f19169190910160400192915050565b60208082526017908201527f4f6e6c7920746865204c502063616e2065786563757465000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082611b3e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611b5d57611b5d611bc4565b500290565b600082821015611b7457611b74611bc4565b500390565b60005b83811015611b94578181015183820152602001611b7c565b83811115611ba3576000848401525b50505050565b6000600019821415611bbd57611bbd611bc4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611bef57600080fd5b50565b8015158114611bef57600080fdfea26469706673582212202951d24d53bcf0af4ff0fceb61f2cc0f7cd7e24e06205b3f2899e2a0e3cd256e64736f6c63430008020033000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb30000000000000000000000004fb30c5a3ac8e85bc32785518633303c4590752d0000000000000000000000002ba592f78db6436527729929aaf6c908497cb200
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639b4dc8cc1161008c578063a755349a11610066578063a755349a146101ea578063c89fc72f146101f2578063e729645414610205578063f7c618c11461020d576100cf565b80639b4dc8cc14610189578063a3f5c1d2146101b0578063a4e28595146101d7576100cf565b80630ed57b3a146100d45780633edd1128146100e95780635f5152261461010f57806371c465851461012257806373cf25f814610163578063934785b714610176575b600080fd5b6100e76100e2366004611860565b610234565b005b6100fc6100f7366004611988565b61024a565b6040519081526020015b60405180910390f35b6100fc61011d366004611828565b610522565b61014b610130366004611828565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610106565b6100e76101713660046119c9565b610540565b6100e76101843660046118d8565b6106d2565b61014b7f0000000000000000000000004fb30c5a3ac8e85bc32785518633303c4590752d81565b61014b7f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb381565b6100e76101e5366004611898565b610759565b6100e76108c1565b6100e761020036600461192a565b610944565b6100e76109cc565b61014b7f0000000000000000000000002ba592f78db6436527729929aaf6c908497cb20081565b61023c610b76565b6102468282610be0565b5050565b6000336001600160a01b037f0000000000000000000000004fb30c5a3ac8e85bc32785518633303c4590752d161461029d5760405162461bcd60e51b815260040161029490611ab5565b60405180910390fd5b600260015414156102c05760405162461bcd60e51b815260040161029490611aec565b60026001558261030b5760405162461bcd60e51b81526020600482015260166024820152754d757374206465706f73697420736f6d657468696e6760501b6044820152606401610294565b600061031685610d45565b9050839150821561041457600061032c82610dad565b60405163140e25ad60e31b8152600481018790529091506001600160a01b0383169063a0712d6890602401602060405180830381600087803b15801561037157600080fd5b505af1158015610385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a99190611a4e565b156103eb5760405162461bcd60e51b815260206004820152601260248201527118d51bdad95b881b5a5b9d0819985a5b195960721b6044820152606401610294565b60006103f683610dad565b905061040b846104068484611b62565b610ec5565b935050506104d0565b60405163140e25ad60e31b8152600481018590526001600160a01b0382169063a0712d6890602401602060405180830381600087803b15801561045657600080fd5b505af115801561046a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048e9190611a4e565b156104d05760405162461bcd60e51b815260206004820152601260248201527118d51bdad95b881b5a5b9d0819985a5b195960721b6044820152606401610294565b604080516001600160a01b038381168252602082018590528716917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62910160405180910390a250600180559392505050565b60008061052e83610d45565b905061053981610dad565b9392505050565b600054610100900460ff1680610559575060005460ff16155b6105bc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610294565b600054610100900460ff161580156105e7576000805460ff1961ff0019909116610100171660011790555b838281146106285760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b6044820152606401610294565b60005b818110156106b7576106a587878381811061065657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061066b9190611828565b86868481811061068b57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106a09190611828565b610be0565b806106af81611ba9565b91505061062b565b505080156106cb576000805461ff00191690555b5050505050565b336001600160a01b037f0000000000000000000000004fb30c5a3ac8e85bc32785518633303c4590752d161461071a5760405162461bcd60e51b815260040161029490611ab5565b6002600154141561073d5760405162461bcd60e51b815260040161029490611aec565b600260015561074f8484848085610eda565b5050600180555050565b336001600160a01b037f0000000000000000000000004fb30c5a3ac8e85bc32785518633303c4590752d16146107a15760405162461bcd60e51b815260040161029490611ab5565b600260015414156107c45760405162461bcd60e51b815260040161029490611aec565b6002600155806108105760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b6044820152606401610294565b6001600160a01b03831661085f5760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081cdc1958da599e481c9958da5c1a595b9d60521b6044820152606401610294565b6108736001600160a01b0383168483611320565b6040805160008152602081018390526001600160a01b038416917f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398910160405180910390a250506001805550565b6108c9610b76565b60035460005b81811015610246576000600382815481106108fa57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0390811680845260029092526040909220549092501661092f8282611388565b5050808061093c90611ba9565b9150506108cf565b336001600160a01b037f0000000000000000000000004fb30c5a3ac8e85bc32785518633303c4590752d161461098c5760405162461bcd60e51b815260040161029490611ab5565b600260015414156109af5760405162461bcd60e51b815260040161029490611aec565b60026001556109c18585858585610eda565b505060018055505050565b6109d4610b76565b6040516385acd64160e01b81527f1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d460048201526000907f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb36001600160a01b0316906385acd6419060240160206040518083038186803b158015610a5657600080fd5b505afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8e9190611844565b90506001600160a01b038116610ae65760405162461bcd60e51b815260206004820152601a60248201527f4c697175696461746f722061646472657373206973207a65726f0000000000006044820152606401610294565b610b107f0000000000000000000000002ba592f78db6436527729929aaf6c908497cb20082611388565b604080516001600160a01b037f0000000000000000000000002ba592f78db6436527729929aaf6c908497cb20081168252831660208201527f71b4effce66e58c9e4ad29e468e7100f7e8b5d106381fd905a25eee3ea1b6a93910160405180910390a150565b610b7e6113b3565b6001600160a01b0316336001600160a01b031614610bde5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f722063616e2065786563757465000000000000006044820152606401610294565b565b6001600160a01b038281166000908152600260205260409020541615610c3d5760405162461bcd60e51b81526020600482015260126024820152711c151bdad95b88185b1c9958591e481cd95d60721b6044820152606401610294565b6001600160a01b03821615801590610c5d57506001600160a01b03811615155b610c9d5760405162461bcd60e51b8152602060048201526011602482015270496e76616c69642061646472657373657360781b6044820152606401610294565b6001600160a01b03828116600081815260026020908152604080832080549587166001600160a01b031996871681179091556003805460018101825594527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180549095168417909455925190815290917fef6485b84315f9b1483beffa32aae9a0596890395e3d7521f1c5fbb51790e765910160405180910390a2610246828261144b565b6001600160a01b0380821660009081526002602052604081205490911680610da75760405162461bcd60e51b815260206004820152601560248201527418d51bdad95b88191bd95cc81b9bdd08195e1a5cdd605a1b6044820152606401610294565b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038416906370a082319060240160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611a4e565b90506000836001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e6657600080fd5b505afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e9190611a4e565b9050670de0b6b3a7640000610eb38284611b43565b610ebd9190611b23565b949350505050565b6000818311610ed45782610539565b50919050565b60008211610f245760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b6044820152606401610294565b6001600160a01b038516610f735760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081cdc1958da599e481c9958da5c1a595b9d60521b6044820152606401610294565b6000610f7e85610d45565b90506000610f8c8285611455565b905080610fdc57604080516001600160a01b0388168152602081018690527f2ca0d37ecfc1b8853f4bc276c69586250b3978c1d467c05d6c143966026724ec910160405180910390a150506106cb565b8483156111fc578486146110325760405162461bcd60e51b815260206004820152601a60248201527f436163686520696e6163746976652077697468207478206665650000000000006044820152606401610294565b6040516370a0823160e01b815230600482015287906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae9190611a4e565b60405163852a12e360e01b8152600481018a90529091506001600160a01b0386169063852a12e390602401602060405180830381600087803b1580156110f357600080fd5b505af1158015611107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112b9190611a4e565b156111685760405162461bcd60e51b815260206004820152600d60248201526c1c995919595b4819985a5b1959609a1b6044820152606401610294565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b1580156111aa57600080fd5b505afa1580156111be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e29190611a4e565b90506111f2846104068484611b62565b93505050506112b3565b60405163852a12e360e01b8152600481018690526001600160a01b0384169063852a12e390602401602060405180830381600087803b15801561123e57600080fd5b505af1158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190611a4e565b156112b35760405162461bcd60e51b815260206004820152600d60248201526c1c995919595b4819985a5b1959609a1b6044820152606401610294565b6112c76001600160a01b0388168983611320565b604080516001600160a01b03858116825260208201889052918101889052908816907fb925ac01b9c34cc156a17a1e3da718f364df34eec9d0c9dc4e59c2bb1e7ba54b9060600160405180910390a25050505050505050565b6040516001600160a01b03831660248201526044810182905261138390849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114de565b505050565b61139d6001600160a01b0383168260006115b0565b6102466001600160a01b038316826000196115b0565b60007f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb36001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561140e57600080fd5b505afa158015611422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114469190611844565b905090565b6102468282611388565b600080836001600160a01b031663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561149157600080fd5b505afa1580156114a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c99190611a4e565b905080610eb384670de0b6b3a7640000611b43565b6000611533826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116d49092919063ffffffff16565b80519091501561138357808060200190518101906115519190611a32565b6113835760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610294565b8015806116395750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156115ff57600080fd5b505afa158015611613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116379190611a4e565b155b6116a45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610294565b6040516001600160a01b03831660248201526044810182905261138390849063095ea7b360e01b9060640161134c565b6060610ebd848460008585843b61172d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610294565b600080866001600160a01b031685876040516117499190611a66565b60006040518083038185875af1925050503d8060008114611786576040519150601f19603f3d011682016040523d82523d6000602084013e61178b565b606091505b509150915061179b8282866117a6565b979650505050505050565b606083156117b5575081610539565b8251156117c55782518084602001fd5b8160405162461bcd60e51b81526004016102949190611a82565b60008083601f8401126117f0578182fd5b50813567ffffffffffffffff811115611807578182fd5b602083019150836020808302850101111561182157600080fd5b9250929050565b600060208284031215611839578081fd5b813561053981611bda565b600060208284031215611855578081fd5b815161053981611bda565b60008060408385031215611872578081fd5b823561187d81611bda565b9150602083013561188d81611bda565b809150509250929050565b6000806000606084860312156118ac578081fd5b83356118b781611bda565b925060208401356118c781611bda565b929592945050506040919091013590565b600080600080608085870312156118ed578081fd5b84356118f881611bda565b9350602085013561190881611bda565b925060408501359150606085013561191f81611bf2565b939692955090935050565b600080600080600060a08688031215611941578081fd5b853561194c81611bda565b9450602086013561195c81611bda565b93506040860135925060608601359150608086013561197a81611bf2565b809150509295509295909350565b60008060006060848603121561199c578283fd5b83356119a781611bda565b92506020840135915060408401356119be81611bf2565b809150509250925092565b600080600080604085870312156119de578384fd5b843567ffffffffffffffff808211156119f5578586fd5b611a01888389016117df565b90965094506020870135915080821115611a19578384fd5b50611a26878288016117df565b95989497509550505050565b600060208284031215611a43578081fd5b815161053981611bf2565b600060208284031215611a5f578081fd5b5051919050565b60008251611a78818460208701611b79565b9190910192915050565b6000602082528251806020840152611aa1816040850160208701611b79565b601f01601f19169190910160400192915050565b60208082526017908201527f4f6e6c7920746865204c502063616e2065786563757465000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082611b3e57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611b5d57611b5d611bc4565b500290565b600082821015611b7457611b74611bc4565b500390565b60005b83811015611b94578181015183820152602001611b7c565b83811115611ba3576000848401525b50505050565b6000600019821415611bbd57611bbd611bc4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611bef57600080fd5b50565b8015158114611bef57600080fdfea26469706673582212202951d24d53bcf0af4ff0fceb61f2cc0f7cd7e24e06205b3f2899e2a0e3cd256e64736f6c63430008020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb30000000000000000000000004fb30c5a3ac8e85bc32785518633303c4590752d0000000000000000000000002ba592f78db6436527729929aaf6c908497cb200
-----Decoded View---------------
Arg [0] : _nexus (address): 0xAFcE80b19A8cE13DEc0739a1aaB7A028d6845Eb3
Arg [1] : _lp (address): 0x4fB30C5A3aC8e85bC32785518633303C4590752d
Arg [2] : _rewardToken (address): 0x2ba592F78dB6436527729929AAf6c908497cB200
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb3
Arg [1] : 0000000000000000000000004fb30c5a3ac8e85bc32785518633303c4590752d
Arg [2] : 0000000000000000000000002ba592f78db6436527729929aaf6c908497cb200
Deployed Bytecode Sourcemap
29192:10555:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25619:136;;;;;;:::i;:::-;;:::i;:::-;;31085:976;;;;;;:::i;:::-;;:::i;:::-;;;6405:25:1;;;6393:2;6378:18;31085:976:0;;;;;;;;36175:286;;;;;;:::i;:::-;;:::i;24152:58::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;24152:58:0;;;;;;-1:-1:-1;;;;;5277:32:1;;;5259:51;;5247:2;5232:18;24152:58:0;5214:102:1;24673:342:0;;;;;;:::i;:::-;;:::i;32403:286::-;;;;;;:::i;:::-;;:::i;24050:34::-;;;;;19125:29;;;;;35295:441;;;;;;:::i;:::-;;:::i;36779:361::-;;;:::i;33100:322::-;;;;;;:::i;:::-;;:::i;30068:362::-;;;:::i;29420:36::-;;;;;25619:136;19559:15;:13;:15::i;:::-;25712:35:::1;25730:7;25739;25712:17;:35::i;:::-;25619:136:::0;;:::o;31085:976::-;31286:25;25148:10;-1:-1:-1;;;;;25162:9:0;25148:23;;25140:59;;;;-1:-1:-1;;;25140:59:0;;;;;;;:::i;:::-;;;;;;;;;22551:1:::1;23148:7;;:19;;23140:63;;;;-1:-1:-1::0;;;23140:63:0::1;;;;;;;:::i;:::-;22551:1;23281:7;:18:::0;31337:11;31329:46:::2;;;::::0;-1:-1:-1;;;31329:46:0;;7253:2:1;31329:46:0::2;::::0;::::2;7235:21:1::0;7292:2;7272:18;;;7265:30;-1:-1:-1;;;7311:18:1;;;7304:52;7373:18;;31329:46:0::2;7225:172:1::0;31329:46:0::2;31421:14;31438:22;31452:7;31438:13;:22::i;:::-;31421:39;;31493:7;31473:27;;31516:17;31513:471;;;31601:15;31619:21;31633:6;31619:13;:21::i;:::-;31663:20;::::0;-1:-1:-1;;;31663:20:0;;::::2;::::0;::::2;6405:25:1::0;;;31601:39:0;;-1:-1:-1;;;;;;31663:11:0;::::2;::::0;::::2;::::0;6378:18:1;;31663:20:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25:::0;31655:56:::2;;;::::0;-1:-1:-1;;;31655:56:0;;9769:2:1;31655:56:0::2;::::0;::::2;9751:21:1::0;9808:2;9788:18;;;9781:30;-1:-1:-1;;;9827:18:1;;;9820:48;9885:18;;31655:56:0::2;9741:168:1::0;31655:56:0::2;31726:14;31743:21;31757:6;31743:13;:21::i;:::-;31726:38:::0;-1:-1:-1;31799:41:0::2;31804:17:::0;31823:16:::2;31832:7:::0;31726:38;31823:16:::2;:::i;:::-;31799:4;:41::i;:::-;31779:61;;31513:471;;;;;31924:20;::::0;-1:-1:-1;;;31924:20:0;;::::2;::::0;::::2;6405:25:1::0;;;-1:-1:-1;;;;;31924:11:0;::::2;::::0;::::2;::::0;6378:18:1;;31924:20:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25:::0;31916:56:::2;;;::::0;-1:-1:-1;;;31916:56:0;;9769:2:1;31916:56:0::2;::::0;::::2;9751:21:1::0;9808:2;9788:18;;;9781:30;-1:-1:-1;;;9827:18:1;;;9820:48;9885:18;;31916:56:0::2;9741:168:1::0;31916:56:0::2;32001:52;::::0;;-1:-1:-1;;;;;5822:32:1;;;5804:51;;5886:2;5871:18;;5864:34;;;32001:52:0;::::2;::::0;::::2;::::0;5777:18:1;32001:52:0::2;;;;;;;-1:-1:-1::0;22507:1:0::1;23460:22:::0;;31085:976;;-1:-1:-1;;;31085:976:0:o;36175:286::-;36282:15;36372:14;36389:22;36403:7;36389:13;:22::i;:::-;36372:39;;36432:21;36446:6;36432:13;:21::i;:::-;36422:31;36175:286;-1:-1:-1;;;36175:286:0:o;24673:342::-;16434:13;;;;;;;;:30;;-1:-1:-1;16452:12:0;;;;16451:13;16434:30;16426:89;;;;-1:-1:-1;;;16426:89:0;;10468:2:1;16426:89:0;;;10450:21:1;10507:2;10487:18;;;10480:30;10546:34;10526:18;;;10519:62;-1:-1:-1;;;10597:18:1;;;10590:44;10651:19;;16426:89:0;10440:236:1;16426:89:0;16528:19;16551:13;;;;;;16550:14;16575:101;;;;16610:13;:20;;-1:-1:-1;;;;16610:20:0;;;;;16645:19;16626:4;16645:19;;;16575:101;24818:8;24852:22;;::::1;24844:49;;;::::0;-1:-1:-1;;;24844:49:0;;7959:2:1;24844:49:0::1;::::0;::::1;7941:21:1::0;7998:2;7978:18;;;7971:30;-1:-1:-1;;;8017:18:1;;;8010:44;8071:18;;24844:49:0::1;7931:164:1::0;24844:49:0::1;24909:9;24904:104;24928:3;24924:1;:7;24904:104;;;24953:43;24971:8;;24980:1;24971:11;;;;;-1:-1:-1::0;;;24971:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24984:8;;24993:1;24984:11;;;;;-1:-1:-1::0;;;24984:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24953:17;:43::i;:::-;24933:3:::0;::::1;::::0;::::1;:::i;:::-;;;;24904:104;;;;16688:1;16706:14:::0;16702:68;;;16753:5;16737:21;;-1:-1:-1;;16737:21:0;;;16702:68;24673:342;;;;;:::o;32403:286::-;25148:10;-1:-1:-1;;;;;25162:9:0;25148:23;;25140:59;;;;-1:-1:-1;;;25140:59:0;;;;;;;:::i;:::-;22551:1:::1;23148:7;;:19;;23140:63;;;;-1:-1:-1::0;;;23140:63:0::1;;;;;;;:::i;:::-;22551:1;23281:7;:18:::0;32623:58:::2;32633:9:::0;32644:7;32653;;32671:9;32623::::2;:58::i;:::-;-1:-1:-1::0;;22507:1:0::1;23460:22:::0;;-1:-1:-1;;32403:286:0:o;35295:441::-;25148:10;-1:-1:-1;;;;;25162:9:0;25148:23;;25140:59;;;;-1:-1:-1;;;25140:59:0;;;;;;;:::i;:::-;22551:1:::1;23148:7;;:19;;23140:63;;;;-1:-1:-1::0;;;23140:63:0::1;;;;;;;:::i;:::-;22551:1;23281:7;:18:::0;35501:11;35493:47:::2;;;::::0;-1:-1:-1;;;35493:47:0;;13051:2:1;35493:47:0::2;::::0;::::2;13033:21:1::0;13090:2;13070:18;;;13063:30;-1:-1:-1;;;13109:18:1;;;13102:53;13172:18;;35493:47:0::2;13023:173:1::0;35493:47:0::2;-1:-1:-1::0;;;;;35559:23:0;::::2;35551:58;;;::::0;-1:-1:-1;;;35551:58:0;;9418:2:1;35551:58:0::2;::::0;::::2;9400:21:1::0;9457:2;9437:18;;;9430:30;-1:-1:-1;;;9476:18:1;;;9469:52;9538:18;;35551:58:0::2;9390:172:1::0;35551:58:0::2;35622:48;-1:-1:-1::0;;;;;35622:28:0;::::2;35651:9:::0;35662:7;35622:28:::2;:48::i;:::-;35688:40;::::0;;35716:1:::2;5804:51:1::0;;5886:2;5871:18;;5864:34;;;-1:-1:-1;;;;;35688:40:0;::::2;::::0;::::2;::::0;5777:18:1;35688:40:0::2;;;;;;;-1:-1:-1::0;;22507:1:0::1;23460:22:::0;;-1:-1:-1;35295:441:0:o;36779:361::-;19559:15;:13;:15::i;:::-;36887:13:::1;:20:::0;36865:19:::1;36918:215;36938:11;36934:1;:15;36918:215;;;36970:14;36987:13;37001:1;36987:16;;;;;;-1:-1:-1::0;;;36987:16:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;36987:16:0;;::::1;37035:22:::0;;;:14:::1;:22:::0;;;;;;;;36987:16;;-1:-1:-1;37035:22:0::1;37072:49;36987:16:::0;37035:22;37072:33:::1;:49::i;:::-;36918:215;;36951:3;;;;;:::i;:::-;;;;36918:215;;33100:322:::0;25148:10;-1:-1:-1;;;;;25162:9:0;25148:23;;25140:59;;;;-1:-1:-1;;;25140:59:0;;;;;;;:::i;:::-;22551:1:::1;23148:7;;:19;;23140:63;;;;-1:-1:-1::0;;;23140:63:0::1;;;;;;;:::i;:::-;22551:1;23281:7;:18:::0;33351:63:::2;33361:9:::0;33372:7;33381;33390:12;33404:9;33351::::2;:63::i;:::-;-1:-1:-1::0;;22507:1:0::1;23460:22:::0;;-1:-1:-1;;;33100:322:0:o;30068:362::-;19559:15;:13;:15::i;:::-;30175:40:::1;::::0;-1:-1:-1;;;30175:40:0;;30191:23:::1;30175:40;::::0;::::1;6405:25:1::0;30154:18:0::1;::::0;30175:5:::1;-1:-1:-1::0;;;;;30175:15:0::1;::::0;::::1;::::0;6378:18:1;;30175:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30154:61:::0;-1:-1:-1;;;;;;30234:24:0;::::1;30226:63;;;::::0;-1:-1:-1;;;30226:63:0;;7604:2:1;30226:63:0::1;::::0;::::1;7586:21:1::0;7643:2;7623:18;;;7616:30;7682:28;7662:18;;;7655:56;7728:18;;30226:63:0::1;7576:176:1::0;30226:63:0::1;30302:58;30336:11;30349:10;30302:33;:58::i;:::-;30378:44;::::0;;-1:-1:-1;;;;;30398:11:0::1;5551:15:1::0;;5533:34;;5603:15;;5598:2;5583:18;;5576:43;30378:44:0::1;::::0;5468:18:1;30378:44:0::1;;;;;;;19585:1;30068:362::o:0;19602:121::-;19674:11;:9;:11::i;:::-;-1:-1:-1;;;;;19660:25:0;:10;-1:-1:-1;;;;;19660:25:0;;19652:63;;;;-1:-1:-1;;;19652:63:0;;9064:2:1;19652:63:0;;;9046:21:1;9103:2;9083:18;;;9076:30;9142:27;9122:18;;;9115:55;9187:18;;19652:63:0;9036:175:1;19652:63:0;19602:121::o;26083:424::-;-1:-1:-1;;;;;26172:23:0;;;26207:1;26172:23;;;:14;:23;;;;;;;:37;26164:68;;;;-1:-1:-1;;;26164:68:0;;10883:2:1;26164:68:0;;;10865:21:1;10922:2;10902:18;;;10895:30;-1:-1:-1;;;10941:18:1;;;10934:48;10999:18;;26164:68:0;10855:168:1;26164:68:0;-1:-1:-1;;;;;26251:21:0;;;;;;:46;;-1:-1:-1;;;;;;26276:21:0;;;;26251:46;26243:76;;;;-1:-1:-1;;;26243:76:0;;13403:2:1;26243:76:0;;;13385:21:1;13442:2;13422:18;;;13415:30;-1:-1:-1;;;13461:18:1;;;13454:47;13518:18;;26243:76:0;13375:167:1;26243:76:0;-1:-1:-1;;;;;26332:23:0;;;;;;;:14;:23;;;;;;;;:33;;;;;-1:-1:-1;;;;;;26332:33:0;;;;;;;;26376:13;:27;;-1:-1:-1;26376:27:0;;;;;;;;;;;;;;;;;;;;26421:29;;5259:51:1;;;26332:23:0;;26421:29;;5232:18:1;26421:29:0;;;;;;;26463:36;26482:7;26491;26463:18;:36::i;38071:291::-;-1:-1:-1;;;;;38217:23:0;;;38161:14;38217:23;;;:14;:23;;;;;;38161:14;;38217:23;38259:27;38251:61;;;;-1:-1:-1;;;38251:61:0;;11230:2:1;38251:61:0;;;11212:21:1;11269:2;11249:18;;;11242:30;-1:-1:-1;;;11288:18:1;;;11281:51;11349:18;;38251:61:0;11202:171:1;38251:61:0;38340:13;38071:291;-1:-1:-1;;38071:291:0:o;38643:378::-;38790:32;;-1:-1:-1;;;38790:32:0;;38816:4;38790:32;;;5259:51:1;38733:15:0;;;;-1:-1:-1;;;;;38790:17:0;;;;;5232:18:1;;38790:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38766:56;;38833:20;38856:7;-1:-1:-1;;;;;38856:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38833:51;-1:-1:-1;39009:4:0;38977:28;38833:51;38977:13;:28;:::i;:::-;38976:37;;;;:::i;:::-;38966:47;38643:378;-1:-1:-1;;;;38643:378:0:o;26681:107::-;26740:7;26771:1;26767;:5;:13;;26779:1;26767:13;;;-1:-1:-1;26775:1:0;26760:20;-1:-1:-1;26681:107:0:o;33430:1598::-;33649:1;33634:12;:16;33626:52;;;;-1:-1:-1;;;33626:52:0;;13051:2:1;33626:52:0;;;13033:21:1;13090:2;13070:18;;;13063:30;-1:-1:-1;;;13109:18:1;;;13102:53;13172:18;;33626:52:0;13023:173:1;33626:52:0;-1:-1:-1;;;;;33697:23:0;;33689:58;;;;-1:-1:-1;;;33689:58:0;;9418:2:1;33689:58:0;;;9400:21:1;9457:2;9437:18;;;9430:30;-1:-1:-1;;;9476:18:1;;;9469:52;9538:18;;33689:58:0;9390:172:1;33689:58:0;33793:14;33810:22;33824:7;33810:13;:22::i;:::-;33793:39;;34001:23;34027:48;34054:6;34062:12;34027:26;:48::i;:::-;34001:74;-1:-1:-1;34089:20:0;34086:118;;34131:40;;;-1:-1:-1;;;;;5822:32:1;;5804:51;;5886:2;5871:18;;5864:34;;;34131:40:0;;5777:18:1;34131:40:0;;;;;;;34186:7;;;;34086:118;34241:7;34261:558;;;;34309:12;34298:7;:23;34290:62;;;;-1:-1:-1;;;34290:62:0;;8709:2:1;34290:62:0;;;8691:21:1;8748:2;8728:18;;;8721:30;8787:28;8767:18;;;8760:56;8833:18;;34290:62:0;8681:176:1;34290:62:0;34426:26;;-1:-1:-1;;;34426:26:0;;34446:4;34426:26;;;5259:51:1;34385:7:0;;34367:8;;-1:-1:-1;;;;;34426:11:0;;;;;5232:18:1;;34426:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34475:32;;-1:-1:-1;;;34475:32:0;;;;;6405:25:1;;;34408:44:0;;-1:-1:-1;;;;;;34475:23:0;;;;;6378:18:1;;34475:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;34467:63;;;;-1:-1:-1;;;34467:63:0;;11580:2:1;34467:63:0;;;11562:21:1;11619:2;11599:18;;;11592:30;-1:-1:-1;;;11638:18:1;;;11631:43;11691:18;;34467:63:0;11552:163:1;34467:63:0;34562:26;;-1:-1:-1;;;34562:26:0;;34582:4;34562:26;;;5259:51:1;34545:14:0;;-1:-1:-1;;;;;34562:11:0;;;;;5232:18:1;;34562:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34545:43;-1:-1:-1;34620:38:0;34625:14;34641:16;34650:7;34545:43;34641:16;:::i;34620:38::-;34603:55;;34261:558;;;;;;34747:37;;-1:-1:-1;;;34747:37:0;;;;;6405:25:1;;;-1:-1:-1;;;;;34747:23:0;;;;;6378:18:1;;34747:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;34739:68;;;;-1:-1:-1;;;34739:68:0;;11580:2:1;34739:68:0;;;11562:21:1;11619:2;11599:18;;;11592:30;-1:-1:-1;;;11638:18:1;;;11631:43;11691:18;;34739:68:0;11552:163:1;34739:68:0;34880:55;-1:-1:-1;;;;;34880:28:0;;34909:9;34920:14;34880:28;:55::i;:::-;34953:67;;;-1:-1:-1;;;;;6129:32:1;;;6111:51;;6193:2;6178:18;;6171:34;;;6221:18;;;6214:34;;;34953:67:0;;;;;;6099:2:1;6084:18;34953:67:0;;;;;;;33430:1598;;;;;;;;:::o;10742:177::-;10852:58;;-1:-1:-1;;;;;5822:32:1;;10852:58:0;;;5804:51:1;5871:18;;;5864:34;;;10825:86:0;;10845:5;;-1:-1:-1;;;10875:23:0;5777:18:1;;10852:58:0;;;;-1:-1:-1;;10852:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10852:58:0;-1:-1:-1;;;;;;10852:58:0;;;;;;;;;;10825:19;:86::i;:::-;10742:177;;;:::o;14489:189::-;14572:39;-1:-1:-1;;;;;14572:26:0;;14599:8;14609:1;14572:26;:39::i;:::-;14622:48;-1:-1:-1;;;;;14622:26:0;;14649:8;-1:-1:-1;;14622:26:0;:48::i;20209:95::-;20253:7;20280:5;-1:-1:-1;;;;;20280:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20273:23;;20209:95;:::o;37449:222::-;37612:51;37646:7;37655;37612:33;:51::i;39342:402::-;39466:14;39498:20;39521:7;-1:-1:-1;;;;;39521:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39498:51;-1:-1:-1;39498:51:0;39702:18;:11;39716:4;39702:18;:::i;13176:761::-;13600:23;13626:69;13654:4;13626:69;;;;;;;;;;;;;;;;;13634:5;-1:-1:-1;;;;;13626:27:0;;;:69;;;;;:::i;:::-;13710:17;;13600:95;;-1:-1:-1;13710:21:0;13706:224;;13852:10;13841:30;;;;;;;;;;;;:::i;:::-;13833:85;;;;-1:-1:-1;;;13833:85:0;;12280:2:1;13833:85:0;;;12262:21:1;12319:2;12299:18;;;12292:30;12358:34;12338:18;;;12331:62;-1:-1:-1;;;12409:18:1;;;12402:40;12459:19;;13833:85:0;12252:232:1;11401:622:0;11771:10;;;11770:62;;-1:-1:-1;11787:39:0;;-1:-1:-1;;;11787:39:0;;11811:4;11787:39;;;5533:34:1;-1:-1:-1;;;;;5603:15:1;;;5583:18;;;5576:43;11787:15:0;;;;;5468:18:1;;11787:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;11770:62;11762:152;;;;-1:-1:-1;;;11762:152:0;;13749:2:1;11762:152:0;;;13731:21:1;13788:2;13768:18;;;13761:30;13827:34;13807:18;;;13800:62;-1:-1:-1;;;13878:18:1;;;13871:52;13940:19;;11762:152:0;13721:244:1;11762:152:0;11952:62;;-1:-1:-1;;;;;5822:32:1;;11952:62:0;;;5804:51:1;5871:18;;;5864:34;;;11925:90:0;;11945:5;;-1:-1:-1;;;11975:22:0;5777:18:1;;11952:62:0;5759:145:1;6342:195:0;6445:12;6477:52;6499:6;6507:4;6513:1;6516:12;6445;3791:20;;7638:60;;;;-1:-1:-1;;;7638:60:0;;11922:2:1;7638:60:0;;;11904:21:1;11961:2;11941:18;;;11934:30;12000:31;11980:18;;;11973:59;12049:18;;7638:60:0;11894:179:1;7638:60:0;7772:12;7786:23;7813:6;-1:-1:-1;;;;;7813:11:0;7833:5;7841:4;7813:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7771:75;;;;7864:52;7882:7;7891:10;7903:12;7864:17;:52::i;:::-;7857:59;7394:530;-1:-1:-1;;;;;;;7394:530:0:o;9934:742::-;10049:12;10078:7;10074:595;;;-1:-1:-1;10109:10:0;10102:17;;10074:595;10223:17;;:21;10219:439;;10486:10;10480:17;10547:15;10534:10;10530:2;10526:19;10519:44;10434:148;10629:12;10622:20;;-1:-1:-1;;;10622:20:0;;;;;;;;:::i;14:398:1:-;;;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;385:3;378:4;370;362:6;358:17;350:6;346:30;342:41;339:50;336:2;;;402:1;399;392:12;336:2;98:314;;;;;:::o;417:257::-;;529:2;517:9;508:7;504:23;500:32;497:2;;;550:6;542;535:22;497:2;594:9;581:23;613:31;638:5;613:31;:::i;679:261::-;;802:2;790:9;781:7;777:23;773:32;770:2;;;823:6;815;808:22;770:2;860:9;854:16;879:31;904:5;879:31;:::i;945:398::-;;;1074:2;1062:9;1053:7;1049:23;1045:32;1042:2;;;1095:6;1087;1080:22;1042:2;1139:9;1126:23;1158:31;1183:5;1158:31;:::i;:::-;1208:5;-1:-1:-1;1265:2:1;1250:18;;1237:32;1278:33;1237:32;1278:33;:::i;:::-;1330:7;1320:17;;;1032:311;;;;;:::o;1348:466::-;;;;1494:2;1482:9;1473:7;1469:23;1465:32;1462:2;;;1515:6;1507;1500:22;1462:2;1559:9;1546:23;1578:31;1603:5;1578:31;:::i;:::-;1628:5;-1:-1:-1;1685:2:1;1670:18;;1657:32;1698:33;1657:32;1698:33;:::i;:::-;1452:362;;1750:7;;-1:-1:-1;;;1804:2:1;1789:18;;;;1776:32;;1452:362::o;1819:602::-;;;;;1979:3;1967:9;1958:7;1954:23;1950:33;1947:2;;;2001:6;1993;1986:22;1947:2;2045:9;2032:23;2064:31;2089:5;2064:31;:::i;:::-;2114:5;-1:-1:-1;2171:2:1;2156:18;;2143:32;2184:33;2143:32;2184:33;:::i;:::-;2236:7;-1:-1:-1;2290:2:1;2275:18;;2262:32;;-1:-1:-1;2346:2:1;2331:18;;2318:32;2359:30;2318:32;2359:30;:::i;:::-;1937:484;;;;-1:-1:-1;1937:484:1;;-1:-1:-1;;1937:484:1:o;2426:671::-;;;;;;2603:3;2591:9;2582:7;2578:23;2574:33;2571:2;;;2625:6;2617;2610:22;2571:2;2669:9;2656:23;2688:31;2713:5;2688:31;:::i;:::-;2738:5;-1:-1:-1;2795:2:1;2780:18;;2767:32;2808:33;2767:32;2808:33;:::i;:::-;2860:7;-1:-1:-1;2914:2:1;2899:18;;2886:32;;-1:-1:-1;2965:2:1;2950:18;;2937:32;;-1:-1:-1;3021:3:1;3006:19;;2993:33;3035:30;2993:33;3035:30;:::i;:::-;3084:7;3074:17;;;2561:536;;;;;;;;:::o;3102:460::-;;;;3245:2;3233:9;3224:7;3220:23;3216:32;3213:2;;;3266:6;3258;3251:22;3213:2;3310:9;3297:23;3329:31;3354:5;3329:31;:::i;:::-;3379:5;-1:-1:-1;3431:2:1;3416:18;;3403:32;;-1:-1:-1;3487:2:1;3472:18;;3459:32;3500:30;3459:32;3500:30;:::i;:::-;3549:7;3539:17;;;3203:359;;;;;:::o;3567:803::-;;;;;3766:2;3754:9;3745:7;3741:23;3737:32;3734:2;;;3787:6;3779;3772:22;3734:2;3832:9;3819:23;3861:18;3902:2;3894:6;3891:14;3888:2;;;3923:6;3915;3908:22;3888:2;3967:70;4029:7;4020:6;4009:9;4005:22;3967:70;:::i;:::-;4056:8;;-1:-1:-1;3941:96:1;-1:-1:-1;4144:2:1;4129:18;;4116:32;;-1:-1:-1;4160:16:1;;;4157:2;;;4194:6;4186;4179:22;4157:2;;4238:72;4302:7;4291:8;4280:9;4276:24;4238:72;:::i;:::-;3724:646;;;;-1:-1:-1;4329:8:1;-1:-1:-1;;;;3724:646:1:o;4375:255::-;;4495:2;4483:9;4474:7;4470:23;4466:32;4463:2;;;4516:6;4508;4501:22;4463:2;4553:9;4547:16;4572:28;4594:5;4572:28;:::i;4635:194::-;;4758:2;4746:9;4737:7;4733:23;4729:32;4726:2;;;4779:6;4771;4764:22;4726:2;-1:-1:-1;4807:16:1;;4716:113;-1:-1:-1;4716:113:1:o;4834:274::-;;5001:6;4995:13;5017:53;5063:6;5058:3;5051:4;5043:6;5039:17;5017:53;:::i;:::-;5086:16;;;;;4971:137;-1:-1:-1;;4971:137:1:o;6663:383::-;;6812:2;6801:9;6794:21;6844:6;6838:13;6887:6;6882:2;6871:9;6867:18;6860:34;6903:66;6962:6;6957:2;6946:9;6942:18;6937:2;6929:6;6925:15;6903:66;:::i;:::-;7030:2;7009:15;-1:-1:-1;;7005:29:1;6990:45;;;;7037:2;6986:54;;6784:262;-1:-1:-1;;6784:262:1:o;9914:347::-;10116:2;10098:21;;;10155:2;10135:18;;;10128:30;10194:25;10189:2;10174:18;;10167:53;10252:2;10237:18;;10088:173::o;12489:355::-;12691:2;12673:21;;;12730:2;12710:18;;;12703:30;12769:33;12764:2;12749:18;;12742:61;12835:2;12820:18;;12663:181::o;14152:217::-;;14218:1;14208:2;;-1:-1:-1;;;14243:31:1;;14297:4;14294:1;14287:15;14325:4;14250:1;14315:15;14208:2;-1:-1:-1;14354:9:1;;14198:171::o;14374:168::-;;14480:1;14476;14472:6;14468:14;14465:1;14462:21;14457:1;14450:9;14443:17;14439:45;14436:2;;;14487:18;;:::i;:::-;-1:-1:-1;14527:9:1;;14426:116::o;14547:125::-;;14615:1;14612;14609:8;14606:2;;;14620:18;;:::i;:::-;-1:-1:-1;14657:9:1;;14596:76::o;14677:258::-;14749:1;14759:113;14773:6;14770:1;14767:13;14759:113;;;14849:11;;;14843:18;14830:11;;;14823:39;14795:2;14788:10;14759:113;;;14890:6;14887:1;14884:13;14881:2;;;14925:1;14916:6;14911:3;14907:16;14900:27;14881:2;;14730:205;;;:::o;14940:135::-;;-1:-1:-1;;15000:17:1;;14997:2;;;15020:18;;:::i;:::-;-1:-1:-1;15067:1:1;15056:13;;14987:88::o;15080:127::-;15141:10;15136:3;15132:20;15129:1;15122:31;15172:4;15169:1;15162:15;15196:4;15193:1;15186:15;15212:131;-1:-1:-1;;;;;15287:31:1;;15277:42;;15267:2;;15333:1;15330;15323:12;15267:2;15257:86;:::o;15348:118::-;15434:5;15427:13;15420:21;15413:5;15410:32;15400:2;;15456:1;15453;15446:12
Swarm Source
ipfs://2951d24d53bcf0af4ff0fceb61f2cc0f7cd7e24e06205b3f2899e2a0e3cd256e
Loading...
Loading
Loading...
Loading
OVERVIEW
Connects GUSD Feeder Pool's mAsset (mUSD) to Iron Bank's lending markets. This implementation can claim Iron Bank's reward token CREAM.Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.990529 | 2,641.9089 | $2,616.89 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.