Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 13643710 | 1480 days ago | IN | 0 ETH | 0.0172302 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PAaveIntegration
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-11-19
*/
pragma solidity 0.8.6;
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;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
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
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'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
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);
}
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 Liquidator Module address from the Nexus
* @return Address of the Liquidator Module contract
*/
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 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;
}
}
}
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
);
/// @notice mAsset or Feeder Pool using the integration. eg fPmUSD/alUSD
/// @dev LP has write access
address public immutable lpAddress;
// bAsset => pToken (Platform Specific Token Address)
mapping(address => address) public 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 view 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
Contract ABI
API[{"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":"view","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
6101206040523480156200001257600080fd5b5060405162001efb38038062001efb83398101604081905262000035916200020e565b848484848383816001600160a01b038116620000985760405162461bcd60e51b815260206004820152601560248201527f4e657875732061646472657373206973207a65726f000000000000000000000060448201526064015b60405180910390fd5b60601b6001600160601b031916608052600180556001600160a01b038116620000f95760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204c50206164647265737360701b60448201526064016200008f565b60601b6001600160601b03191660a052506001600160a01b038216620001625760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420706c6174666f726d2061646472657373000000000000000060448201526064016200008f565b6001600160601b0319606092831b811660c052911b1660e05250506001600160a01b038116620001d55760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6e74726f6c6c6572206164647265737300000000000060448201526064016200008f565b60601b6001600160601b03191661010052506200027e92505050565b80516001600160a01b03811681146200020957600080fd5b919050565b600080600080600060a086880312156200022757600080fd5b6200023286620001f1565b94506200024260208701620001f1565b93506200025260408701620001f1565b92506200026260608701620001f1565b91506200027260808701620001f1565b90509295509295909350565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c611be362000318600039600081816101a901526103b001526000818161028601528181610bf80152610c2b0152600081816102570152610f390152600081816101e30152818161048a01528181610863015281816108ea0152610a5201526000818161020a01528181610b0f01526112df0152611be36000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063934785b711610097578063c89fc72f11610066578063c89fc72f1461023f578063dbe55e5614610252578063e729645414610279578063f7c618c11461028157600080fd5b8063934785b7146101cb5780639b4dc8cc146101de578063a3f5c1d214610205578063a4e285951461022c57600080fd5b80635f515226116100d35780635f5152261461013d57806371c465851461015057806373cf25f8146101915780638cc5ce99146101a457600080fd5b80630ed57b3a146100fa578063372500ab1461010f5780633edd112814610117575b600080fd5b61010d61010836600461177d565b6102a8565b005b61010d6102be565b61012a6101253660046118a9565b61047d565b6040519081526020015b60405180910390f35b61012a61014b366004611743565b6106cd565b61017961015e366004611743565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610134565b61010d61019f3660046118eb565b6106eb565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b61010d6101d93660046117f7565b610858565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b61010d61023a3660046117b6565b6108df565b61010d61024d36600461184a565b610a47565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b61010d610acf565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b6102b0610c83565b6102ba8282610ced565b5050565b60035460008167ffffffffffffffff8111156102dc576102dc611b71565b604051908082528060200260200182016040528015610305578160200160208202803683370190505b50905060005b8281101561039557600260006003838154811061032a5761032a611b5b565b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054835191169083908390811061036b5761036b611b5b565b6001600160a01b03909216602092830291909101909101528061038d81611b2a565b91505061030b565b50604051633111e7b360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633111e7b3906103eb908590600019903090600401611a0f565b602060405180830381600087803b15801561040557600080fd5b505af1158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190611974565b90507fdfcc08fd436cd72ca789d668ae3ee67528136f98c501b1b51796de133fe3bf7a82826040516104709291906119ed565b60405180910390a1505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d05760405162461bcd60e51b81526004016104c790611a75565b60405180910390fd5b600260015414156104f35760405162461bcd60e51b81526004016104c790611aac565b60026001558261053e5760405162461bcd60e51b81526020600482015260166024820152754d757374206465706f73697420736f6d657468696e6760501b60448201526064016104c7565b600061054985610e52565b9050839150821561060257600061055f82610eba565b9050610569610f34565b60405163e8eda9df60e01b81526001600160a01b03888116600483015260248281018990523060448401526064830152919091169063e8eda9df90608401600060405180830381600087803b1580156105c157600080fd5b505af11580156105d5573d6000803e3d6000fd5b5050505060006105e483610eba565b90506105f9846105f48484611ae3565b611025565b9350505061067b565b61060a610f34565b60405163e8eda9df60e01b81526001600160a01b03878116600483015260248281018890523060448401526064830152919091169063e8eda9df90608401600060405180830381600087803b15801561066257600080fd5b505af1158015610676573d6000803e3d6000fd5b505050505b604080516001600160a01b038381168252602082018590528716917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62910160405180910390a250600180559392505050565b6000806106d983610e52565b90506106e481610eba565b9392505050565b600054610100900460ff1680610704575060005460ff16155b6107675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104c7565b600054610100900460ff16158015610789576000805461ffff19166101011790555b838281146107ca5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b60448201526064016104c7565b60005b8181101561083d5761082b8787838181106107ea576107ea611b5b565b90506020020160208101906107ff9190611743565b86868481811061081157610811611b5b565b90506020020160208101906108269190611743565b610ced565b8061083581611b2a565b9150506107cd565b50508015610851576000805461ff00191690555b5050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108a05760405162461bcd60e51b81526004016104c790611a75565b600260015414156108c35760405162461bcd60e51b81526004016104c790611aac565b60026001556108d5848484808561103a565b5050600180555050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109275760405162461bcd60e51b81526004016104c790611a75565b6002600154141561094a5760405162461bcd60e51b81526004016104c790611aac565b6002600155806109965760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b60448201526064016104c7565b6001600160a01b0383166109e55760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081cdc1958da599e481c9958da5c1a595b9d60521b60448201526064016104c7565b6109f96001600160a01b0383168483611248565b6040805160008152602081018390526001600160a01b038416917f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398910160405180910390a250506001805550565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8f5760405162461bcd60e51b81526004016104c790611a75565b60026001541415610ab25760405162461bcd60e51b81526004016104c790611aac565b6002600155610ac4858585858561103a565b505060018055505050565b610ad7610c83565b6040516385acd64160e01b81527f1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d460048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906385acd6419060240160206040518083038186803b158015610b5957600080fd5b505afa158015610b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b919190611760565b90506001600160a01b038116610bf35760405162461bcd60e51b815260206004820152602160248201527f4c697175696461746f7220616464726573732063616e6e6f74206265207a65726044820152606f60f81b60648201526084016104c7565b610c1d7f0000000000000000000000000000000000000000000000000000000000000000826112b0565b604080516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081168252831660208201527f71b4effce66e58c9e4ad29e468e7100f7e8b5d106381fd905a25eee3ea1b6a93910160405180910390a150565b610c8b6112db565b6001600160a01b0316336001600160a01b031614610ceb5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f722063616e20657865637574650000000000000060448201526064016104c7565b565b6001600160a01b038281166000908152600260205260409020541615610d4a5760405162461bcd60e51b81526020600482015260126024820152711c151bdad95b88185b1c9958591e481cd95d60721b60448201526064016104c7565b6001600160a01b03821615801590610d6a57506001600160a01b03811615155b610daa5760405162461bcd60e51b8152602060048201526011602482015270496e76616c69642061646472657373657360781b60448201526064016104c7565b6001600160a01b03828116600081815260026020908152604080832080549587166001600160a01b031996871681179091556003805460018101825594527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180549095168417909455925190815290917fef6485b84315f9b1483beffa32aae9a0596890395e3d7521f1c5fbb51790e765910160405180910390a26102ba8282611373565b6001600160a01b0380821660009081526002602052604081205490911680610eb45760405162461bcd60e51b815260206004820152601560248201527418551bdad95b88191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016104c7565b92915050565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610efc57600080fd5b505afa158015610f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb49190611974565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9057600080fd5b505afa158015610fa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc89190611760565b90506001600160a01b0381166110205760405162461bcd60e51b815260206004820152601b60248201527f4c656e64696e6720706f6f6c20646f6573206e6f74206578697374000000000060448201526064016104c7565b919050565b600081831161103457826106e4565b50919050565b600082116110845760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b60448201526064016104c7565b600061108f85610e52565b9050811561116a578284146110f15760405162461bcd60e51b815260206004820152602260248201527f436163686520696e61637469766520666f722061737365747320776974682066604482015261656560f01b60648201526084016104c7565b6110f9610f34565b604051631a4ca37b60e21b81526001600160a01b03878116600483015260248201879052888116604483015291909116906369328dec90606401600060405180830381600087803b15801561114d57600080fd5b505af1158015611161573d6000803e3d6000fd5b505050506111f1565b611172610f34565b604051631a4ca37b60e21b81526001600160a01b0387811660048301526024820186905230604483015291909116906369328dec90606401600060405180830381600087803b1580156111c457600080fd5b505af11580156111d8573d6000803e3d6000fd5b506111f1925050506001600160a01b0386168786611248565b604080516001600160a01b03838116825260208201869052918101869052908616907fb925ac01b9c34cc156a17a1e3da718f364df34eec9d0c9dc4e59c2bb1e7ba54b9060600160405180910390a2505050505050565b6040516001600160a01b0383166024820152604481018290526112ab90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611389565b505050565b6112c56001600160a01b03831682600061145b565b6102ba6001600160a01b0383168260001961145b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561133657600080fd5b505afa15801561134a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136e9190611760565b905090565b600061137d610f34565b90506112ab83826112b0565b60006113de826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661157f9092919063ffffffff16565b8051909150156112ab57808060200190518101906113fc9190611957565b6112ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104c7565b8015806114e45750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156114aa57600080fd5b505afa1580156114be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e29190611974565b155b61154f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016104c7565b6040516001600160a01b0383166024820152604481018290526112ab90849063095ea7b360e01b90606401611274565b606061158e8484600085611596565b949350505050565b6060824710156115f75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c7565b843b6116455760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c7565b600080866001600160a01b0316858760405161166191906119d1565b60006040518083038185875af1925050503d806000811461169e576040519150601f19603f3d011682016040523d82523d6000602084013e6116a3565b606091505b50915091506116b38282866116be565b979650505050505050565b606083156116cd5750816106e4565b8251156116dd5782518084602001fd5b8160405162461bcd60e51b81526004016104c79190611a42565b60008083601f84011261170957600080fd5b50813567ffffffffffffffff81111561172157600080fd5b6020830191508360208260051b850101111561173c57600080fd5b9250929050565b60006020828403121561175557600080fd5b81356106e481611b87565b60006020828403121561177257600080fd5b81516106e481611b87565b6000806040838503121561179057600080fd5b823561179b81611b87565b915060208301356117ab81611b87565b809150509250929050565b6000806000606084860312156117cb57600080fd5b83356117d681611b87565b925060208401356117e681611b87565b929592945050506040919091013590565b6000806000806080858703121561180d57600080fd5b843561181881611b87565b9350602085013561182881611b87565b925060408501359150606085013561183f81611b9f565b939692955090935050565b600080600080600060a0868803121561186257600080fd5b853561186d81611b87565b9450602086013561187d81611b87565b93506040860135925060608601359150608086013561189b81611b9f565b809150509295509295909350565b6000806000606084860312156118be57600080fd5b83356118c981611b87565b92506020840135915060408401356118e081611b9f565b809150509250925092565b6000806000806040858703121561190157600080fd5b843567ffffffffffffffff8082111561191957600080fd5b611925888389016116f7565b9096509450602087013591508082111561193e57600080fd5b5061194b878288016116f7565b95989497509550505050565b60006020828403121561196957600080fd5b81516106e481611b9f565b60006020828403121561198657600080fd5b5051919050565b600081518084526020808501945080840160005b838110156119c65781516001600160a01b0316875295820195908201906001016119a1565b509495945050505050565b600082516119e3818460208701611afa565b9190910192915050565b604081526000611a00604083018561198d565b90508260208301529392505050565b606081526000611a22606083018661198d565b6020830194909452506001600160a01b0391909116604090910152919050565b6020815260008251806020840152611a61816040850160208701611afa565b601f01601f19169190910160400192915050565b60208082526017908201527f4f6e6c7920746865204c502063616e2065786563757465000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082821015611af557611af5611b45565b500390565b60005b83811015611b15578181015183820152602001611afd565b83811115611b24576000848401525b50505050565b6000600019821415611b3e57611b3e611b45565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611b9c57600080fd5b50565b8015158114611b9c57600080fdfea26469706673582212201b4bfd7a86ca262e4c4161e5aef4cd82a380b5047c940a6a4a1a7f402117920164736f6c63430008060033000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb300000000000000000000000036f944b7312eac89381bd78326df9c84691d8a5b000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c50000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b5
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063934785b711610097578063c89fc72f11610066578063c89fc72f1461023f578063dbe55e5614610252578063e729645414610279578063f7c618c11461028157600080fd5b8063934785b7146101cb5780639b4dc8cc146101de578063a3f5c1d214610205578063a4e285951461022c57600080fd5b80635f515226116100d35780635f5152261461013d57806371c465851461015057806373cf25f8146101915780638cc5ce99146101a457600080fd5b80630ed57b3a146100fa578063372500ab1461010f5780633edd112814610117575b600080fd5b61010d61010836600461177d565b6102a8565b005b61010d6102be565b61012a6101253660046118a9565b61047d565b6040519081526020015b60405180910390f35b61012a61014b366004611743565b6106cd565b61017961015e366004611743565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610134565b61010d61019f3660046118eb565b6106eb565b6101797f000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b581565b61010d6101d93660046117f7565b610858565b6101797f00000000000000000000000036f944b7312eac89381bd78326df9c84691d8a5b81565b6101797f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb381565b61010d61023a3660046117b6565b6108df565b61010d61024d36600461184a565b610a47565b6101797f000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c581565b61010d610acf565b6101797f0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f581565b6102b0610c83565b6102ba8282610ced565b5050565b60035460008167ffffffffffffffff8111156102dc576102dc611b71565b604051908082528060200260200182016040528015610305578160200160208202803683370190505b50905060005b8281101561039557600260006003838154811061032a5761032a611b5b565b60009182526020808320909101546001600160a01b039081168452908301939093526040909101902054835191169083908390811061036b5761036b611b5b565b6001600160a01b03909216602092830291909101909101528061038d81611b2a565b91505061030b565b50604051633111e7b360e01b81526000906001600160a01b037f000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b51690633111e7b3906103eb908590600019903090600401611a0f565b602060405180830381600087803b15801561040557600080fd5b505af1158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190611974565b90507fdfcc08fd436cd72ca789d668ae3ee67528136f98c501b1b51796de133fe3bf7a82826040516104709291906119ed565b60405180910390a1505050565b6000336001600160a01b037f00000000000000000000000036f944b7312eac89381bd78326df9c84691d8a5b16146104d05760405162461bcd60e51b81526004016104c790611a75565b60405180910390fd5b600260015414156104f35760405162461bcd60e51b81526004016104c790611aac565b60026001558261053e5760405162461bcd60e51b81526020600482015260166024820152754d757374206465706f73697420736f6d657468696e6760501b60448201526064016104c7565b600061054985610e52565b9050839150821561060257600061055f82610eba565b9050610569610f34565b60405163e8eda9df60e01b81526001600160a01b03888116600483015260248281018990523060448401526064830152919091169063e8eda9df90608401600060405180830381600087803b1580156105c157600080fd5b505af11580156105d5573d6000803e3d6000fd5b5050505060006105e483610eba565b90506105f9846105f48484611ae3565b611025565b9350505061067b565b61060a610f34565b60405163e8eda9df60e01b81526001600160a01b03878116600483015260248281018890523060448401526064830152919091169063e8eda9df90608401600060405180830381600087803b15801561066257600080fd5b505af1158015610676573d6000803e3d6000fd5b505050505b604080516001600160a01b038381168252602082018590528716917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62910160405180910390a250600180559392505050565b6000806106d983610e52565b90506106e481610eba565b9392505050565b600054610100900460ff1680610704575060005460ff16155b6107675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104c7565b600054610100900460ff16158015610789576000805461ffff19166101011790555b838281146107ca5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b60448201526064016104c7565b60005b8181101561083d5761082b8787838181106107ea576107ea611b5b565b90506020020160208101906107ff9190611743565b86868481811061081157610811611b5b565b90506020020160208101906108269190611743565b610ced565b8061083581611b2a565b9150506107cd565b50508015610851576000805461ff00191690555b5050505050565b336001600160a01b037f00000000000000000000000036f944b7312eac89381bd78326df9c84691d8a5b16146108a05760405162461bcd60e51b81526004016104c790611a75565b600260015414156108c35760405162461bcd60e51b81526004016104c790611aac565b60026001556108d5848484808561103a565b5050600180555050565b336001600160a01b037f00000000000000000000000036f944b7312eac89381bd78326df9c84691d8a5b16146109275760405162461bcd60e51b81526004016104c790611a75565b6002600154141561094a5760405162461bcd60e51b81526004016104c790611aac565b6002600155806109965760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b60448201526064016104c7565b6001600160a01b0383166109e55760405162461bcd60e51b8152602060048201526016602482015275135d5cdd081cdc1958da599e481c9958da5c1a595b9d60521b60448201526064016104c7565b6109f96001600160a01b0383168483611248565b6040805160008152602081018390526001600160a01b038416917f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b6398910160405180910390a250506001805550565b336001600160a01b037f00000000000000000000000036f944b7312eac89381bd78326df9c84691d8a5b1614610a8f5760405162461bcd60e51b81526004016104c790611a75565b60026001541415610ab25760405162461bcd60e51b81526004016104c790611aac565b6002600155610ac4858585858561103a565b505060018055505050565b610ad7610c83565b6040516385acd64160e01b81527f1e9cb14d7560734a61fa5ff9273953e971ff3cd9283c03d8346e3264617933d460048201526000907f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb36001600160a01b0316906385acd6419060240160206040518083038186803b158015610b5957600080fd5b505afa158015610b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b919190611760565b90506001600160a01b038116610bf35760405162461bcd60e51b815260206004820152602160248201527f4c697175696461746f7220616464726573732063616e6e6f74206265207a65726044820152606f60f81b60648201526084016104c7565b610c1d7f0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5826112b0565b604080516001600160a01b037f0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f581168252831660208201527f71b4effce66e58c9e4ad29e468e7100f7e8b5d106381fd905a25eee3ea1b6a93910160405180910390a150565b610c8b6112db565b6001600160a01b0316336001600160a01b031614610ceb5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f722063616e20657865637574650000000000000060448201526064016104c7565b565b6001600160a01b038281166000908152600260205260409020541615610d4a5760405162461bcd60e51b81526020600482015260126024820152711c151bdad95b88185b1c9958591e481cd95d60721b60448201526064016104c7565b6001600160a01b03821615801590610d6a57506001600160a01b03811615155b610daa5760405162461bcd60e51b8152602060048201526011602482015270496e76616c69642061646472657373657360781b60448201526064016104c7565b6001600160a01b03828116600081815260026020908152604080832080549587166001600160a01b031996871681179091556003805460018101825594527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90930180549095168417909455925190815290917fef6485b84315f9b1483beffa32aae9a0596890395e3d7521f1c5fbb51790e765910160405180910390a26102ba8282611373565b6001600160a01b0380821660009081526002602052604081205490911680610eb45760405162461bcd60e51b815260206004820152601560248201527418551bdad95b88191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016104c7565b92915050565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610efc57600080fd5b505afa158015610f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb49190611974565b6000807f000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c56001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9057600080fd5b505afa158015610fa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc89190611760565b90506001600160a01b0381166110205760405162461bcd60e51b815260206004820152601b60248201527f4c656e64696e6720706f6f6c20646f6573206e6f74206578697374000000000060448201526064016104c7565b919050565b600081831161103457826106e4565b50919050565b600082116110845760405162461bcd60e51b81526020600482015260176024820152764d75737420776974686472617720736f6d657468696e6760481b60448201526064016104c7565b600061108f85610e52565b9050811561116a578284146110f15760405162461bcd60e51b815260206004820152602260248201527f436163686520696e61637469766520666f722061737365747320776974682066604482015261656560f01b60648201526084016104c7565b6110f9610f34565b604051631a4ca37b60e21b81526001600160a01b03878116600483015260248201879052888116604483015291909116906369328dec90606401600060405180830381600087803b15801561114d57600080fd5b505af1158015611161573d6000803e3d6000fd5b505050506111f1565b611172610f34565b604051631a4ca37b60e21b81526001600160a01b0387811660048301526024820186905230604483015291909116906369328dec90606401600060405180830381600087803b1580156111c457600080fd5b505af11580156111d8573d6000803e3d6000fd5b506111f1925050506001600160a01b0386168786611248565b604080516001600160a01b03838116825260208201869052918101869052908616907fb925ac01b9c34cc156a17a1e3da718f364df34eec9d0c9dc4e59c2bb1e7ba54b9060600160405180910390a2505050505050565b6040516001600160a01b0383166024820152604481018290526112ab90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611389565b505050565b6112c56001600160a01b03831682600061145b565b6102ba6001600160a01b0383168260001961145b565b60007f000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb36001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561133657600080fd5b505afa15801561134a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136e9190611760565b905090565b600061137d610f34565b90506112ab83826112b0565b60006113de826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661157f9092919063ffffffff16565b8051909150156112ab57808060200190518101906113fc9190611957565b6112ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104c7565b8015806114e45750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156114aa57600080fd5b505afa1580156114be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e29190611974565b155b61154f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084016104c7565b6040516001600160a01b0383166024820152604481018290526112ab90849063095ea7b360e01b90606401611274565b606061158e8484600085611596565b949350505050565b6060824710156115f75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c7565b843b6116455760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c7565b600080866001600160a01b0316858760405161166191906119d1565b60006040518083038185875af1925050503d806000811461169e576040519150601f19603f3d011682016040523d82523d6000602084013e6116a3565b606091505b50915091506116b38282866116be565b979650505050505050565b606083156116cd5750816106e4565b8251156116dd5782518084602001fd5b8160405162461bcd60e51b81526004016104c79190611a42565b60008083601f84011261170957600080fd5b50813567ffffffffffffffff81111561172157600080fd5b6020830191508360208260051b850101111561173c57600080fd5b9250929050565b60006020828403121561175557600080fd5b81356106e481611b87565b60006020828403121561177257600080fd5b81516106e481611b87565b6000806040838503121561179057600080fd5b823561179b81611b87565b915060208301356117ab81611b87565b809150509250929050565b6000806000606084860312156117cb57600080fd5b83356117d681611b87565b925060208401356117e681611b87565b929592945050506040919091013590565b6000806000806080858703121561180d57600080fd5b843561181881611b87565b9350602085013561182881611b87565b925060408501359150606085013561183f81611b9f565b939692955090935050565b600080600080600060a0868803121561186257600080fd5b853561186d81611b87565b9450602086013561187d81611b87565b93506040860135925060608601359150608086013561189b81611b9f565b809150509295509295909350565b6000806000606084860312156118be57600080fd5b83356118c981611b87565b92506020840135915060408401356118e081611b9f565b809150509250925092565b6000806000806040858703121561190157600080fd5b843567ffffffffffffffff8082111561191957600080fd5b611925888389016116f7565b9096509450602087013591508082111561193e57600080fd5b5061194b878288016116f7565b95989497509550505050565b60006020828403121561196957600080fd5b81516106e481611b9f565b60006020828403121561198657600080fd5b5051919050565b600081518084526020808501945080840160005b838110156119c65781516001600160a01b0316875295820195908201906001016119a1565b509495945050505050565b600082516119e3818460208701611afa565b9190910192915050565b604081526000611a00604083018561198d565b90508260208301529392505050565b606081526000611a22606083018661198d565b6020830194909452506001600160a01b0391909116604090910152919050565b6020815260008251806020840152611a61816040850160208701611afa565b601f01601f19169190910160400192915050565b60208082526017908201527f4f6e6c7920746865204c502063616e2065786563757465000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082821015611af557611af5611b45565b500390565b60005b83811015611b15578181015183820152602001611afd565b83811115611b24576000848401525b50505050565b6000600019821415611b3e57611b3e611b45565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611b9c57600080fd5b50565b8015158114611b9c57600080fdfea26469706673582212201b4bfd7a86ca262e4c4161e5aef4cd82a380b5047c940a6a4a1a7f402117920164736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb300000000000000000000000036f944b7312eac89381bd78326df9c84691d8a5b000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c50000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b5
-----Decoded View---------------
Arg [0] : _nexus (address): 0xAFcE80b19A8cE13DEc0739a1aaB7A028d6845Eb3
Arg [1] : _lp (address): 0x36F944B7312EAc89381BD78326Df9C84691D8A5B
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] : 00000000000000000000000036f944b7312eac89381bd78326df9c84691d8a5b
Arg [2] : 000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c5
Arg [3] : 0000000000000000000000004da27a545c0c5b758a6ba100e3a049001de870f5
Arg [4] : 000000000000000000000000d784927ff2f95ba542bfc824c8a8a98f3495f6b5
Deployed Bytecode Sourcemap
38094:1360:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27038:136;;;;;;:::i;:::-;;:::i;:::-;;39042:409;;;:::i;30274:853::-;;;;;;:::i;:::-;;:::i;:::-;;;8344:25:1;;;8332:2;8317:18;30274:853:0;;;;;;;;34330:248;;;;;;:::i;:::-;;:::i;25580:49::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;25580:49:0;;;;;;-1:-1:-1;;;;;5592:32:1;;;5574:51;;5562:2;5547:18;25580:49:0;5529:102:1;26092:342:0;;;;;;:::i;:::-;;:::i;38211:59::-;;;;;31461:245;;;;;;:::i;:::-;;:::i;25478:34::-;;;;;19711:29;;;;;33553:400;;;;;;:::i;:::-;;:::i;32120:281::-;;;;;;:::i;:::-;;:::i;28353:40::-;;;;;29289:346;;;:::i;28400:36::-;;;;;27038:136;20145:15;:13;:15::i;:::-;27131:35:::1;27149:7;27158;27131:17;:35::i;:::-;27038:136:::0;;:::o;39042:409::-;39100:13;:20;39086:11;39100:20;39158:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39158:18:0;;39131:45;;39192:9;39187:106;39211:3;39207:1;:7;39187:106;;;39249:14;:32;39264:13;39278:1;39264:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;39264:16:0;;;39249:32;;;;;;;;;;;;;;;;39236:10;;39249:32;;;39236:7;;39244:1;;39236:10;;;;;;:::i;:::-;-1:-1:-1;;;;;39236:45:0;;;:10;;;;;;;;;;;:45;39216:3;;;;:::i;:::-;;;;39187:106;;;-1:-1:-1;39321:72:0;;-1:-1:-1;;;39321:72:0;;39303:15;;-1:-1:-1;;;;;39321:16:0;:29;;;;:72;;39351:7;;-1:-1:-1;;39360:17:0;39387:4;;39321:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39303:90;;39411:32;39426:7;39435;39411:32;;;;;;;:::i;:::-;;;;;;;;39075:376;;;39042:409::o;30274:853::-;30422:25;26567:10;-1:-1:-1;;;;;26581:9:0;26567:23;;26559:59;;;;-1:-1:-1;;;26559:59:0;;;;;;;:::i;:::-;;;;;;;;;23115:1:::1;23711:7;;:19;;23703:63;;;;-1:-1:-1::0;;;23703:63:0::1;;;;;;;:::i;:::-;23115:1;23844:7;:18:::0;30468:11;30460:46:::2;;;::::0;-1:-1:-1;;;30460:46:0;;9434:2:1;30460:46:0::2;::::0;::::2;9416:21:1::0;9473:2;9453:18;;;9446:30;-1:-1:-1;;;9492:18:1;;;9485:52;9554:18;;30460:46:0::2;9406:172:1::0;30460:46:0::2;30519:20;30542:22;30556:7;30542:13;:22::i;:::-;30519:45;;30597:7;30577:27;;30621:9;30617:433;;;30698:15;30716:21;30730:6;30716:13;:21::i;:::-;30698:39;;30752:17;:15;:17::i;:::-;:62;::::0;-1:-1:-1;;;30752:62:0;;-1:-1:-1;;;;;6899:15:1;;;30752:62:0::2;::::0;::::2;6881:34:1::0;30811:2:0::2;6931:18:1::0;;;6924:34;;;30804:4:0::2;6974:18:1::0;;;6967:43;7026:18;;;7019:47;30752:25:0;;;::::2;::::0;::::2;::::0;6815:19:1;;30752:62:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;30829:14;30846:21;30860:6;30846:13;:21::i;:::-;30829:38:::0;-1:-1:-1;30902:41:0::2;30907:17:::0;30926:16:::2;30935:7:::0;30829:38;30926:16:::2;:::i;:::-;30902:4;:41::i;:::-;30882:61;;30632:323;;30617:433;;;30976:17;:15;:17::i;:::-;:62;::::0;-1:-1:-1;;;30976:62:0;;-1:-1:-1;;;;;6899:15:1;;;30976:62:0::2;::::0;::::2;6881:34:1::0;31035:2:0::2;6931:18:1::0;;;6924:34;;;31028:4:0::2;6974:18:1::0;;;6967:43;7026:18;;;7019:47;30976:25:0;;;::::2;::::0;::::2;::::0;6815:19:1;;30976:62:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;30617:433;31067:52;::::0;;-1:-1:-1;;;;;6137:32:1;;;6119:51;;6201:2;6186:18;;6179:34;;;31067:52:0;::::2;::::0;::::2;::::0;6092:18:1;31067:52:0::2;;;;;;;-1:-1:-1::0;23071:1:0::1;24023:22:::0;;30274:853;;-1:-1:-1;;;30274:853:0:o;34330:248::-;34401:15;34486:20;34509:22;34523:7;34509:13;:22::i;:::-;34486:45;;34549:21;34563:6;34549:13;:21::i;:::-;34542:28;34330:248;-1:-1:-1;;;34330:248:0:o;26092:342::-;24491:13;;;;;;;;:30;;-1:-1:-1;24509:12:0;;;;24508:13;24491:30;24483:89;;;;-1:-1:-1;;;24483:89:0;;12700:2:1;24483:89:0;;;12682:21:1;12739:2;12719:18;;;12712:30;12778:34;12758:18;;;12751:62;-1:-1:-1;;;12829:18:1;;;12822:44;12883:19;;24483:89:0;12672:236:1;24483:89:0;24585:19;24608:13;;;;;;24607:14;24632:101;;;;24667:13;:20;;-1:-1:-1;;24702:19:0;;;;;24632:101;26237:8;26271:22;;::::1;26263:49;;;::::0;-1:-1:-1;;;26263:49:0;;10543:2:1;26263:49:0::1;::::0;::::1;10525:21:1::0;10582:2;10562:18;;;10555:30;-1:-1:-1;;;10601:18:1;;;10594:44;10655:18;;26263:49:0::1;10515:164:1::0;26263:49:0::1;26328:9;26323:104;26347:3;26343:1;:7;26323:104;;;26372:43;26390:8;;26399:1;26390:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;26403:8;;26412:1;26403:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;26372:17;:43::i;:::-;26352:3:::0;::::1;::::0;::::1;:::i;:::-;;;;26323:104;;;;26212:222;24763:14:::0;24759:68;;;24810:5;24794:21;;-1:-1:-1;;24794:21:0;;;24759:68;24472:362;26092:342;;;;:::o;31461:245::-;26567:10;-1:-1:-1;;;;;26581:9:0;26567:23;;26559:59;;;;-1:-1:-1;;;26559:59:0;;;;;;;:::i;:::-;23115:1:::1;23711:7;;:19;;23703:63;;;;-1:-1:-1::0;;;23703:63:0::1;;;;;;;:::i;:::-;23115:1;23844:7;:18:::0;31640:58:::2;31650:9:::0;31661:7;31670;;31688:9;31640::::2;:58::i;:::-;-1:-1:-1::0;;23071:1:0::1;24023:22:::0;;-1:-1:-1;;31461:245:0:o;33553:400::-;26567:10;-1:-1:-1;;;;;26581:9:0;26567:23;;26559:59;;;;-1:-1:-1;;;26559:59:0;;;;;;;:::i;:::-;23115:1:::1;23711:7;;:19;;23703:63;;;;-1:-1:-1::0;;;23703:63:0::1;;;;;;;:::i;:::-;23115:1;23844:7;:18:::0;33718:11;33710:47:::2;;;::::0;-1:-1:-1;;;33710:47:0;;14994:2:1;33710:47:0::2;::::0;::::2;14976:21:1::0;15033:2;15013:18;;;15006:30;-1:-1:-1;;;15052:18:1;;;15045:53;15115:18;;33710:47:0::2;14966:173:1::0;33710:47:0::2;-1:-1:-1::0;;;;;33776:23:0;::::2;33768:58;;;::::0;-1:-1:-1;;;33768:58:0;;11997:2:1;33768:58:0::2;::::0;::::2;11979:21:1::0;12036:2;12016:18;;;12009:30;-1:-1:-1;;;12055:18:1;;;12048:52;12117:18;;33768:58:0::2;11969:172:1::0;33768:58:0::2;33839:48;-1:-1:-1::0;;;;;33839:28:0;::::2;33868:9:::0;33879:7;33839:28:::2;:48::i;:::-;33905:40;::::0;;33933:1:::2;6119:51:1::0;;6201:2;6186:18;;6179:34;;;-1:-1:-1;;;;;33905:40:0;::::2;::::0;::::2;::::0;6092:18:1;33905:40:0::2;;;;;;;-1:-1:-1::0;;23071:1:0::1;24023:22:::0;;-1:-1:-1;33553:400:0:o;32120:281::-;26567:10;-1:-1:-1;;;;;26581:9:0;26567:23;;26559:59;;;;-1:-1:-1;;;26559:59:0;;;;;;;:::i;:::-;23115:1:::1;23711:7;;:19;;23703:63;;;;-1:-1:-1::0;;;23703:63:0::1;;;;;;;:::i;:::-;23115:1;23844:7;:18:::0;32330:63:::2;32340:9:::0;32351:7;32360;32369:12;32383:9;32330::::2;:63::i;:::-;-1:-1:-1::0;;23071:1:0::1;24023:22:::0;;-1:-1:-1;;;32120:281:0:o;29289:346::-;20145:15;:13;:15::i;:::-;29373:40:::1;::::0;-1:-1:-1;;;29373:40:0;;29389:23:::1;29373:40;::::0;::::1;8344:25:1::0;29352:18:0::1;::::0;29373:5:::1;-1:-1:-1::0;;;;;29373:15:0::1;::::0;::::1;::::0;8317:18:1;;29373:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29352:61:::0;-1:-1:-1;;;;;;29432:24:0;::::1;29424:70;;;::::0;-1:-1:-1;;;29424:70:0;;9785:2:1;29424:70:0::1;::::0;::::1;9767:21:1::0;9824:2;9804:18;;;9797:30;9863:34;9843:18;;;9836:62;-1:-1:-1;;;9914:18:1;;;9907:31;9955:19;;29424:70:0::1;9757:223:1::0;29424:70:0::1;29507:58;29541:11;29554:10;29507:33;:58::i;:::-;29583:44;::::0;;-1:-1:-1;;;;;29603:11:0::1;5866:15:1::0;;5848:34;;5918:15;;5913:2;5898:18;;5891:43;29583:44:0::1;::::0;5783:18:1;29583:44:0::1;;;;;;;29341:294;29289:346::o:0;20188:121::-;20260:11;:9;:11::i;:::-;-1:-1:-1;;;;;20246:25:0;:10;-1:-1:-1;;;;;20246:25:0;;20238:63;;;;-1:-1:-1;;;20238:63:0;;11643:2:1;20238:63:0;;;11625:21:1;11682:2;11662:18;;;11655:30;11721:27;11701:18;;;11694:55;11766:18;;20238:63:0;11615:175:1;20238:63:0;20188:121::o;27502:424::-;-1:-1:-1;;;;;27591:23:0;;;27626:1;27591:23;;;:14;:23;;;;;;;:37;27583:68;;;;-1:-1:-1;;;27583:68:0;;13115:2:1;27583:68:0;;;13097:21:1;13154:2;13134:18;;;13127:30;-1:-1:-1;;;13173:18:1;;;13166:48;13231:18;;27583:68:0;13087:168:1;27583:68:0;-1:-1:-1;;;;;27670:21:0;;;;;;:46;;-1:-1:-1;;;;;;27695:21:0;;;;27670:46;27662:76;;;;-1:-1:-1;;;27662:76:0;;15346:2:1;27662:76:0;;;15328:21:1;15385:2;15365:18;;;15358:30;-1:-1:-1;;;15404:18:1;;;15397:47;15461:18;;27662:76:0;15318:167:1;27662:76:0;-1:-1:-1;;;;;27751:23:0;;;;;;;:14;:23;;;;;;;;:33;;;;;-1:-1:-1;;;;;;27751:33:0;;;;;;;;27795:13;:27;;-1:-1:-1;27795:27:0;;;;;;;;;;;;;;;;;;;;27840:29;;5574:51:1;;;27751:23:0;;27840:29;;5547:18:1;27840:29:0;;;;;;;27882:36;27901:7;27910;27882:18;:36::i;36211:241::-;-1:-1:-1;;;;;36317:23:0;;;36274:13;36317:23;;;:14;:23;;;;;;36274:13;;36317:23;36359:20;36351:54;;;;-1:-1:-1;;;36351:54:0;;11293:2:1;36351:54:0;;;11275:21:1;11332:2;11312:18;;;11305:30;-1:-1:-1;;;11351:18:1;;;11344:51;11412:18;;36351:54:0;11265:171:1;36351:54:0;36437:6;36211:241;-1:-1:-1;;36211:241:0:o;36669:144::-;36773:32;;-1:-1:-1;;;36773:32:0;;36799:4;36773:32;;;5574:51:1;36738:15:0;;-1:-1:-1;;;;;36773:17:0;;;;;5547:18:1;;36773:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35595:301::-;35645:18;35676:19;35730:15;-1:-1:-1;;;;;35698:63:0;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35676:87;-1:-1:-1;;;;;;35782:25:0;;35774:65;;;;-1:-1:-1;;;35774:65:0;;10187:2:1;35774:65:0;;;10169:21:1;10226:2;10206:18;;;10199:30;10265:29;10245:18;;;10238:57;10312:18;;35774:65:0;10159:177:1;35774:65:0;35876:11;35595:301;-1:-1:-1;35595:301:0:o;28100:107::-;28159:7;28190:1;28186;:5;:13;;28198:1;28186:13;;;-1:-1:-1;28194:1:0;28179:20;-1:-1:-1;28100:107:0:o;32496:792::-;32701:1;32686:12;:16;32678:52;;;;-1:-1:-1;;;32678:52:0;;14994:2:1;32678:52:0;;;14976:21:1;15033:2;15013:18;;;15006:30;-1:-1:-1;;;15052:18:1;;;15045:53;15115:18;;32678:52:0;14966:173:1;32678:52:0;32743:20;32766:22;32780:7;32766:13;:22::i;:::-;32743:45;;32805:9;32801:395;;;32850:12;32839:7;:23;32831:70;;;;-1:-1:-1;;;32831:70:0;;13462:2:1;32831:70:0;;;13444:21:1;13501:2;13481:18;;;13474:30;13540:34;13520:18;;;13513:62;-1:-1:-1;;;13591:18:1;;;13584:32;13633:19;;32831:70:0;13434:224:1;32831:70:0;32916:17;:15;:17::i;:::-;:55;;-1:-1:-1;;;32916:55:0;;-1:-1:-1;;;;;6482:15:1;;;32916:55:0;;;6464:34:1;6514:18;;;6507:34;;;6577:15;;;6557:18;;;6550:43;32916:26:0;;;;;;;6399:18:1;;32916:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32801:395;;;33004:17;:15;:17::i;:::-;:64;;-1:-1:-1;;;33004:64:0;;-1:-1:-1;;;;;6482:15:1;;;33004:64:0;;;6464:34:1;6514:18;;;6507:34;;;33062:4:0;6557:18:1;;;6550:43;33004:26:0;;;;;;;6399:18:1;;33004:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33136:48:0;;-1:-1:-1;;;;;;;;33136:28:0;;33165:9;33176:7;33136:28;:48::i;:::-;33213:67;;;-1:-1:-1;;;;;7297:32:1;;;7279:51;;7361:2;7346:18;;7339:34;;;7389:18;;;7382:34;;;33213:67:0;;;;;;7267:2:1;7252:18;33213:67:0;;;;;;;32667:621;32496:792;;;;;:::o;12150:211::-;12294:58;;-1:-1:-1;;;;;6137:32:1;;12294:58:0;;;6119:51:1;6186:18;;;6179:34;;;12267:86:0;;12287:5;;-1:-1:-1;;;12317:23:0;6092:18:1;;12294:58:0;;;;-1:-1:-1;;12294:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;12294:58:0;-1:-1:-1;;;;;;12294:58:0;;;;;;;;;;12267:19;:86::i;:::-;12150:211;;;:::o;15991:189::-;16074:39;-1:-1:-1;;;;;16074:26:0;;16101:8;16111:1;16074:26;:39::i;:::-;16124:48;-1:-1:-1;;;;;16124:26:0;;16151:8;-1:-1:-1;;16124:26:0;:48::i;20795:95::-;20839:7;20866:5;-1:-1:-1;;;;;20866:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20859:23;;20795:95;:::o;34990:291::-;35110:19;35140:17;:15;:17::i;:::-;35110:48;;35218:55;35252:7;35261:11;35218:33;:55::i;14723:716::-;15147:23;15173:69;15201:4;15173:69;;;;;;;;;;;;;;;;;15181:5;-1:-1:-1;;;;;15173:27:0;;;:69;;;;;:::i;:::-;15257:17;;15147:95;;-1:-1:-1;15257:21:0;15253:179;;15354:10;15343:30;;;;;;;;;;;;:::i;:::-;15335:85;;;;-1:-1:-1;;;15335:85:0;;14223:2:1;15335:85:0;;;14205:21:1;14262:2;14242:18;;;14235:30;14301:34;14281:18;;;14274:62;-1:-1:-1;;;14352:18:1;;;14345:40;14402:19;;15335:85:0;14195:232:1;12886:616:0;13250:10;;;13249:62;;-1:-1:-1;13266:39:0;;-1:-1:-1;;;13266:39:0;;13290:4;13266:39;;;5848:34:1;-1:-1:-1;;;;;5918:15:1;;;5898:18;;;5891:43;13266:15:0;;;;;5783:18:1;;13266:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;13249:62;13227:166;;;;-1:-1:-1;;;13227:166:0;;15692:2:1;13227:166:0;;;15674:21:1;15731:2;15711:18;;;15704:30;15770:34;15750:18;;;15743:62;-1:-1:-1;;;15821:18:1;;;15814:52;15883:19;;13227:166:0;15664:244:1;13227:166:0;13431:62;;-1:-1:-1;;;;;6137:32:1;;13431:62:0;;;6119:51:1;6186:18;;;6179:34;;;13404:90:0;;13424:5;;-1:-1:-1;;;13454:22:0;6092:18:1;;13431:62:0;6074:145:1;7783:229:0;7920:12;7952:52;7974:6;7982:4;7988:1;7991:12;7952:21;:52::i;:::-;7945:59;7783:229;-1:-1:-1;;;;7783:229:0:o;8903:511::-;9073:12;9131:5;9106:21;:30;;9098:81;;;;-1:-1:-1;;;9098:81:0;;10886:2:1;9098:81:0;;;10868:21:1;10925:2;10905:18;;;10898:30;10964:34;10944:18;;;10937:62;-1:-1:-1;;;11015:18:1;;;11008:36;11061:19;;9098:81:0;10858:228:1;9098:81:0;5300:20;;9190:60;;;;-1:-1:-1;;;9190:60:0;;13865:2:1;9190:60:0;;;13847:21:1;13904:2;13884:18;;;13877:30;13943:31;13923:18;;;13916:59;13992:18;;9190:60:0;13837:179:1;9190:60:0;9264:12;9278:23;9305:6;-1:-1:-1;;;;;9305:11:0;9324:5;9331:4;9305:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9263:73;;;;9354:52;9372:7;9381:10;9393:12;9354:17;:52::i;:::-;9347:59;8903:511;-1:-1:-1;;;;;;;8903:511:0:o;11372:712::-;11522:12;11551:7;11547:530;;;-1:-1:-1;11582:10:0;11575:17;;11547:530;11696:17;;:21;11692:374;;11894:10;11888:17;11955:15;11942:10;11938:2;11934:19;11927:44;11692:374;12037:12;12030:20;;-1:-1:-1;;;12030:20:0;;;;;;;;:::i;14:367:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;159:1;156;149:12;108:2;-1:-1:-1;182:20:1;;225:18;214:30;;211:2;;;257:1;254;247:12;211:2;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:2;;;371:1;368;361:12;308:2;98:283;;;;;:::o;386:247::-;445:6;498:2;486:9;477:7;473:23;469:32;466:2;;;514:1;511;504:12;466:2;553:9;540:23;572:31;597:5;572:31;:::i;638:251::-;708:6;761:2;749:9;740:7;736:23;732:32;729:2;;;777:1;774;767:12;729:2;809:9;803:16;828:31;853:5;828:31;:::i;894:388::-;962:6;970;1023:2;1011:9;1002:7;998:23;994:32;991:2;;;1039:1;1036;1029:12;991:2;1078:9;1065:23;1097:31;1122:5;1097:31;:::i;:::-;1147:5;-1:-1:-1;1204:2:1;1189:18;;1176:32;1217:33;1176:32;1217:33;:::i;:::-;1269:7;1259:17;;;981:301;;;;;:::o;1287:456::-;1364:6;1372;1380;1433:2;1421:9;1412:7;1408:23;1404:32;1401:2;;;1449:1;1446;1439:12;1401:2;1488:9;1475:23;1507:31;1532:5;1507:31;:::i;:::-;1557:5;-1:-1:-1;1614:2:1;1599:18;;1586:32;1627:33;1586:32;1627:33;:::i;:::-;1391:352;;1679:7;;-1:-1:-1;;;1733:2:1;1718:18;;;;1705:32;;1391:352::o;1748:592::-;1831:6;1839;1847;1855;1908:3;1896:9;1887:7;1883:23;1879:33;1876:2;;;1925:1;1922;1915:12;1876:2;1964:9;1951:23;1983:31;2008:5;1983:31;:::i;:::-;2033:5;-1:-1:-1;2090:2:1;2075:18;;2062:32;2103:33;2062:32;2103:33;:::i;:::-;2155:7;-1:-1:-1;2209:2:1;2194:18;;2181:32;;-1:-1:-1;2265:2:1;2250:18;;2237:32;2278:30;2237:32;2278:30;:::i;:::-;1866:474;;;;-1:-1:-1;1866:474:1;;-1:-1:-1;;1866:474:1:o;2345:661::-;2437:6;2445;2453;2461;2469;2522:3;2510:9;2501:7;2497:23;2493:33;2490:2;;;2539:1;2536;2529:12;2490:2;2578:9;2565:23;2597:31;2622:5;2597:31;:::i;:::-;2647:5;-1:-1:-1;2704:2:1;2689:18;;2676:32;2717:33;2676:32;2717:33;:::i;:::-;2769:7;-1:-1:-1;2823:2:1;2808:18;;2795:32;;-1:-1:-1;2874:2:1;2859:18;;2846:32;;-1:-1:-1;2930:3:1;2915:19;;2902:33;2944:30;2902:33;2944:30;:::i;:::-;2993:7;2983:17;;;2480:526;;;;;;;;:::o;3011:450::-;3085:6;3093;3101;3154:2;3142:9;3133:7;3129:23;3125:32;3122:2;;;3170:1;3167;3160:12;3122:2;3209:9;3196:23;3228:31;3253:5;3228:31;:::i;:::-;3278:5;-1:-1:-1;3330:2:1;3315:18;;3302:32;;-1:-1:-1;3386:2:1;3371:18;;3358:32;3399:30;3358:32;3399:30;:::i;:::-;3448:7;3438:17;;;3112:349;;;;;:::o;3466:773::-;3588:6;3596;3604;3612;3665:2;3653:9;3644:7;3640:23;3636:32;3633:2;;;3681:1;3678;3671:12;3633:2;3721:9;3708:23;3750:18;3791:2;3783:6;3780:14;3777:2;;;3807:1;3804;3797:12;3777:2;3846:70;3908:7;3899:6;3888:9;3884:22;3846:70;:::i;:::-;3935:8;;-1:-1:-1;3820:96:1;-1:-1:-1;4023:2:1;4008:18;;3995:32;;-1:-1:-1;4039:16:1;;;4036:2;;;4068:1;4065;4058:12;4036:2;;4107:72;4171:7;4160:8;4149:9;4145:24;4107:72;:::i;:::-;3623:616;;;;-1:-1:-1;4198:8:1;-1:-1:-1;;;;3623:616:1:o;4244:245::-;4311:6;4364:2;4352:9;4343:7;4339:23;4335:32;4332:2;;;4380:1;4377;4370:12;4332:2;4412:9;4406:16;4431:28;4453:5;4431:28;:::i;4494:184::-;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:2;;;4633:1;4630;4623:12;4585:2;-1:-1:-1;4656:16:1;;4575:103;-1:-1:-1;4575:103:1:o;4683:461::-;4736:3;4774:5;4768:12;4801:6;4796:3;4789:19;4827:4;4856:2;4851:3;4847:12;4840:19;;4893:2;4886:5;4882:14;4914:1;4924:195;4938:6;4935:1;4932:13;4924:195;;;5003:13;;-1:-1:-1;;;;;4999:39:1;4987:52;;5059:12;;;;5094:15;;;;5035:1;4953:9;4924:195;;;-1:-1:-1;5135:3:1;;4744:400;-1:-1:-1;;;;;4744:400:1:o;5149:274::-;5278:3;5316:6;5310:13;5332:53;5378:6;5373:3;5366:4;5358:6;5354:17;5332:53;:::i;:::-;5401:16;;;;;5286:137;-1:-1:-1;;5286:137:1:o;7427:332::-;7634:2;7623:9;7616:21;7597:4;7654:56;7706:2;7695:9;7691:18;7683:6;7654:56;:::i;:::-;7646:64;;7746:6;7741:2;7730:9;7726:18;7719:34;7606:153;;;;;:::o;7764:429::-;7999:2;7988:9;7981:21;7962:4;8019:56;8071:2;8060:9;8056:18;8048:6;8019:56;:::i;:::-;8106:2;8091:18;;8084:34;;;;-1:-1:-1;;;;;;8154:32:1;;;;8149:2;8134:18;;;8127:60;8011:64;7971:222;-1:-1:-1;7971:222:1:o;8844:383::-;8993:2;8982:9;8975:21;8956:4;9025:6;9019:13;9068:6;9063:2;9052:9;9048:18;9041:34;9084:66;9143:6;9138:2;9127:9;9123:18;9118:2;9110:6;9106:15;9084:66;:::i;:::-;9211:2;9190:15;-1:-1:-1;;9186:29:1;9171:45;;;;9218:2;9167:54;;8965:262;-1:-1:-1;;8965:262:1:o;12146:347::-;12348:2;12330:21;;;12387:2;12367:18;;;12360:30;12426:25;12421:2;12406:18;;12399:53;12484:2;12469:18;;12320:173::o;14432:355::-;14634:2;14616:21;;;14673:2;14653:18;;;14646:30;14712:33;14707:2;14692:18;;14685:61;14778:2;14763:18;;14606:181::o;16095:125::-;16135:4;16163:1;16160;16157:8;16154:2;;;16168:18;;:::i;:::-;-1:-1:-1;16205:9:1;;16144:76::o;16225:258::-;16297:1;16307:113;16321:6;16318:1;16315:13;16307:113;;;16397:11;;;16391:18;16378:11;;;16371:39;16343:2;16336:10;16307:113;;;16438:6;16435:1;16432:13;16429:2;;;16473:1;16464:6;16459:3;16455:16;16448:27;16429:2;;16278:205;;;:::o;16488:135::-;16527:3;-1:-1:-1;;16548:17:1;;16545:2;;;16568:18;;:::i;:::-;-1:-1:-1;16615:1:1;16604:13;;16535:88::o;16628:127::-;16689:10;16684:3;16680:20;16677:1;16670:31;16720:4;16717:1;16710:15;16744:4;16741:1;16734:15;16760:127;16821:10;16816:3;16812:20;16809:1;16802:31;16852:4;16849:1;16842:15;16876:4;16873:1;16866:15;16892:127;16953:10;16948:3;16944:20;16941:1;16934:31;16984:4;16981:1;16974:15;17008:4;17005:1;16998:15;17024:131;-1:-1:-1;;;;;17099:31:1;;17089:42;;17079:2;;17145:1;17142;17135:12;17079:2;17069:86;:::o;17160:118::-;17246:5;17239:13;17232:21;17225:5;17222:32;17212:2;;17268:1;17265;17258:12
Swarm Source
ipfs://1b4bfd7a86ca262e4c4161e5aef4cd82a380b5047c940a6a4a1a7f4021179201
Loading...
Loading
Loading...
Loading
OVERVIEW
Connects RAI from the Feeder Pool to Aave V2.Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.