More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PAaveIntegration
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-12 */ pragma solidity 0.8.2; interface ILendingPoolAddressesProviderV2 { /** * @notice Get the current address for Aave LendingPool * @dev Lending pool is the core contract on which to call deposit */ function getLendingPool() external view returns (address); } interface IAaveATokenV2 { /** * @notice returns the current total aToken balance of _user all interest collected included. * To obtain the user asset principal balance with interests excluded , ERC20 non-standard * method principalBalanceOf() can be used. */ function balanceOf(address _user) external view returns(uint256); } interface IAaveLendingPoolV2 { /** * @dev deposits The underlying asset into the reserve. A corresponding amount of the overlying asset (aTokens) * is minted. * @param reserve the address of the reserve * @param amount the amount to be deposited * @param referralCode integrators are assigned a referral code and can potentially receive rewards. **/ function deposit( address reserve, uint256 amount, address onBehalfOf, uint16 referralCode ) external; /** * @dev withdraws the assets of user. * @param reserve the address of the reserve * @param amount the underlying amount to be redeemed * @param to address that will receive the underlying **/ function withdraw( address reserve, uint256 amount, address to ) external; } /** * @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"); } } } 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; } } contract AaveV2Integration is AbstractIntegration { using SafeERC20 for IERC20; // Core address for the given platform */ address public immutable platformAddress; address public immutable rewardToken; event RewardTokenApproved(address rewardToken, address account); /** * @param _nexus Address of the Nexus * @param _lp Address of LP * @param _platformAddress Generic platform address * @param _rewardToken Reward token, if any */ constructor( address _nexus, address _lp, address _platformAddress, address _rewardToken ) AbstractIntegration(_nexus, _lp) { require(_platformAddress != address(0), "Invalid platform address"); platformAddress = _platformAddress; 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 cannot be zero"); MassetHelpers.safeInfiniteApprove(rewardToken, liquidator); emit RewardTokenApproved(rewardToken, liquidator); } /*************************************** CORE ****************************************/ /** * @dev Deposit a quantity of bAsset into the platform. Credited aTokens * 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 _hasTxFee Is the bAsset known to have a tx fee? * @return quantityDeposited Quantity of bAsset that entered the platform */ function deposit( address _bAsset, uint256 _amount, bool _hasTxFee ) external override onlyLP nonReentrant returns (uint256 quantityDeposited) { require(_amount > 0, "Must deposit something"); IAaveATokenV2 aToken = _getATokenFor(_bAsset); quantityDeposited = _amount; if (_hasTxFee) { // If we charge a fee, account for it uint256 prevBal = _checkBalance(aToken); _getLendingPool().deposit(_bAsset, _amount, address(this), 36); uint256 newBal = _checkBalance(aToken); quantityDeposited = _min(quantityDeposited, newBal - prevBal); } else { _getLendingPool().deposit(_bAsset, _amount, address(this), 36); } emit Deposit(_bAsset, address(aToken), quantityDeposited); } /** * @dev Withdraw a quantity of bAsset from the platform * @param _receiver Address to which the 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 the platform * @param _receiver Address to which the bAsset should be sent * @param _bAsset Address of the bAsset * @param _amount Units of bAsset to send to recipient * @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); } /** @dev Withdraws _totalAmount from the lending pool, sending _amount to user */ function _withdraw( address _receiver, address _bAsset, uint256 _amount, uint256 _totalAmount, bool _hasTxFee ) internal { require(_totalAmount > 0, "Must withdraw something"); IAaveATokenV2 aToken = _getATokenFor(_bAsset); if (_hasTxFee) { require(_amount == _totalAmount, "Cache inactive for assets with fee"); _getLendingPool().withdraw(_bAsset, _amount, _receiver); } else { _getLendingPool().withdraw(_bAsset, _totalAmount, address(this)); // Send redeemed bAsset to the receiver IERC20(_bAsset).safeTransfer(_receiver, _amount); } emit PlatformWithdrawal(_bAsset, address(aToken), _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 * Aave gradually increases the balances of all aToken holders, as the interest grows * @param _bAsset Address of the bAsset * @return balance Total value of the bAsset in the platform */ function checkBalance(address _bAsset) external override returns (uint256 balance) { // balance is always with token aToken decimals IAaveATokenV2 aToken = _getATokenFor(_bAsset); return _checkBalance(aToken); } /*************************************** APPROVALS ****************************************/ /** * @dev Internal method to respond to the addition of new bAsset / pTokens * We need to approve the Aave lending pool core conrtact and give it permission * to spend the bAsset * @param _bAsset Address of the bAsset to approve */ function _abstractSetPToken( address _bAsset, address /*_pToken*/ ) internal override { address lendingPool = address(_getLendingPool()); // approve the pool to spend the bAsset MassetHelpers.safeInfiniteApprove(_bAsset, lendingPool); } /*************************************** HELPERS ****************************************/ /** * @dev Get the current address of the Aave lending pool, which is the gateway to * depositing. * @return Current lending pool implementation */ function _getLendingPool() internal view returns (IAaveLendingPoolV2) { address lendingPool = ILendingPoolAddressesProviderV2(platformAddress).getLendingPool(); require(lendingPool != address(0), "Lending pool does not exist"); return IAaveLendingPoolV2(lendingPool); } /** * @dev Get the pToken wrapped in the IAaveAToken interface for this bAsset, to use * for withdrawing or balance checking. Fails if the pToken doesn't exist in our mappings. * @param _bAsset Address of the bAsset * @return aToken Corresponding to this bAsset */ function _getATokenFor(address _bAsset) internal view returns (IAaveATokenV2) { address aToken = bAssetToPToken[_bAsset]; require(aToken != address(0), "aToken does not exist"); return IAaveATokenV2(aToken); } /** * @dev Get the total bAsset value held in the platform * @param _aToken aToken for which to check balance * @return balance Total value of the bAsset in the platform */ function _checkBalance(IAaveATokenV2 _aToken) internal view returns (uint256 balance) { return _aToken.balanceOf(address(this)); } } interface IAaveIncentivesController { /** * @dev Claims reward for an user, on all the assets of the lending pool, accumulating the pending rewards * @param amount Amount of rewards to claim * @param to Address that will be receiving the rewards * @return Rewards claimed **/ function claimRewards( address[] calldata assets, uint256 amount, address to ) external returns (uint256); /** * @dev Returns the total of rewards of an user, already accrued + not yet accrued * @param user The address of the user * @return The rewards **/ function getRewardsBalance(address[] calldata assets, address user) external view returns (uint256); /** * @dev returns the unclaimed rewards of the user * @param user the address of the user * @return the unclaimed user rewards */ function getUserUnclaimedRewards(address user) external view returns (uint256); } // SPDX-License-Identifier: GPL-3.0-or-later /** * @title PAaveIntegration * @author mStable * @notice A simple connection to deposit and withdraw bAssets from Aave on Polygon * @dev VERSION: 1.0 * DATE: 2020-16-11 */ contract PAaveIntegration is AaveV2Integration { event RewardsClaimed(address[] assets, uint256 amount); IAaveIncentivesController public immutable rewardController; /** * @param _nexus Address of the Nexus * @param _lp Address of LP * @param _platformAddress Generic platform address * @param _rewardToken Reward token, if any * @param _rewardController AaveIncentivesController */ constructor( address _nexus, address _lp, address _platformAddress, address _rewardToken, address _rewardController ) AaveV2Integration(_nexus, _lp, _platformAddress, _rewardToken) { require(_rewardController != address(0), "Invalid controller address"); rewardController = IAaveIncentivesController(_rewardController); } /** * @dev Claims outstanding rewards from market */ function claimRewards() external { uint256 len = bAssetsMapped.length; address[] memory pTokens = new address[](len); for (uint256 i = 0; i < len; i++) { pTokens[i] = bAssetToPToken[bAssetsMapped[i]]; } uint256 rewards = rewardController.claimRewards(pTokens, type(uint256).max, address(this)); emit RewardsClaimed(pTokens, rewards); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nexus","type":"address"},{"internalType":"address","name":"_lp","type":"address"},{"internalType":"address","name":"_platformAddress","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_rewardController","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":"assets","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","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":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_hasTxFee","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":"platformAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardController","outputs":[{"internalType":"contract IAaveIncentivesController","name":"","type":"address"}],"stateMutability":"view","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
6101206040523480156200001257600080fd5b5060405162001f0838038062001f0883398101604081905262000035916200020e565b848484848383816001600160a01b038116620000985760405162461bcd60e51b815260206004820152601560248201527f4e657875732061646472657373206973207a65726f000000000000000000000060448201526064015b60405180910390fd5b60601b6001600160601b031916608052600180556001600160a01b038116620000f95760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204c50206164647265737360701b60448201526064016200008f565b60601b6001600160601b03191660a052506001600160a01b038216620001625760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420706c6174666f726d2061646472657373000000000000000060448201526064016200008f565b6001600160601b0319606092831b811660c052911b1660e05250506001600160a01b038116620001d55760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6e74726f6c6c6572206164647265737300000000000060448201526064016200008f565b60601b6001600160601b03191661010052506200027d92505050565b80516001600160a01b03811681146200020957600080fd5b919050565b600080600080600060a0868803121562000226578081fd5b6200023186620001f1565b94506200024160208701620001f1565b93506200025160408701620001f1565b92506200026160608701620001f1565b91506200027160808701620001f1565b90509295509295909350565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c611bf162000317600039600081816101a901526103da01526000818161028601528181610c470152610c7a0152600081816102570152610f880152600081816101e3015281816104b4015281816108b2015281816109390152610aa101526000818161020a01528181610b5e015261132e0152611bf16000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063934785b711610097578063c89fc72f11610066578063c89fc72f1461023f578063dbe55e5614610252578063e729645414610279578063f7c618c114610281576100f5565b8063934785b7146101cb5780639b4dc8cc146101de578063a3f5c1d214610205578063a4e285951461022c576100f5565b80635f515226116100d35780635f5152261461013d57806371c465851461015057806373cf25f8146101915780638cc5ce99146101a4576100f5565b80630ed57b3a146100fa578063372500ab1461010f5780633edd112814610117575b600080fd5b61010d6101083660046117c2565b6102a8565b005b61010d6102be565b61012a6101253660046118ea565b6104a7565b6040519081526020015b60405180910390f35b61012a61014b36600461178a565b6106f7565b61017961015e36600461178a565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610134565b61010d61019f36600461192b565b610715565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b61010d6101d936600461183a565b6108a7565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b61010d61023a3660046117fa565b61092e565b61010d61024d36600461188c565b610a96565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b61010d610b1e565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b6102b0610cd2565b6102ba8282610d3c565b5050565b60035460008167ffffffffffffffff8111156102ea57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610313578160200160208202803683370190505b50905060005b828110156103bf57600260006003838154811061034657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054835191169083908390811061039557634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806103b781611b64565b915050610319565b50604051633111e7b360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633111e7b390610415908590600019903090600401611a49565b602060405180830381600087803b15801561042f57600080fd5b505af1158015610443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046791906119b0565b90507fdfcc08fd436cd72ca789d668ae3ee67528136f98c501b1b51796de133fe3bf7a828260405161049a929190611a27565b60405180910390a1505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104fa5760405162461bcd60e51b81526004016104f190611aaf565b60405180910390fd5b6002600154141561051d5760405162461bcd60e51b81526004016104f190611ae6565b6002600155826105685760405162461bcd60e51b81526020600482015260166024820152754d757374206465706f73697420736f6d657468696e6760501b60448201526064016104f1565b600061057385610ea1565b9050839150821561062c57600061058982610f09565b9050610593610f83565b60405163e8eda9df60e01b81526001600160a01b03888116600483015260248281018990523060448401526064830152919091169063e8eda9df90608401600060405180830381600087803b1580156105eb57600080fd5b505af11580156105ff573d6000803e3d6000fd5b50505050600061060e83610f09565b90506106238461061e8484611b1d565b611074565b935050506106a5565b610634610f83565b60405163e8eda9df60e01b81526001600160a01b03878116600483015260248281018890523060448401526064830152919091169063e8eda9df90608401600060405180830381600087803b15801561068c57600080fd5b505af11580156106a0573d6000803e3d6000fd5b505050505b604080516001600160a01b038381168252602082018590528716917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62910160405180910390a250600180559392505050565b60008061070383610ea1565b905061070e81610f09565b9392505050565b600054610100900460ff168061072e575060005460ff16155b6107915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104f1565b600054610100900460ff161580156107bc576000805460ff1961ff0019909116610100171660011790555b838281146107fd5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b60448201526064016104f1565b60005b8181101561088c5761087a87878381811061082b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610840919061178a565b86868481811061086057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610875919061178a565b610d3c565b8061088481611b64565b915050610800565b505080156108a0576000805461ff00191690555b5050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ef5760405162461bcd60e51b81526004016104f190611aaf565b600260015414156109125760405162461bcd60e51b81526004016104f190611ae6565b60026001556109248484848085611089565b5050600180555050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109765760405162461bcd60e51b81526004016104f190611aaf565b600260015414156109995760405162461bcd60e51b81526004016104f190611ae6565b6002600155806109e55760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b60448201526064016104f1565b6001600160a01b038316610a345760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081cdc1958da599e481c9958da5c1a595b9d60521b60448201526064016104f1565b610a486001600160a01b0383168483611297565b6040805160008152602081018390526001600160a01b038416917f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398910160405180910390a250506001805550565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ade5760405162461bcd60e51b81526004016104f190611aaf565b60026001541415610b015760405162461bcd60e51b81526004016104f190611ae6565b6002600155610b138585858585611089565b505060018055505050565b610b26610cd2565b6040516385acd64160e01b81527f1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d460048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906385acd6419060240160206040518083038186803b158015610ba857600080fd5b505afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be091906117a6565b90506001600160a01b038116610c425760405162461bcd60e51b815260206004820152602160248201527f4c697175696461746f7220616464726573732063616e6e6f74206265207a65726044820152606f60f81b60648201526084016104f1565b610c6c7f0000000000000000000000000000000000000000000000000000000000000000826112ff565b604080516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081168252831660208201527f71b4effce66e58c9e4ad29e468e7100f7e8b5d106381fd905a25eee3ea1b6a93910160405180910390a150565b610cda61132a565b6001600160a01b0316336001600160a01b031614610d3a5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f722063616e20657865637574650000000000000060448201526064016104f1565b565b6001600160a01b038281166000908152600260205260409020541615610d995760405162461bcd60e51b81526020600482015260126024820152711c151bdad95b88185b1c9958591e481cd95d60721b60448201526064016104f1565b6001600160a01b03821615801590610db957506001600160a01b03811615155b610df95760405162461bcd60e51b8152602060048201526011602482015270496e76616c69642061646472657373657360781b60448201526064016104f1565b6001600160a01b03828116600081815260026020908152604080832080549587166001600160a01b031996871681179091556003805460018101825594527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180549095168417909455925190815290917fef6485b84315f9b1483beffa32aae9a0596890395e3d7521f1c5fbb51790e765910160405180910390a26102ba82826113bd565b6001600160a01b0380821660009081526002602052604081205490911680610f035760405162461bcd60e51b815260206004820152601560248201527418551bdad95b88191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016104f1565b92915050565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0391906119b0565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fdf57600080fd5b505afa158015610ff3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101791906117a6565b90506001600160a01b03811661106f5760405162461bcd60e51b815260206004820152601b60248201527f4c656e64696e6720706f6f6c20646f6573206e6f74206578697374000000000060448201526064016104f1565b905090565b6000818311611083578261070e565b50919050565b600082116110d35760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b60448201526064016104f1565b60006110de85610ea1565b905081156111b9578284146111405760405162461bcd60e51b815260206004820152602260248201527f436163686520696e61637469766520666f722061737365747320776974682066604482015261656560f01b60648201526084016104f1565b611148610f83565b604051631a4ca37b60e21b81526001600160a01b03878116600483015260248201879052888116604483015291909116906369328dec90606401600060405180830381600087803b15801561119c57600080fd5b505af11580156111b0573d6000803e3d6000fd5b50505050611240565b6111c1610f83565b604051631a4ca37b60e21b81526001600160a01b0387811660048301526024820186905230604483015291909116906369328dec90606401600060405180830381600087803b15801561121357600080fd5b505af1158015611227573d6000803e3d6000fd5b50611240925050506001600160a01b0386168786611297565b604080516001600160a01b03838116825260208201869052918101869052908616907fb925ac01b9c34cc156a17a1e3da718f364df34eec9d0c9dc4e59c2bb1e7ba54b9060600160405180910390a2505050505050565b6040516001600160a01b0383166024820152604481018290526112fa90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526113d3565b505050565b6113146001600160a01b0383168260006114a5565b6102ba6001600160a01b038316826000196114a5565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561138557600080fd5b505afa158015611399573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106f91906117a6565b60006113c7610f83565b90506112fa83826112ff565b6000611428826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115c99092919063ffffffff16565b8051909150156112fa57808060200190518101906114469190611994565b6112fa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104f1565b80158061152e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c91906119b0565b155b6115995760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016104f1565b6040516001600160a01b0383166024820152604481018290526112fa90849063095ea7b360e01b906064016112c3565b60606115d884846000856115e0565b949350505050565b6060824710156116415760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104f1565b843b61168f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104f1565b600080866001600160a01b031685876040516116ab9190611a0b565b60006040518083038185875af1925050503d80600081146116e8576040519150601f19603f3d011682016040523d82523d6000602084013e6116ed565b606091505b50915091506116fd828286611708565b979650505050505050565b6060831561171757508161070e565b8251156117275782518084602001fd5b8160405162461bcd60e51b81526004016104f19190611a7c565b60008083601f840112611752578182fd5b50813567ffffffffffffffff811115611769578182fd5b602083019150836020808302850101111561178357600080fd5b9250929050565b60006020828403121561179b578081fd5b813561070e81611b95565b6000602082840312156117b7578081fd5b815161070e81611b95565b600080604083850312156117d4578081fd5b82356117df81611b95565b915060208301356117ef81611b95565b809150509250929050565b60008060006060848603121561180e578081fd5b833561181981611b95565b9250602084013561182981611b95565b929592945050506040919091013590565b6000806000806080858703121561184f578081fd5b843561185a81611b95565b9350602085013561186a81611b95565b925060408501359150606085013561188181611bad565b939692955090935050565b600080600080600060a086880312156118a3578081fd5b85356118ae81611b95565b945060208601356118be81611b95565b9350604086013592506060860135915060808601356118dc81611bad565b809150509295509295909350565b6000806000606084860312156118fe578283fd5b833561190981611b95565b925060208401359150604084013561192081611bad565b809150509250925092565b60008060008060408587031215611940578384fd5b843567ffffffffffffffff80821115611957578586fd5b61196388838901611741565b9096509450602087013591508082111561197b578384fd5b5061198887828801611741565b95989497509550505050565b6000602082840312156119a5578081fd5b815161070e81611bad565b6000602082840312156119c1578081fd5b5051919050565b6000815180845260208085019450808401835b83811015611a005781516001600160a01b0316875295820195908201906001016119db565b509495945050505050565b60008251611a1d818460208701611b34565b9190910192915050565b600060408252611a3a60408301856119c8565b90508260208301529392505050565b600060608252611a5c60608301866119c8565b6020830194909452506001600160a01b0391909116604090910152919050565b6000602082528251806020840152611a9b816040850160208701611b34565b601f01601f19169190910160400192915050565b60208082526017908201527f4f6e6c7920746865204c502063616e2065786563757465000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082821015611b2f57611b2f611b7f565b500390565b60005b83811015611b4f578181015183820152602001611b37565b83811115611b5e576000848401525b50505050565b6000600019821415611b7857611b78611b7f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611baa57600080fd5b50565b8015158114611baa57600080fdfea2646970667358221220149234c706eeb7cacdb0d17c2d651b3f82a23e2be1e6dcd40526e236dfa198a064736f6c63430008020033000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb3000000000000000000000000945facb997494cc2570096c74b5f66a3507330a1000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c50000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b5
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063934785b711610097578063c89fc72f11610066578063c89fc72f1461023f578063dbe55e5614610252578063e729645414610279578063f7c618c114610281576100f5565b8063934785b7146101cb5780639b4dc8cc146101de578063a3f5c1d214610205578063a4e285951461022c576100f5565b80635f515226116100d35780635f5152261461013d57806371c465851461015057806373cf25f8146101915780638cc5ce99146101a4576100f5565b80630ed57b3a146100fa578063372500ab1461010f5780633edd112814610117575b600080fd5b61010d6101083660046117c2565b6102a8565b005b61010d6102be565b61012a6101253660046118ea565b6104a7565b6040519081526020015b60405180910390f35b61012a61014b36600461178a565b6106f7565b61017961015e36600461178a565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610134565b61010d61019f36600461192b565b610715565b6101797f000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b581565b61010d6101d936600461183a565b6108a7565b6101797f000000000000000000000000945facb997494cc2570096c74b5f66a3507330a181565b6101797f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb381565b61010d61023a3660046117fa565b61092e565b61010d61024d36600461188c565b610a96565b6101797f000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c581565b61010d610b1e565b6101797f0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f581565b6102b0610cd2565b6102ba8282610d3c565b5050565b60035460008167ffffffffffffffff8111156102ea57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610313578160200160208202803683370190505b50905060005b828110156103bf57600260006003838154811061034657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054835191169083908390811061039557634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806103b781611b64565b915050610319565b50604051633111e7b360e01b81526000906001600160a01b037f000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b51690633111e7b390610415908590600019903090600401611a49565b602060405180830381600087803b15801561042f57600080fd5b505af1158015610443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046791906119b0565b90507fdfcc08fd436cd72ca789d668ae3ee67528136f98c501b1b51796de133fe3bf7a828260405161049a929190611a27565b60405180910390a1505050565b6000336001600160a01b037f000000000000000000000000945facb997494cc2570096c74b5f66a3507330a116146104fa5760405162461bcd60e51b81526004016104f190611aaf565b60405180910390fd5b6002600154141561051d5760405162461bcd60e51b81526004016104f190611ae6565b6002600155826105685760405162461bcd60e51b81526020600482015260166024820152754d757374206465706f73697420736f6d657468696e6760501b60448201526064016104f1565b600061057385610ea1565b9050839150821561062c57600061058982610f09565b9050610593610f83565b60405163e8eda9df60e01b81526001600160a01b03888116600483015260248281018990523060448401526064830152919091169063e8eda9df90608401600060405180830381600087803b1580156105eb57600080fd5b505af11580156105ff573d6000803e3d6000fd5b50505050600061060e83610f09565b90506106238461061e8484611b1d565b611074565b935050506106a5565b610634610f83565b60405163e8eda9df60e01b81526001600160a01b03878116600483015260248281018890523060448401526064830152919091169063e8eda9df90608401600060405180830381600087803b15801561068c57600080fd5b505af11580156106a0573d6000803e3d6000fd5b505050505b604080516001600160a01b038381168252602082018590528716917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62910160405180910390a250600180559392505050565b60008061070383610ea1565b905061070e81610f09565b9392505050565b600054610100900460ff168061072e575060005460ff16155b6107915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104f1565b600054610100900460ff161580156107bc576000805460ff1961ff0019909116610100171660011790555b838281146107fd5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b60448201526064016104f1565b60005b8181101561088c5761087a87878381811061082b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610840919061178a565b86868481811061086057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610875919061178a565b610d3c565b8061088481611b64565b915050610800565b505080156108a0576000805461ff00191690555b5050505050565b336001600160a01b037f000000000000000000000000945facb997494cc2570096c74b5f66a3507330a116146108ef5760405162461bcd60e51b81526004016104f190611aaf565b600260015414156109125760405162461bcd60e51b81526004016104f190611ae6565b60026001556109248484848085611089565b5050600180555050565b336001600160a01b037f000000000000000000000000945facb997494cc2570096c74b5f66a3507330a116146109765760405162461bcd60e51b81526004016104f190611aaf565b600260015414156109995760405162461bcd60e51b81526004016104f190611ae6565b6002600155806109e55760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b60448201526064016104f1565b6001600160a01b038316610a345760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081cdc1958da599e481c9958da5c1a595b9d60521b60448201526064016104f1565b610a486001600160a01b0383168483611297565b6040805160008152602081018390526001600160a01b038416917f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398910160405180910390a250506001805550565b336001600160a01b037f000000000000000000000000945facb997494cc2570096c74b5f66a3507330a11614610ade5760405162461bcd60e51b81526004016104f190611aaf565b60026001541415610b015760405162461bcd60e51b81526004016104f190611ae6565b6002600155610b138585858585611089565b505060018055505050565b610b26610cd2565b6040516385acd64160e01b81527f1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d460048201526000907f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb36001600160a01b0316906385acd6419060240160206040518083038186803b158015610ba857600080fd5b505afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be091906117a6565b90506001600160a01b038116610c425760405162461bcd60e51b815260206004820152602160248201527f4c697175696461746f7220616464726573732063616e6e6f74206265207a65726044820152606f60f81b60648201526084016104f1565b610c6c7f0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5826112ff565b604080516001600160a01b037f0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f581168252831660208201527f71b4effce66e58c9e4ad29e468e7100f7e8b5d106381fd905a25eee3ea1b6a93910160405180910390a150565b610cda61132a565b6001600160a01b0316336001600160a01b031614610d3a5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f722063616e20657865637574650000000000000060448201526064016104f1565b565b6001600160a01b038281166000908152600260205260409020541615610d995760405162461bcd60e51b81526020600482015260126024820152711c151bdad95b88185b1c9958591e481cd95d60721b60448201526064016104f1565b6001600160a01b03821615801590610db957506001600160a01b03811615155b610df95760405162461bcd60e51b8152602060048201526011602482015270496e76616c69642061646472657373657360781b60448201526064016104f1565b6001600160a01b03828116600081815260026020908152604080832080549587166001600160a01b031996871681179091556003805460018101825594527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180549095168417909455925190815290917fef6485b84315f9b1483beffa32aae9a0596890395e3d7521f1c5fbb51790e765910160405180910390a26102ba82826113bd565b6001600160a01b0380821660009081526002602052604081205490911680610f035760405162461bcd60e51b815260206004820152601560248201527418551bdad95b88191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016104f1565b92915050565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0391906119b0565b6000807f000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fdf57600080fd5b505afa158015610ff3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101791906117a6565b90506001600160a01b03811661106f5760405162461bcd60e51b815260206004820152601b60248201527f4c656e64696e6720706f6f6c20646f6573206e6f74206578697374000000000060448201526064016104f1565b905090565b6000818311611083578261070e565b50919050565b600082116110d35760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b60448201526064016104f1565b60006110de85610ea1565b905081156111b9578284146111405760405162461bcd60e51b815260206004820152602260248201527f436163686520696e61637469766520666f722061737365747320776974682066604482015261656560f01b60648201526084016104f1565b611148610f83565b604051631a4ca37b60e21b81526001600160a01b03878116600483015260248201879052888116604483015291909116906369328dec90606401600060405180830381600087803b15801561119c57600080fd5b505af11580156111b0573d6000803e3d6000fd5b50505050611240565b6111c1610f83565b604051631a4ca37b60e21b81526001600160a01b0387811660048301526024820186905230604483015291909116906369328dec90606401600060405180830381600087803b15801561121357600080fd5b505af1158015611227573d6000803e3d6000fd5b50611240925050506001600160a01b0386168786611297565b604080516001600160a01b03838116825260208201869052918101869052908616907fb925ac01b9c34cc156a17a1e3da718f364df34eec9d0c9dc4e59c2bb1e7ba54b9060600160405180910390a2505050505050565b6040516001600160a01b0383166024820152604481018290526112fa90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526113d3565b505050565b6113146001600160a01b0383168260006114a5565b6102ba6001600160a01b038316826000196114a5565b60007f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb36001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561138557600080fd5b505afa158015611399573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106f91906117a6565b60006113c7610f83565b90506112fa83826112ff565b6000611428826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115c99092919063ffffffff16565b8051909150156112fa57808060200190518101906114469190611994565b6112fa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104f1565b80158061152e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c91906119b0565b155b6115995760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016104f1565b6040516001600160a01b0383166024820152604481018290526112fa90849063095ea7b360e01b906064016112c3565b60606115d884846000856115e0565b949350505050565b6060824710156116415760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104f1565b843b61168f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104f1565b600080866001600160a01b031685876040516116ab9190611a0b565b60006040518083038185875af1925050503d80600081146116e8576040519150601f19603f3d011682016040523d82523d6000602084013e6116ed565b606091505b50915091506116fd828286611708565b979650505050505050565b6060831561171757508161070e565b8251156117275782518084602001fd5b8160405162461bcd60e51b81526004016104f19190611a7c565b60008083601f840112611752578182fd5b50813567ffffffffffffffff811115611769578182fd5b602083019150836020808302850101111561178357600080fd5b9250929050565b60006020828403121561179b578081fd5b813561070e81611b95565b6000602082840312156117b7578081fd5b815161070e81611b95565b600080604083850312156117d4578081fd5b82356117df81611b95565b915060208301356117ef81611b95565b809150509250929050565b60008060006060848603121561180e578081fd5b833561181981611b95565b9250602084013561182981611b95565b929592945050506040919091013590565b6000806000806080858703121561184f578081fd5b843561185a81611b95565b9350602085013561186a81611b95565b925060408501359150606085013561188181611bad565b939692955090935050565b600080600080600060a086880312156118a3578081fd5b85356118ae81611b95565b945060208601356118be81611b95565b9350604086013592506060860135915060808601356118dc81611bad565b809150509295509295909350565b6000806000606084860312156118fe578283fd5b833561190981611b95565b925060208401359150604084013561192081611bad565b809150509250925092565b60008060008060408587031215611940578384fd5b843567ffffffffffffffff80821115611957578586fd5b61196388838901611741565b9096509450602087013591508082111561197b578384fd5b5061198887828801611741565b95989497509550505050565b6000602082840312156119a5578081fd5b815161070e81611bad565b6000602082840312156119c1578081fd5b5051919050565b6000815180845260208085019450808401835b83811015611a005781516001600160a01b0316875295820195908201906001016119db565b509495945050505050565b60008251611a1d818460208701611b34565b9190910192915050565b600060408252611a3a60408301856119c8565b90508260208301529392505050565b600060608252611a5c60608301866119c8565b6020830194909452506001600160a01b0391909116604090910152919050565b6000602082528251806020840152611a9b816040850160208701611b34565b601f01601f19169190910160400192915050565b60208082526017908201527f4f6e6c7920746865204c502063616e2065786563757465000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082821015611b2f57611b2f611b7f565b500390565b60005b83811015611b4f578181015183820152602001611b37565b83811115611b5e576000848401525b50505050565b6000600019821415611b7857611b78611b7f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611baa57600080fd5b50565b8015158114611baa57600080fdfea2646970667358221220149234c706eeb7cacdb0d17c2d651b3f82a23e2be1e6dcd40526e236dfa198a064736f6c63430008020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb3000000000000000000000000945facb997494cc2570096c74b5f66a3507330a1000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c50000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b5
-----Decoded View---------------
Arg [0] : _nexus (address): 0xAFcE80b19A8cE13DEc0739a1aaB7A028d6845Eb3
Arg [1] : _lp (address): 0x945Facb997494CC2570096c74b5F66A3507330a1
Arg [2] : _platformAddress (address): 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5
Arg [3] : _rewardToken (address): 0x4da27a545c0c5B758a6BA100e3a049001de870f5
Arg [4] : _rewardController (address): 0xd784927Ff2f95ba542BfC824c8a8a98F3495f6b5
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb3
Arg [1] : 000000000000000000000000945facb997494cc2570096c74b5f66a3507330a1
Arg [2] : 000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c5
Arg [3] : 0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5
Arg [4] : 000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b5
Deployed Bytecode Sourcemap
38182:1360:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27132:136;;;;;;:::i;:::-;;:::i;:::-;;39130:409;;;:::i;30368:853::-;;;;;;:::i;:::-;;:::i;:::-;;;8497:25:1;;;8485:2;8470:18;30368:853:0;;;;;;;;34424:243;;;;;;:::i;:::-;;:::i;25665:58::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;25665:58:0;;;;;;-1:-1:-1;;;;;5745:32:1;;;5727:51;;5715:2;5700:18;25665:58:0;5682:102:1;26186:342:0;;;;;;:::i;:::-;;:::i;38299:59::-;;;;;31555:245;;;;;;:::i;:::-;;:::i;25563:34::-;;;;;20638:29;;;;;33647:400;;;;;;:::i;:::-;;:::i;32214:281::-;;;;;;:::i;:::-;;:::i;28447:40::-;;;;;29383:346;;;:::i;28494:36::-;;;;;27132:136;21072:15;:13;:15::i;:::-;27225:35:::1;27243:7;27252;27225:17;:35::i;:::-;27132:136:::0;;:::o;39130:409::-;39188:13;:20;39174:11;39188:20;39246:18;;;;;;-1:-1:-1;;;39246:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39246:18:0;;39219:45;;39280:9;39275:106;39299:3;39295:1;:7;39275:106;;;39337:14;:32;39352:13;39366:1;39352:16;;;;;;-1:-1:-1;;;39352:16:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39352:16:0;;;39337:32;;;;;;;;;;;;;;;;39324:10;;39337:32;;;39324:7;;39332:1;;39324:10;;;;-1:-1:-1;;;39324:10:0;;;;;;;;;-1:-1:-1;;;;;39324:45:0;;;:10;;;;;;;;;;;:45;39304:3;;;;:::i;:::-;;;;39275:106;;;-1:-1:-1;39409:72:0;;-1:-1:-1;;;39409:72:0;;39391:15;;-1:-1:-1;;;;;39409:16:0;:29;;;;:72;;39439:7;;-1:-1:-1;;39448:17:0;39475:4;;39409:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39391:90;;39499:32;39514:7;39523;39499:32;;;;;;;:::i;:::-;;;;;;;;39130:409;;;:::o;30368:853::-;30516:25;26661:10;-1:-1:-1;;;;;26675:9:0;26661:23;;26653:59;;;;-1:-1:-1;;;26653:59:0;;;;;;;:::i;:::-;;;;;;;;;24064:1:::1;24661:7;;:19;;24653:63;;;;-1:-1:-1::0;;;24653:63:0::1;;;;;;;:::i;:::-;24064:1;24794:7;:18:::0;30562:11;30554:46:::2;;;::::0;-1:-1:-1;;;30554:46:0;;9587:2:1;30554:46:0::2;::::0;::::2;9569:21:1::0;9626:2;9606:18;;;9599:30;-1:-1:-1;;;9645:18:1;;;9638:52;9707:18;;30554:46:0::2;9559:172:1::0;30554:46:0::2;30613:20;30636:22;30650:7;30636:13;:22::i;:::-;30613:45;;30691:7;30671:27;;30715:9;30711:433;;;30792:15;30810:21;30824:6;30810:13;:21::i;:::-;30792:39;;30846:17;:15;:17::i;:::-;:62;::::0;-1:-1:-1;;;30846:62:0;;-1:-1:-1;;;;;7052:15:1;;;30846:62:0::2;::::0;::::2;7034:34:1::0;30905:2:0::2;7084:18:1::0;;;7077:34;;;30898:4:0::2;7127:18:1::0;;;7120:43;7179:18;;;7172:47;30846:25:0;;;::::2;::::0;::::2;::::0;6968:19:1;;30846:62:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;30923:14;30940:21;30954:6;30940:13;:21::i;:::-;30923:38:::0;-1:-1:-1;30996:41:0::2;31001:17:::0;31020:16:::2;31029:7:::0;30923:38;31020:16:::2;:::i;:::-;30996:4;:41::i;:::-;30976:61;;30711:433;;;;;31070:17;:15;:17::i;:::-;:62;::::0;-1:-1:-1;;;31070:62:0;;-1:-1:-1;;;;;7052:15:1;;;31070:62:0::2;::::0;::::2;7034:34:1::0;31129:2:0::2;7084:18:1::0;;;7077:34;;;31122:4:0::2;7127:18:1::0;;;7120:43;7179:18;;;7172:47;31070:25:0;;;::::2;::::0;::::2;::::0;6968:19:1;;31070:62:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;30711:433;31161:52;::::0;;-1:-1:-1;;;;;6290:32:1;;;6272:51;;6354:2;6339:18;;6332:34;;;31161:52:0;::::2;::::0;::::2;::::0;6245:18:1;31161:52:0::2;;;;;;;-1:-1:-1::0;24020:1:0::1;24973:22:::0;;30368:853;;-1:-1:-1;;;30368:853:0:o;34424:243::-;34490:15;34575:20;34598:22;34612:7;34598:13;:22::i;:::-;34575:45;;34638:21;34652:6;34638:13;:21::i;:::-;34631:28;34424:243;-1:-1:-1;;;34424:243:0:o;26186:342::-;17947:13;;;;;;;;:30;;-1:-1:-1;17965:12:0;;;;17964:13;17947:30;17939:89;;;;-1:-1:-1;;;17939:89:0;;12853:2:1;17939:89:0;;;12835:21:1;12892:2;12872:18;;;12865:30;12931:34;12911:18;;;12904:62;-1:-1:-1;;;12982:18:1;;;12975:44;13036:19;;17939:89:0;12825:236:1;17939:89:0;18041:19;18064:13;;;;;;18063:14;18088:101;;;;18123:13;:20;;-1:-1:-1;;;;18123:20:0;;;;;18158:19;18139:4;18158:19;;;18088:101;26331:8;26365:22;;::::1;26357:49;;;::::0;-1:-1:-1;;;26357:49:0;;10696:2:1;26357:49:0::1;::::0;::::1;10678:21:1::0;10735:2;10715:18;;;10708:30;-1:-1:-1;;;10754:18:1;;;10747:44;10808:18;;26357:49:0::1;10668:164:1::0;26357:49:0::1;26422:9;26417:104;26441:3;26437:1;:7;26417:104;;;26466:43;26484:8;;26493:1;26484:11;;;;;-1:-1:-1::0;;;26484:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26497:8;;26506:1;26497:11;;;;;-1:-1:-1::0;;;26497:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26466:17;:43::i;:::-;26446:3:::0;::::1;::::0;::::1;:::i;:::-;;;;26417:104;;;;18201:1;18219:14:::0;18215:68;;;18266:5;18250:21;;-1:-1:-1;;18250:21:0;;;18215:68;26186:342;;;;;:::o;31555:245::-;26661:10;-1:-1:-1;;;;;26675:9:0;26661:23;;26653:59;;;;-1:-1:-1;;;26653:59:0;;;;;;;:::i;:::-;24064:1:::1;24661:7;;:19;;24653:63;;;;-1:-1:-1::0;;;24653:63:0::1;;;;;;;:::i;:::-;24064:1;24794:7;:18:::0;31734:58:::2;31744:9:::0;31755:7;31764;;31782:9;31734::::2;:58::i;:::-;-1:-1:-1::0;;24020:1:0::1;24973:22:::0;;-1:-1:-1;;31555:245:0:o;33647:400::-;26661:10;-1:-1:-1;;;;;26675:9:0;26661:23;;26653:59;;;;-1:-1:-1;;;26653:59:0;;;;;;;:::i;:::-;24064:1:::1;24661:7;;:19;;24653:63;;;;-1:-1:-1::0;;;24653:63:0::1;;;;;;;:::i;:::-;24064:1;24794:7;:18:::0;33812:11;33804:47:::2;;;::::0;-1:-1:-1;;;33804:47:0;;15147:2:1;33804:47:0::2;::::0;::::2;15129:21:1::0;15186:2;15166:18;;;15159:30;-1:-1:-1;;;15205:18:1;;;15198:53;15268:18;;33804:47:0::2;15119:173:1::0;33804:47:0::2;-1:-1:-1::0;;;;;33870:23:0;::::2;33862:58;;;::::0;-1:-1:-1;;;33862:58:0;;12150:2:1;33862:58:0::2;::::0;::::2;12132:21:1::0;12189:2;12169:18;;;12162:30;-1:-1:-1;;;12208:18:1;;;12201:52;12270:18;;33862:58:0::2;12122:172:1::0;33862:58:0::2;33933:48;-1:-1:-1::0;;;;;33933:28:0;::::2;33962:9:::0;33973:7;33933:28:::2;:48::i;:::-;33999:40;::::0;;34027:1:::2;6272:51:1::0;;6354:2;6339:18;;6332:34;;;-1:-1:-1;;;;;33999:40:0;::::2;::::0;::::2;::::0;6245:18:1;33999:40:0::2;;;;;;;-1:-1:-1::0;;24020:1:0::1;24973:22:::0;;-1:-1:-1;33647:400:0:o;32214:281::-;26661:10;-1:-1:-1;;;;;26675:9:0;26661:23;;26653:59;;;;-1:-1:-1;;;26653:59:0;;;;;;;:::i;:::-;24064:1:::1;24661:7;;:19;;24653:63;;;;-1:-1:-1::0;;;24653:63:0::1;;;;;;;:::i;:::-;24064:1;24794:7;:18:::0;32424:63:::2;32434:9:::0;32445:7;32454;32463:12;32477:9;32424::::2;:63::i;:::-;-1:-1:-1::0;;24020:1:0::1;24973:22:::0;;-1:-1:-1;;;32214:281:0:o;29383:346::-;21072:15;:13;:15::i;:::-;29467:40:::1;::::0;-1:-1:-1;;;29467:40:0;;29483:23:::1;29467:40;::::0;::::1;8497:25:1::0;29446:18:0::1;::::0;29467:5:::1;-1:-1:-1::0;;;;;29467:15:0::1;::::0;::::1;::::0;8470:18:1;;29467:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29446:61:::0;-1:-1:-1;;;;;;29526:24:0;::::1;29518:70;;;::::0;-1:-1:-1;;;29518:70:0;;9938:2:1;29518:70:0::1;::::0;::::1;9920:21:1::0;9977:2;9957:18;;;9950:30;10016:34;9996:18;;;9989:62;-1:-1:-1;;;10067:18:1;;;10060:31;10108:19;;29518:70:0::1;9910:223:1::0;29518:70:0::1;29601:58;29635:11;29648:10;29601:33;:58::i;:::-;29677:44;::::0;;-1:-1:-1;;;;;29697:11:0::1;6019:15:1::0;;6001:34;;6071:15;;6066:2;6051:18;;6044:43;29677:44:0::1;::::0;5936:18:1;29677:44:0::1;;;;;;;21098:1;29383:346::o:0;21115:121::-;21187:11;:9;:11::i;:::-;-1:-1:-1;;;;;21173:25:0;:10;-1:-1:-1;;;;;21173:25:0;;21165:63;;;;-1:-1:-1;;;21165:63:0;;11796:2:1;21165:63:0;;;11778:21:1;11835:2;11815:18;;;11808:30;11874:27;11854:18;;;11847:55;11919:18;;21165:63:0;11768:175:1;21165:63:0;21115:121::o;27596:424::-;-1:-1:-1;;;;;27685:23:0;;;27720:1;27685:23;;;:14;:23;;;;;;;:37;27677:68;;;;-1:-1:-1;;;27677:68:0;;13268:2:1;27677:68:0;;;13250:21:1;13307:2;13287:18;;;13280:30;-1:-1:-1;;;13326:18:1;;;13319:48;13384:18;;27677:68:0;13240:168:1;27677:68:0;-1:-1:-1;;;;;27764:21:0;;;;;;:46;;-1:-1:-1;;;;;;27789:21:0;;;;27764:46;27756:76;;;;-1:-1:-1;;;27756:76:0;;15499:2:1;27756:76:0;;;15481:21:1;15538:2;15518:18;;;15511:30;-1:-1:-1;;;15557:18:1;;;15550:47;15614:18;;27756:76:0;15471:167:1;27756:76:0;-1:-1:-1;;;;;27845:23:0;;;;;;;:14;:23;;;;;;;;:33;;;;;-1:-1:-1;;;;;;27845:33:0;;;;;;;;27889:13;:27;;-1:-1:-1;27889:27:0;;;;;;;;;;;;;;;;;;;;27934:29;;5727:51:1;;;27845:23:0;;27934:29;;5700:18:1;27934:29:0;;;;;;;27976:36;27995:7;28004;27976:18;:36::i;36300:241::-;-1:-1:-1;;;;;36406:23:0;;;36363:13;36406:23;;;:14;:23;;;;;;36363:13;;36406:23;36448:20;36440:54;;;;-1:-1:-1;;;36440:54:0;;11446:2:1;36440:54:0;;;11428:21:1;11485:2;11465:18;;;11458:30;-1:-1:-1;;;11504:18:1;;;11497:51;11565:18;;36440:54:0;11418:171:1;36440:54:0;36526:6;36300:241;-1:-1:-1;;36300:241:0:o;36758:144::-;36862:32;;-1:-1:-1;;;36862:32:0;;36888:4;36862:32;;;5727:51:1;36827:15:0;;-1:-1:-1;;;;;36862:17:0;;;;;5700:18:1;;36862:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35684:301::-;35734:18;35765:19;35819:15;-1:-1:-1;;;;;35787:63:0;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35765:87;-1:-1:-1;;;;;;35871:25:0;;35863:65;;;;-1:-1:-1;;;35863:65:0;;10340:2:1;35863:65:0;;;10322:21:1;10379:2;10359:18;;;10352:30;10418:29;10398:18;;;10391:57;10465:18;;35863:65:0;10312:177:1;35863:65:0;35965:11;-1:-1:-1;35684:301:0;:::o;28194:107::-;28253:7;28284:1;28280;:5;:13;;28292:1;28280:13;;;-1:-1:-1;28288:1:0;28273:20;-1:-1:-1;28194:107:0:o;32590:792::-;32795:1;32780:12;:16;32772:52;;;;-1:-1:-1;;;32772:52:0;;15147:2:1;32772:52:0;;;15129:21:1;15186:2;15166:18;;;15159:30;-1:-1:-1;;;15205:18:1;;;15198:53;15268:18;;32772:52:0;15119:173:1;32772:52:0;32837:20;32860:22;32874:7;32860:13;:22::i;:::-;32837:45;;32899:9;32895:395;;;32944:12;32933:7;:23;32925:70;;;;-1:-1:-1;;;32925:70:0;;13615:2:1;32925:70:0;;;13597:21:1;13654:2;13634:18;;;13627:30;13693:34;13673:18;;;13666:62;-1:-1:-1;;;13744:18:1;;;13737:32;13786:19;;32925:70:0;13587:224:1;32925:70:0;33010:17;:15;:17::i;:::-;:55;;-1:-1:-1;;;33010:55:0;;-1:-1:-1;;;;;6635:15:1;;;33010:55:0;;;6617:34:1;6667:18;;;6660:34;;;6730:15;;;6710:18;;;6703:43;33010:26:0;;;;;;;6552:18:1;;33010:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32895:395;;;33098:17;:15;:17::i;:::-;:64;;-1:-1:-1;;;33098:64:0;;-1:-1:-1;;;;;6635:15:1;;;33098:64:0;;;6617:34:1;6667:18;;;6660:34;;;33156:4:0;6710:18:1;;;6703:43;33098:26:0;;;;;;;6552:18:1;;33098:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33230:48:0;;-1:-1:-1;;;;;;;;33230:28:0;;33259:9;33270:7;33230:28;:48::i;:::-;33307:67;;;-1:-1:-1;;;;;7450:32:1;;;7432:51;;7514:2;7499:18;;7492:34;;;7542:18;;;7535:34;;;33307:67:0;;;;;;7420:2:1;7405:18;33307:67:0;;;;;;;32590:792;;;;;;:::o;12255:177::-;12365:58;;-1:-1:-1;;;;;6290:32:1;;12365:58:0;;;6272:51:1;6339:18;;;6332:34;;;12338:86:0;;12358:5;;-1:-1:-1;;;12388:23:0;6245:18:1;;12365:58:0;;;;-1:-1:-1;;12365:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;12365:58:0;-1:-1:-1;;;;;;12365:58:0;;;;;;;;;;12338:19;:86::i;:::-;12255:177;;;:::o;16002:189::-;16085:39;-1:-1:-1;;;;;16085:26:0;;16112:8;16122:1;16085:26;:39::i;:::-;16135:48;-1:-1:-1;;;;;16135:26:0;;16162:8;-1:-1:-1;;16135:26:0;:48::i;21722:95::-;21766:7;21793:5;-1:-1:-1;;;;;21793:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35079:291::-;35199:19;35229:17;:15;:17::i;:::-;35199:48;;35307:55;35341:7;35350:11;35307:33;:55::i;14689:761::-;15113:23;15139:69;15167:4;15139:69;;;;;;;;;;;;;;;;;15147:5;-1:-1:-1;;;;;15139:27:0;;;:69;;;;;:::i;:::-;15223:17;;15113:95;;-1:-1:-1;15223:21:0;15219:224;;15365:10;15354:30;;;;;;;;;;;;:::i;:::-;15346:85;;;;-1:-1:-1;;;15346:85:0;;14376:2:1;15346:85:0;;;14358:21:1;14415:2;14395:18;;;14388:30;14454:34;14434:18;;;14427:62;-1:-1:-1;;;14505:18:1;;;14498:40;14555:19;;15346:85:0;14348:232:1;12914:622:0;13284:10;;;13283:62;;-1:-1:-1;13300:39:0;;-1:-1:-1;;;13300:39:0;;13324:4;13300:39;;;6001:34:1;-1:-1:-1;;;;;6071:15:1;;;6051:18;;;6044:43;13300:15:0;;;;;5936:18:1;;13300:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;13283:62;13275:152;;;;-1:-1:-1;;;13275:152:0;;15845:2:1;13275:152:0;;;15827:21:1;15884:2;15864:18;;;15857:30;15923:34;15903:18;;;15896:62;-1:-1:-1;;;15974:18:1;;;15967:52;16036:19;;13275:152:0;15817:244:1;13275:152:0;13465:62;;-1:-1:-1;;;;;6290:32:1;;13465:62:0;;;6272:51:1;6339:18;;;6332:34;;;13438:90:0;;13458:5;;-1:-1:-1;;;13488:22:0;6245:18:1;;13465:62:0;6227:145:1;7855:195:0;7958:12;7990:52;8012:6;8020:4;8026:1;8029:12;7990:21;:52::i;:::-;7983:59;7855:195;-1:-1:-1;;;;7855:195:0:o;8907:530::-;9034:12;9092:5;9067:21;:30;;9059:81;;;;-1:-1:-1;;;9059:81:0;;11039:2:1;9059:81:0;;;11021:21:1;11078:2;11058:18;;;11051:30;11117:34;11097:18;;;11090:62;-1:-1:-1;;;11168:18:1;;;11161:36;11214:19;;9059:81:0;11011:228:1;9059:81:0;5304:20;;9151:60;;;;-1:-1:-1;;;9151:60:0;;14018:2:1;9151:60:0;;;14000:21:1;14057:2;14037:18;;;14030:30;14096:31;14076:18;;;14069:59;14145:18;;9151:60:0;13990:179:1;9151:60:0;9285:12;9299:23;9326:6;-1:-1:-1;;;;;9326:11:0;9346:5;9354:4;9326:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9284:75;;;;9377:52;9395:7;9404:10;9416:12;9377:17;:52::i;:::-;9370:59;8907:530;-1:-1:-1;;;;;;;8907:530:0:o;11447:742::-;11562:12;11591:7;11587:595;;;-1:-1:-1;11622:10:0;11615:17;;11587:595;11736:17;;:21;11732:439;;11999:10;11993:17;12060:15;12047:10;12043:2;12039:19;12032:44;11947:148;12142:12;12135:20;;-1:-1:-1;;;12135: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:463::-;;4925:5;4919:12;4952:6;4947:3;4940:19;4978:4;5007:2;5002:3;4998:12;4991:19;;5044:2;5037:5;5033:14;5065:3;5077:195;5091:6;5088:1;5085:13;5077:195;;;5156:13;;-1:-1:-1;;;;;5152:39:1;5140:52;;5212:12;;;;5247:15;;;;5188:1;5106:9;5077:195;;;-1:-1:-1;5288:3:1;;4895:402;-1:-1:-1;;;;;4895:402:1:o;5302:274::-;;5469:6;5463:13;5485:53;5531:6;5526:3;5519:4;5511:6;5507:17;5485:53;:::i;:::-;5554:16;;;;;5439:137;-1:-1:-1;;5439:137:1:o;7580:332::-;;7787:2;7776:9;7769:21;7807:56;7859:2;7848:9;7844:18;7836:6;7807:56;:::i;:::-;7799:64;;7899:6;7894:2;7883:9;7879:18;7872:34;7759:153;;;;;:::o;7917:429::-;;8152:2;8141:9;8134:21;8172:56;8224:2;8213:9;8209:18;8201:6;8172:56;:::i;:::-;8259:2;8244:18;;8237:34;;;;-1:-1:-1;;;;;;8307:32:1;;;;8302:2;8287:18;;;8280:60;8164:64;8124:222;-1:-1:-1;8124:222:1:o;8997:383::-;;9146:2;9135:9;9128:21;9178:6;9172:13;9221:6;9216:2;9205:9;9201:18;9194:34;9237:66;9296:6;9291:2;9280:9;9276:18;9271:2;9263:6;9259:15;9237:66;:::i;:::-;9364:2;9343:15;-1:-1:-1;;9339:29:1;9324:45;;;;9371:2;9320:54;;9118:262;-1:-1:-1;;9118:262:1:o;12299:347::-;12501:2;12483:21;;;12540:2;12520:18;;;12513:30;12579:25;12574:2;12559:18;;12552:53;12637:2;12622:18;;12473:173::o;14585:355::-;14787:2;14769:21;;;14826:2;14806:18;;;14799:30;14865:33;14860:2;14845:18;;14838:61;14931:2;14916:18;;14759:181::o;16248:125::-;;16316:1;16313;16310:8;16307:2;;;16321:18;;:::i;:::-;-1:-1:-1;16358:9:1;;16297:76::o;16378:258::-;16450:1;16460:113;16474:6;16471:1;16468:13;16460:113;;;16550:11;;;16544:18;16531:11;;;16524:39;16496:2;16489:10;16460:113;;;16591:6;16588:1;16585:13;16582:2;;;16626:1;16617:6;16612:3;16608:16;16601:27;16582:2;;16431:205;;;:::o;16641:135::-;;-1:-1:-1;;16701:17:1;;16698:2;;;16721:18;;:::i;:::-;-1:-1:-1;16768:1:1;16757:13;;16688:88::o;16781:127::-;16842:10;16837:3;16833:20;16830:1;16823:31;16873:4;16870:1;16863:15;16897:4;16894:1;16887:15;16913:131;-1:-1:-1;;;;;16988:31:1;;16978:42;;16968:2;;17034:1;17031;17024:12;16968:2;16958:86;:::o;17049:118::-;17135:5;17128:13;17121:21;17114:5;17111:32;17101:2;;17157:1;17154;17147:12
Swarm Source
ipfs://149234c706eeb7cacdb0d17c2d651b3f82a23e2be1e6dcd40526e236dfa198a0
Loading...
Loading
Loading...
Loading
OVERVIEW
Connects base assets like WBTC in mBTC to Aave's lending markets. This implementation can claim Aave's reward token stkAave.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.