Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DefaultTimeLockStrategy
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import "../interfaces/ITimeLockStrategy.sol"; import "../protocol/libraries/helpers/Errors.sol"; contract DefaultTimeLockStrategy is ITimeLockStrategy { address private immutable POOL; uint256 public immutable MIN_THRESHOLD; uint256 public immutable MID_THRESHOLD; uint48 public immutable MIN_WAIT_TIME; uint48 public immutable MID_WAIT_TIME; uint48 public immutable MAX_WAIT_TIME; uint48 public immutable POOL_PERIOD_WAIT_TIME; uint256 public immutable POOL_PERIOD_LIMIT; uint256 public immutable PERIOD; uint128 public totalAmountInCurrentPeriod; uint48 public lastResetTimestamp; event PeriodReset(); modifier onlyPool() { require(msg.sender == POOL, Errors.CALLER_MUST_BE_POOL); _; } constructor( address pool, uint256 minThreshold, uint256 midThreshold, uint48 minWaitTime, uint48 midWaitTime, uint48 maxWaitTime, uint256 poolPeriodLimit, uint48 poolPeriodWaitTime, uint256 period ) { POOL = pool; require(minThreshold < midThreshold, "minThreshold > midThreshold"); require(minWaitTime < midWaitTime, "minWaitTime > midWaitTime"); require(midWaitTime < maxWaitTime, "midWaitTime > maxWaitTime"); require(poolPeriodLimit > 0, "poolPeriodLimit can't be 0"); MIN_THRESHOLD = minThreshold; MID_THRESHOLD = midThreshold; MIN_WAIT_TIME = minWaitTime; MID_WAIT_TIME = midWaitTime; MAX_WAIT_TIME = maxWaitTime; POOL_PERIOD_LIMIT = poolPeriodLimit; POOL_PERIOD_WAIT_TIME = poolPeriodWaitTime; PERIOD = period; } function _updatePeriodLimit(uint48 currentTimestamp, uint128 amount) internal returns (uint48 extraDelay) { if (currentTimestamp - lastResetTimestamp >= PERIOD) { totalAmountInCurrentPeriod = 0; lastResetTimestamp = currentTimestamp; emit PeriodReset(); } uint256 newTotalAmountInCurrentPeriod = totalAmountInCurrentPeriod + amount; totalAmountInCurrentPeriod = uint128(newTotalAmountInCurrentPeriod); if (newTotalAmountInCurrentPeriod > POOL_PERIOD_LIMIT) { extraDelay = POOL_PERIOD_WAIT_TIME; } } function calculateTimeLockParams( DataTypes.TimeLockFactorParams calldata params ) external onlyPool returns (DataTypes.TimeLockParams memory) { uint48 currentTimestamp = uint48(block.timestamp); DataTypes.TimeLockParams memory timeLockParams; timeLockParams.releaseTime += currentTimestamp + _updatePeriodLimit(currentTimestamp, uint128(params.amount)); if (params.amount < MIN_THRESHOLD) { timeLockParams.releaseTime += MIN_WAIT_TIME; } else if (params.amount < MID_THRESHOLD) { timeLockParams.releaseTime += MID_WAIT_TIME; } else { timeLockParams.releaseTime += MAX_WAIT_TIME; } return timeLockParams; } function getTimeLockStrategyData() external view returns (TimeLockStrategyData memory timeLockStrategyData) { timeLockStrategyData.minThreshold = MIN_THRESHOLD; timeLockStrategyData.midThreshold = MID_THRESHOLD; timeLockStrategyData.minWaitTime = MIN_WAIT_TIME; timeLockStrategyData.midWaitTime = MID_WAIT_TIME; timeLockStrategyData.maxWaitTime = MAX_WAIT_TIME; timeLockStrategyData.poolPeriodLimit = POOL_PERIOD_LIMIT; timeLockStrategyData.poolPeriodWaitTime = POOL_PERIOD_WAIT_TIME; timeLockStrategyData.period = PERIOD; timeLockStrategyData .totalAmountInCurrentPeriod = totalAmountInCurrentPeriod; timeLockStrategyData.lastResetTimestamp = lastResetTimestamp; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; // prettier-ignore enum OrderType { // 0: no partial fills, anyone can execute FULL_OPEN, // 1: partial fills supported, anyone can execute PARTIAL_OPEN, // 2: no partial fills, only offerer or zone can execute FULL_RESTRICTED, // 3: partial fills supported, only offerer or zone can execute PARTIAL_RESTRICTED } // prettier-ignore enum BasicOrderType { // 0: no partial fills, anyone can execute ETH_TO_ERC721_FULL_OPEN, // 1: partial fills supported, anyone can execute ETH_TO_ERC721_PARTIAL_OPEN, // 2: no partial fills, only offerer or zone can execute ETH_TO_ERC721_FULL_RESTRICTED, // 3: partial fills supported, only offerer or zone can execute ETH_TO_ERC721_PARTIAL_RESTRICTED, // 4: no partial fills, anyone can execute ETH_TO_ERC1155_FULL_OPEN, // 5: partial fills supported, anyone can execute ETH_TO_ERC1155_PARTIAL_OPEN, // 6: no partial fills, only offerer or zone can execute ETH_TO_ERC1155_FULL_RESTRICTED, // 7: partial fills supported, only offerer or zone can execute ETH_TO_ERC1155_PARTIAL_RESTRICTED, // 8: no partial fills, anyone can execute ERC20_TO_ERC721_FULL_OPEN, // 9: partial fills supported, anyone can execute ERC20_TO_ERC721_PARTIAL_OPEN, // 10: no partial fills, only offerer or zone can execute ERC20_TO_ERC721_FULL_RESTRICTED, // 11: partial fills supported, only offerer or zone can execute ERC20_TO_ERC721_PARTIAL_RESTRICTED, // 12: no partial fills, anyone can execute ERC20_TO_ERC1155_FULL_OPEN, // 13: partial fills supported, anyone can execute ERC20_TO_ERC1155_PARTIAL_OPEN, // 14: no partial fills, only offerer or zone can execute ERC20_TO_ERC1155_FULL_RESTRICTED, // 15: partial fills supported, only offerer or zone can execute ERC20_TO_ERC1155_PARTIAL_RESTRICTED, // 16: no partial fills, anyone can execute ERC721_TO_ERC20_FULL_OPEN, // 17: partial fills supported, anyone can execute ERC721_TO_ERC20_PARTIAL_OPEN, // 18: no partial fills, only offerer or zone can execute ERC721_TO_ERC20_FULL_RESTRICTED, // 19: partial fills supported, only offerer or zone can execute ERC721_TO_ERC20_PARTIAL_RESTRICTED, // 20: no partial fills, anyone can execute ERC1155_TO_ERC20_FULL_OPEN, // 21: partial fills supported, anyone can execute ERC1155_TO_ERC20_PARTIAL_OPEN, // 22: no partial fills, only offerer or zone can execute ERC1155_TO_ERC20_FULL_RESTRICTED, // 23: partial fills supported, only offerer or zone can execute ERC1155_TO_ERC20_PARTIAL_RESTRICTED } // prettier-ignore enum BasicOrderRouteType { // 0: provide Ether (or other native token) to receive offered ERC721 item. ETH_TO_ERC721, // 1: provide Ether (or other native token) to receive offered ERC1155 item. ETH_TO_ERC1155, // 2: provide ERC20 item to receive offered ERC721 item. ERC20_TO_ERC721, // 3: provide ERC20 item to receive offered ERC1155 item. ERC20_TO_ERC1155, // 4: provide ERC721 item to receive offered ERC20 item. ERC721_TO_ERC20, // 5: provide ERC1155 item to receive offered ERC20 item. ERC1155_TO_ERC20 } // prettier-ignore enum ItemType { // 0: ETH on mainnet, MATIC on polygon, etc. NATIVE, // 1: ERC20 items (ERC777 and ERC20 analogues could also technically work) ERC20, // 2: ERC721 items ERC721, // 3: ERC1155 items ERC1155, // 4: ERC721 items where a number of tokenIds are supported ERC721_WITH_CRITERIA, // 5: ERC1155 items where a number of ids are supported ERC1155_WITH_CRITERIA } // prettier-ignore enum Side { // 0: Items that can be spent OFFER, // 1: Items that must be received CONSIDERATION }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import { OrderType, BasicOrderType, ItemType, Side } from "./ConsiderationEnums.sol"; /** * @dev An order contains eleven components: an offerer, a zone (or account that * can cancel the order or restrict who can fulfill the order depending on * the type), the order type (specifying partial fill support as well as * restricted order status), the start and end time, a hash that will be * provided to the zone when validating restricted orders, a salt, a key * corresponding to a given conduit, a counter, and an arbitrary number of * offer items that can be spent along with consideration items that must * be received by their respective recipient. */ struct OrderComponents { address offerer; address zone; OfferItem[] offer; ConsiderationItem[] consideration; OrderType orderType; uint256 startTime; uint256 endTime; bytes32 zoneHash; uint256 salt; bytes32 conduitKey; uint256 counter; } /** * @dev An offer item has five components: an item type (ETH or other native * tokens, ERC20, ERC721, and ERC1155, as well as criteria-based ERC721 and * ERC1155), a token address, a dual-purpose "identifierOrCriteria" * component that will either represent a tokenId or a merkle root * depending on the item type, and a start and end amount that support * increasing or decreasing amounts over the duration of the respective * order. */ struct OfferItem { ItemType itemType; address token; uint256 identifierOrCriteria; uint256 startAmount; uint256 endAmount; } /** * @dev A consideration item has the same five components as an offer item and * an additional sixth component designating the required recipient of the * item. */ struct ConsiderationItem { ItemType itemType; address token; uint256 identifierOrCriteria; uint256 startAmount; uint256 endAmount; address payable recipient; } /** * @dev A spent item is translated from a utilized offer item and has four * components: an item type (ETH or other native tokens, ERC20, ERC721, and * ERC1155), a token address, a tokenId, and an amount. */ struct SpentItem { ItemType itemType; address token; uint256 identifier; uint256 amount; } /** * @dev A received item is translated from a utilized consideration item and has * the same four components as a spent item, as well as an additional fifth * component designating the required recipient of the item. */ struct ReceivedItem { ItemType itemType; address token; uint256 identifier; uint256 amount; address payable recipient; } /** * @dev For basic orders involving ETH / native / ERC20 <=> ERC721 / ERC1155 * matching, a group of six functions may be called that only requires a * subset of the usual order arguments. Note the use of a "basicOrderType" * enum; this represents both the usual order type as well as the "route" * of the basic order (a simple derivation function for the basic order * type is `basicOrderType = orderType + (4 * basicOrderRoute)`.) */ struct BasicOrderParameters { // calldata offset address considerationToken; // 0x24 uint256 considerationIdentifier; // 0x44 uint256 considerationAmount; // 0x64 address payable offerer; // 0x84 address zone; // 0xa4 address offerToken; // 0xc4 uint256 offerIdentifier; // 0xe4 uint256 offerAmount; // 0x104 BasicOrderType basicOrderType; // 0x124 uint256 startTime; // 0x144 uint256 endTime; // 0x164 bytes32 zoneHash; // 0x184 uint256 salt; // 0x1a4 bytes32 offererConduitKey; // 0x1c4 bytes32 fulfillerConduitKey; // 0x1e4 uint256 totalOriginalAdditionalRecipients; // 0x204 AdditionalRecipient[] additionalRecipients; // 0x224 bytes signature; // 0x244 // Total length, excluding dynamic array data: 0x264 (580) } /** * @dev Basic orders can supply any number of additional recipients, with the * implied assumption that they are supplied from the offered ETH (or other * native token) or ERC20 token for the order. */ struct AdditionalRecipient { uint256 amount; address payable recipient; } /** * @dev The full set of order components, with the exception of the counter, * must be supplied when fulfilling more sophisticated orders or groups of * orders. The total number of original consideration items must also be * supplied, as the caller may specify additional consideration items. */ struct OrderParameters { address offerer; // 0x00 address zone; // 0x20 OfferItem[] offer; // 0x40 ConsiderationItem[] consideration; // 0x60 OrderType orderType; // 0x80 uint256 startTime; // 0xa0 uint256 endTime; // 0xc0 bytes32 zoneHash; // 0xe0 uint256 salt; // 0x100 bytes32 conduitKey; // 0x120 uint256 totalOriginalConsiderationItems; // 0x140 // offer.length // 0x160 } /** * @dev Orders require a signature in addition to the other order parameters. */ struct Order { OrderParameters parameters; bytes signature; } /** * @dev Advanced orders include a numerator (i.e. a fraction to attempt to fill) * and a denominator (the total size of the order) in addition to the * signature and other order parameters. It also supports an optional field * for supplying extra data; this data will be included in a staticcall to * `isValidOrderIncludingExtraData` on the zone for the order if the order * type is restricted and the offerer or zone are not the caller. */ struct AdvancedOrder { OrderParameters parameters; uint120 numerator; uint120 denominator; bytes signature; bytes extraData; } /** * @dev Orders can be validated (either explicitly via `validate`, or as a * consequence of a full or partial fill), specifically cancelled (they can * also be cancelled in bulk via incrementing a per-zone counter), and * partially or fully filled (with the fraction filled represented by a * numerator and denominator). */ struct OrderStatus { bool isValidated; bool isCancelled; uint120 numerator; uint120 denominator; } /** * @dev A criteria resolver specifies an order, side (offer vs. consideration), * and item index. It then provides a chosen identifier (i.e. tokenId) * alongside a merkle proof demonstrating the identifier meets the required * criteria. */ struct CriteriaResolver { uint256 orderIndex; Side side; uint256 index; uint256 identifier; bytes32[] criteriaProof; } /** * @dev A fulfillment is applied to a group of orders. It decrements a series of * offer and consideration items, then generates a single execution * element. A given fulfillment can be applied to as many offer and * consideration items as desired, but must contain at least one offer and * at least one consideration that match. The fulfillment must also remain * consistent on all key parameters across all offer items (same offerer, * token, type, tokenId, and conduit preference) as well as across all * consideration items (token, type, tokenId, and recipient). */ struct Fulfillment { FulfillmentComponent[] offerComponents; FulfillmentComponent[] considerationComponents; } /** * @dev Each fulfillment component contains one index referencing a specific * order and another referencing a specific offer or consideration item. */ struct FulfillmentComponent { uint256 orderIndex; uint256 itemIndex; } /** * @dev An execution is triggered once all consideration items have been zeroed * out. It sends the item in question from the offerer to the item's * recipient, optionally sourcing approvals from either this contract * directly or from the offerer's chosen conduit if one is specified. An * execution is not provided as an argument, but rather is derived via * orders, criteria resolvers, and fulfillments (where the total number of * executions will be less than or equal to the total number of indicated * fulfillments) and returned as part of `matchOrders`. */ struct Execution { ReceivedItem item; address offerer; bytes32 conduitKey; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.10; import {DataTypes} from "../protocol/libraries/types/DataTypes.sol"; // ITimeLockStrategy defines an interface for implementing custom time lock strategies. interface ITimeLockStrategy { struct TimeLockStrategyData { uint256 minThreshold; uint256 midThreshold; uint48 minWaitTime; uint48 midWaitTime; uint48 maxWaitTime; uint48 poolPeriodWaitTime; uint256 poolPeriodLimit; uint256 period; uint128 totalAmountInCurrentPeriod; uint48 lastResetTimestamp; } /** * @dev Calculates the time lock parameters based on the provided factor params. * * @param params The TimeLockFactorParams struct containing relevant information to calculate time lock params. * @return A TimeLockParams struct containing the calculated time lock parameters. */ function calculateTimeLockParams( DataTypes.TimeLockFactorParams calldata params ) external returns (DataTypes.TimeLockParams memory); function getTimeLockStrategyData() external view returns (TimeLockStrategyData memory); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; /** * @title Errors library * * @notice Defines the error messages emitted by the different contracts of the ParaSpace protocol */ library Errors { string public constant CALLER_NOT_POOL_ADMIN = "1"; // 'The caller of the function is not a pool admin' string public constant CALLER_NOT_EMERGENCY_ADMIN = "2"; // 'The caller of the function is not an emergency admin' string public constant CALLER_NOT_POOL_OR_EMERGENCY_ADMIN = "3"; // 'The caller of the function is not a pool or emergency admin' string public constant CALLER_NOT_RISK_OR_POOL_ADMIN = "4"; // 'The caller of the function is not a risk or pool admin' string public constant CALLER_NOT_ASSET_LISTING_OR_POOL_ADMIN = "5"; // 'The caller of the function is not an asset listing or pool admin' string public constant CALLER_NOT_BRIDGE = "6"; // 'The caller of the function is not a bridge' string public constant ADDRESSES_PROVIDER_NOT_REGISTERED = "7"; // 'Pool addresses provider is not registered' string public constant INVALID_ADDRESSES_PROVIDER_ID = "8"; // 'Invalid id for the pool addresses provider' string public constant NOT_CONTRACT = "9"; // 'Address is not a contract' string public constant CALLER_NOT_POOL_CONFIGURATOR = "10"; // 'The caller of the function is not the pool configurator' string public constant CALLER_NOT_XTOKEN = "11"; // 'The caller of the function is not an PToken or NToken' string public constant INVALID_ADDRESSES_PROVIDER = "12"; // 'The address of the pool addresses provider is invalid' string public constant RESERVE_ALREADY_ADDED = "14"; // 'Reserve has already been added to reserve list' string public constant NO_MORE_RESERVES_ALLOWED = "15"; // 'Maximum amount of reserves in the pool reached' string public constant RESERVE_LIQUIDITY_NOT_ZERO = "18"; // 'The liquidity of the reserve needs to be 0' string public constant INVALID_RESERVE_PARAMS = "20"; // 'Invalid risk parameters for the reserve' string public constant CALLER_MUST_BE_POOL = "23"; // 'The caller of this function must be a pool' string public constant INVALID_MINT_AMOUNT = "24"; // 'Invalid amount to mint' string public constant INVALID_BURN_AMOUNT = "25"; // 'Invalid amount to burn' string public constant INVALID_AMOUNT = "26"; // 'Amount must be greater than 0' string public constant RESERVE_INACTIVE = "27"; // 'Action requires an active reserve' string public constant RESERVE_FROZEN = "28"; // 'Action cannot be performed because the reserve is frozen' string public constant RESERVE_PAUSED = "29"; // 'Action cannot be performed because the reserve is paused' string public constant BORROWING_NOT_ENABLED = "30"; // 'Borrowing is not enabled' string public constant STABLE_BORROWING_NOT_ENABLED = "31"; // 'Stable borrowing is not enabled' string public constant NOT_ENOUGH_AVAILABLE_USER_BALANCE = "32"; // 'User cannot withdraw more than the available balance' string public constant INVALID_INTEREST_RATE_MODE_SELECTED = "33"; // 'Invalid interest rate mode selected' string public constant COLLATERAL_BALANCE_IS_ZERO = "34"; // 'The collateral balance is 0' string public constant HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = "35"; // 'Health factor is lesser than the liquidation threshold' string public constant COLLATERAL_CANNOT_COVER_NEW_BORROW = "36"; // 'There is not enough collateral to cover a new borrow' string public constant COLLATERAL_SAME_AS_BORROWING_CURRENCY = "37"; // 'Collateral is (mostly) the same currency that is being borrowed' string public constant AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = "38"; // 'The requested amount is greater than the max loan size in stable rate mode' string public constant NO_DEBT_OF_SELECTED_TYPE = "39"; // 'For repayment of a specific type of debt, the user needs to have debt that type' string public constant NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = "40"; // 'To repay on behalf of a user an explicit amount to repay is needed' string public constant NO_OUTSTANDING_STABLE_DEBT = "41"; // 'User does not have outstanding stable rate debt on this reserve' string public constant NO_OUTSTANDING_VARIABLE_DEBT = "42"; // 'User does not have outstanding variable rate debt on this reserve' string public constant UNDERLYING_BALANCE_ZERO = "43"; // 'The underlying balance needs to be greater than 0' string public constant INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = "44"; // 'Interest rate rebalance conditions were not met' string public constant HEALTH_FACTOR_NOT_BELOW_THRESHOLD = "45"; // 'Health factor is not below the threshold' string public constant COLLATERAL_CANNOT_BE_AUCTIONED_OR_LIQUIDATED = "46"; // 'The collateral chosen cannot be auctioned OR liquidated' string public constant SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = "47"; // 'User did not borrow the specified currency' string public constant SAME_BLOCK_BORROW_REPAY = "48"; // 'Borrow and repay in same block is not allowed' string public constant BORROW_CAP_EXCEEDED = "50"; // 'Borrow cap is exceeded' string public constant SUPPLY_CAP_EXCEEDED = "51"; // 'Supply cap is exceeded' string public constant XTOKEN_SUPPLY_NOT_ZERO = "54"; // 'PToken supply is not zero' string public constant STABLE_DEBT_NOT_ZERO = "55"; // 'Stable debt supply is not zero' string public constant VARIABLE_DEBT_SUPPLY_NOT_ZERO = "56"; // 'Variable debt supply is not zero' string public constant LTV_VALIDATION_FAILED = "57"; // 'Ltv validation failed' string public constant PRICE_ORACLE_SENTINEL_CHECK_FAILED = "59"; // 'Price oracle sentinel validation failed' string public constant RESERVE_ALREADY_INITIALIZED = "61"; // 'Reserve has already been initialized' string public constant INVALID_LTV = "63"; // 'Invalid ltv parameter for the reserve' string public constant INVALID_LIQ_THRESHOLD = "64"; // 'Invalid liquidity threshold parameter for the reserve' string public constant INVALID_LIQ_BONUS = "65"; // 'Invalid liquidity bonus parameter for the reserve' string public constant INVALID_DECIMALS = "66"; // 'Invalid decimals parameter of the underlying asset of the reserve' string public constant INVALID_RESERVE_FACTOR = "67"; // 'Invalid reserve factor parameter for the reserve' string public constant INVALID_BORROW_CAP = "68"; // 'Invalid borrow cap for the reserve' string public constant INVALID_SUPPLY_CAP = "69"; // 'Invalid supply cap for the reserve' string public constant INVALID_LIQUIDATION_PROTOCOL_FEE = "70"; // 'Invalid liquidation protocol fee for the reserve' string public constant INVALID_DEBT_CEILING = "73"; // 'Invalid debt ceiling for the reserve string public constant INVALID_RESERVE_INDEX = "74"; // 'Invalid reserve index' string public constant ACL_ADMIN_CANNOT_BE_ZERO = "75"; // 'ACL admin cannot be set to the zero address' string public constant INCONSISTENT_PARAMS_LENGTH = "76"; // 'Array parameters that should be equal length are not' string public constant ZERO_ADDRESS_NOT_VALID = "77"; // 'Zero address not valid' string public constant INVALID_EXPIRATION = "78"; // 'Invalid expiration' string public constant INVALID_SIGNATURE = "79"; // 'Invalid signature' string public constant OPERATION_NOT_SUPPORTED = "80"; // 'Operation not supported' string public constant ASSET_NOT_LISTED = "82"; // 'Asset is not listed' string public constant INVALID_OPTIMAL_USAGE_RATIO = "83"; // 'Invalid optimal usage ratio' string public constant INVALID_OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO = "84"; // 'Invalid optimal stable to total debt ratio' string public constant UNDERLYING_CANNOT_BE_RESCUED = "85"; // 'The underlying asset cannot be rescued' string public constant ADDRESSES_PROVIDER_ALREADY_ADDED = "86"; // 'Reserve has already been added to reserve list' string public constant POOL_ADDRESSES_DO_NOT_MATCH = "87"; // 'The token implementation pool address and the pool address provided by the initializing pool do not match' string public constant STABLE_BORROWING_ENABLED = "88"; // 'Stable borrowing is enabled' string public constant SILOED_BORROWING_VIOLATION = "89"; // 'User is trying to borrow multiple assets including a siloed one' string public constant RESERVE_DEBT_NOT_ZERO = "90"; // the total debt of the reserve needs to be 0 string public constant NOT_THE_OWNER = "91"; // user is not the owner of a given asset string public constant LIQUIDATION_AMOUNT_NOT_ENOUGH = "92"; string public constant INVALID_ASSET_TYPE = "93"; // invalid asset type for action. string public constant INVALID_FLASH_CLAIM_RECEIVER = "94"; // invalid flash claim receiver. string public constant ERC721_HEALTH_FACTOR_NOT_BELOW_THRESHOLD = "95"; // ERC721 Health factor is not below the threshold. Can only liquidate ERC20. string public constant UNDERLYING_ASSET_CAN_NOT_BE_TRANSFERRED = "96"; //underlying asset can not be transferred. string public constant TOKEN_TRANSFERRED_CAN_NOT_BE_SELF_ADDRESS = "97"; //token transferred can not be self address. string public constant INVALID_AIRDROP_CONTRACT_ADDRESS = "98"; //invalid airdrop contract address. string public constant INVALID_AIRDROP_PARAMETERS = "99"; //invalid airdrop parameters. string public constant CALL_AIRDROP_METHOD_FAILED = "100"; //call airdrop method failed. string public constant SUPPLIER_NOT_NTOKEN = "101"; //supplier is not the NToken contract string public constant CALL_MARKETPLACE_FAILED = "102"; //call marketplace failed. string public constant INVALID_MARKETPLACE_ID = "103"; //invalid marketplace id. string public constant INVALID_MARKETPLACE_ORDER = "104"; //invalid marketplace id. string public constant CREDIT_DOES_NOT_MATCH_ORDER = "105"; //credit doesn't match order. string public constant PAYNOW_NOT_ENOUGH = "106"; //paynow not enough. string public constant INVALID_CREDIT_SIGNATURE = "107"; //invalid credit signature. string public constant INVALID_ORDER_TAKER = "108"; //invalid order taker. string public constant MARKETPLACE_PAUSED = "109"; //marketplace paused. string public constant INVALID_AUCTION_RECOVERY_HEALTH_FACTOR = "110"; //invalid auction recovery health factor. string public constant AUCTION_ALREADY_STARTED = "111"; //auction already started. string public constant AUCTION_NOT_STARTED = "112"; //auction not started yet. string public constant AUCTION_NOT_ENABLED = "113"; //auction not enabled on the reserve. string public constant ERC721_HEALTH_FACTOR_NOT_ABOVE_THRESHOLD = "114"; //ERC721 Health factor is not above the threshold. string public constant TOKEN_IN_AUCTION = "115"; //tokenId is in auction. string public constant AUCTIONED_BALANCE_NOT_ZERO = "116"; //auctioned balance not zero. string public constant LIQUIDATOR_CAN_NOT_BE_SELF = "117"; //user can not liquidate himself. string public constant INVALID_RECIPIENT = "118"; //invalid recipient specified in order. string public constant UNIV3_NOT_ALLOWED = "119"; //flash claim is not allowed for UniswapV3. string public constant NTOKEN_BALANCE_EXCEEDED = "120"; //ntoken balance exceed limit. string public constant ORACLE_PRICE_NOT_READY = "121"; //oracle price not ready. string public constant SET_ORACLE_SOURCE_NOT_ALLOWED = "122"; //source of oracle not allowed to set. string public constant INVALID_LIQUIDATION_ASSET = "123"; //invalid liquidation asset. string public constant ONLY_UNIV3_ALLOWED = "124"; //only UniswapV3 allowed. string public constant GLOBAL_DEBT_IS_ZERO = "125"; //liquidation is not allowed when global debt is zero. string public constant ORACLE_PRICE_EXPIRED = "126"; //oracle price expired. string public constant APE_STAKING_POSITION_EXISTED = "127"; //ape staking position is existed. string public constant SAPE_NOT_ALLOWED = "128"; //operation is not allow for sApe. string public constant TOTAL_STAKING_AMOUNT_WRONG = "129"; //cash plus borrow amount not equal to total staking amount. string public constant NOT_THE_BAKC_OWNER = "130"; //user is not the bakc owner. string public constant CALLER_NOT_EOA = "131"; //The caller of the function is not an EOA account string public constant MAKER_SAME_AS_TAKER = "132"; //maker and taker shouldn't be the same address }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.10; import {OfferItem, ConsiderationItem} from "../../../dependencies/seaport/contracts/lib/ConsiderationStructs.sol"; library DataTypes { enum AssetType { ERC20, ERC721 } address public constant SApeAddress = address(0x1); uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; struct ReserveData { //stores the reserve configuration ReserveConfigurationMap configuration; //the liquidity index. Expressed in ray uint128 liquidityIndex; //the current supply rate. Expressed in ray uint128 currentLiquidityRate; //variable borrow index. Expressed in ray uint128 variableBorrowIndex; //the current variable borrow rate. Expressed in ray uint128 currentVariableBorrowRate; //timestamp of last update uint40 lastUpdateTimestamp; //the id of the reserve. Represents the position in the list of the active reserves uint16 id; //xToken address address xTokenAddress; //variableDebtToken address address variableDebtTokenAddress; //address of the interest rate strategy address interestRateStrategyAddress; //address of the auction strategy address auctionStrategyAddress; //the current treasury balance, scaled uint128 accruedToTreasury; // timelock strategy address timeLockStrategyAddress; } struct ReserveConfigurationMap { //bit 0-15: LTV //bit 16-31: Liq. threshold //bit 32-47: Liq. bonus //bit 48-55: Decimals //bit 56: reserve is active //bit 57: reserve is frozen //bit 58: borrowing is enabled //bit 59: stable rate borrowing enabled //bit 60: asset is paused //bit 61: borrowing in isolation mode is enabled //bit 62-63: reserved //bit 64-79: reserve factor //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap //bit 152-167 liquidation protocol fee //bit 168-175 eMode category //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals //bit 252-255 unused uint256 data; } struct UserConfigurationMap { /** * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. * The first bit indicates if an asset is used as collateral by the user, the second whether an * asset is borrowed by the user. */ uint256 data; // auction validity time for closing invalid auctions in one tx. uint256 auctionValidityTime; } struct ERC721SupplyParams { uint256 tokenId; bool useAsCollateral; } struct NTokenData { uint256 tokenId; uint256 multiplier; bool useAsCollateral; bool isAuctioned; } struct ReserveCache { uint256 currScaledVariableDebt; uint256 nextScaledVariableDebt; uint256 currLiquidityIndex; uint256 nextLiquidityIndex; uint256 currVariableBorrowIndex; uint256 nextVariableBorrowIndex; uint256 currLiquidityRate; uint256 currVariableBorrowRate; uint256 reserveFactor; ReserveConfigurationMap reserveConfiguration; address xTokenAddress; address variableDebtTokenAddress; uint40 reserveLastUpdateTimestamp; } struct ExecuteLiquidateParams { uint256 reservesCount; uint256 liquidationAmount; uint256 collateralTokenId; uint256 auctionRecoveryHealthFactor; address weth; address collateralAsset; address liquidationAsset; address borrower; address liquidator; bool receiveXToken; address priceOracle; address priceOracleSentinel; } struct ExecuteAuctionParams { uint256 reservesCount; uint256 auctionRecoveryHealthFactor; uint256 collateralTokenId; address collateralAsset; address user; address priceOracle; } struct ExecuteSupplyParams { address asset; uint256 amount; address onBehalfOf; address payer; uint16 referralCode; } struct ExecuteSupplyERC721Params { address asset; DataTypes.ERC721SupplyParams[] tokenData; address onBehalfOf; address payer; uint16 referralCode; } struct ExecuteBorrowParams { address asset; address user; address onBehalfOf; uint256 amount; uint16 referralCode; bool releaseUnderlying; uint256 reservesCount; address oracle; address priceOracleSentinel; } struct ExecuteRepayParams { address asset; uint256 amount; address onBehalfOf; address payer; bool usePTokens; } struct ExecuteWithdrawParams { address asset; uint256 amount; address to; uint256 reservesCount; address oracle; } struct ExecuteWithdrawERC721Params { address asset; uint256[] tokenIds; address to; uint256 reservesCount; address oracle; } struct ExecuteDecreaseUniswapV3LiquidityParams { address user; address asset; uint256 tokenId; uint256 reservesCount; uint128 liquidityDecrease; uint256 amount0Min; uint256 amount1Min; bool receiveEthAsWeth; address oracle; } struct FinalizeTransferParams { address asset; address from; address to; bool usedAsCollateral; uint256 amount; uint256 balanceFromBefore; uint256 balanceToBefore; uint256 reservesCount; address oracle; } struct FinalizeTransferERC721Params { address asset; address from; address to; bool usedAsCollateral; uint256 tokenId; uint256 balanceFromBefore; uint256 reservesCount; address oracle; } struct CalculateUserAccountDataParams { UserConfigurationMap userConfig; uint256 reservesCount; address user; address oracle; } struct ValidateBorrowParams { ReserveCache reserveCache; UserConfigurationMap userConfig; address asset; address userAddress; uint256 amount; uint256 reservesCount; address oracle; address priceOracleSentinel; } struct ValidateLiquidateERC20Params { ReserveCache liquidationAssetReserveCache; address liquidationAsset; address weth; uint256 totalDebt; uint256 healthFactor; uint256 liquidationAmount; uint256 actualLiquidationAmount; address priceOracleSentinel; } struct ValidateLiquidateERC721Params { ReserveCache liquidationAssetReserveCache; address liquidationAsset; address liquidator; address borrower; uint256 globalDebt; uint256 healthFactor; address collateralAsset; uint256 tokenId; address weth; uint256 actualLiquidationAmount; uint256 maxLiquidationAmount; uint256 auctionRecoveryHealthFactor; address priceOracleSentinel; address xTokenAddress; bool auctionEnabled; } struct ValidateAuctionParams { address user; uint256 auctionRecoveryHealthFactor; uint256 erc721HealthFactor; address collateralAsset; uint256 tokenId; address xTokenAddress; } struct CalculateInterestRatesParams { uint256 liquidityAdded; uint256 liquidityTaken; uint256 totalVariableDebt; uint256 reserveFactor; address reserve; address xToken; } struct InitReserveParams { address asset; address xTokenAddress; address variableDebtAddress; address interestRateStrategyAddress; address auctionStrategyAddress; address timeLockStrategyAddress; uint16 reservesCount; uint16 maxNumberReserves; } struct ExecuteFlashClaimParams { address receiverAddress; address[] nftAssets; uint256[][] nftTokenIds; bytes params; address oracle; } struct Credit { address token; uint256 amount; bytes orderId; uint8 v; bytes32 r; bytes32 s; } struct ExecuteMarketplaceParams { bytes32 marketplaceId; bytes payload; Credit credit; uint256 ethLeft; DataTypes.Marketplace marketplace; OrderInfo orderInfo; address weth; uint16 referralCode; uint256 reservesCount; address oracle; address priceOracleSentinel; } struct OrderInfo { address maker; address taker; bytes id; OfferItem[] offer; ConsiderationItem[] consideration; } struct Marketplace { address marketplace; address adapter; address operator; bool paused; } struct Auction { uint256 startTime; } struct AuctionData { address asset; uint256 tokenId; uint256 startTime; uint256 currentPriceMultiplier; uint256 maxPriceMultiplier; uint256 minExpPriceMultiplier; uint256 minPriceMultiplier; uint256 stepLinear; uint256 stepExp; uint256 tickLength; } struct TokenData { string symbol; address tokenAddress; } enum ApeCompoundType { SwapAndSupply } enum ApeCompoundTokenOut { USDC } struct ApeCompoundStrategy { ApeCompoundType ty; ApeCompoundTokenOut swapTokenOut; uint256 swapPercent; } struct PoolStorage { // Map of reserves and their data (underlyingAssetOfReserve => reserveData) mapping(address => ReserveData) _reserves; // Map of users address and their configuration data (userAddress => userConfiguration) mapping(address => UserConfigurationMap) _usersConfig; // List of reserves as a map (reserveId => reserve). // It is structured as a mapping for gas savings reasons, using the reserve id as index mapping(uint256 => address) _reservesList; // Maximum number of active reserves there have been in the protocol. It is the upper bound of the reserves list uint16 _reservesCount; // Auction recovery health factor uint64 _auctionRecoveryHealthFactor; // Incentive fee for claim ape reward to compound uint16 _apeCompoundFee; // Map of user's ape compound strategies mapping(address => ApeCompoundStrategy) _apeCompoundStrategies; } struct ReserveConfigData { uint256 decimals; uint256 ltv; uint256 liquidationThreshold; uint256 liquidationBonus; uint256 reserveFactor; bool usageAsCollateralEnabled; bool borrowingEnabled; bool isActive; bool isFrozen; bool isPaused; } struct TimeLockParams { uint48 releaseTime; TimeLockActionType actionType; } struct TimeLockFactorParams { AssetType assetType; address asset; uint256 amount; } enum TimeLockActionType { BORROW, WITHDRAW } }
{ "remappings": [ "contracts/=contracts/", "ds-test/=lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "pnm-contracts/=lib/pnm-contracts/" ], "optimizer": { "enabled": true, "runs": 1000 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"minThreshold","type":"uint256"},{"internalType":"uint256","name":"midThreshold","type":"uint256"},{"internalType":"uint48","name":"minWaitTime","type":"uint48"},{"internalType":"uint48","name":"midWaitTime","type":"uint48"},{"internalType":"uint48","name":"maxWaitTime","type":"uint48"},{"internalType":"uint256","name":"poolPeriodLimit","type":"uint256"},{"internalType":"uint48","name":"poolPeriodWaitTime","type":"uint48"},{"internalType":"uint256","name":"period","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"PeriodReset","type":"event"},{"inputs":[],"name":"MAX_WAIT_TIME","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MID_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MID_WAIT_TIME","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WAIT_TIME","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_PERIOD_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_PERIOD_WAIT_TIME","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"enum DataTypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct DataTypes.TimeLockFactorParams","name":"params","type":"tuple"}],"name":"calculateTimeLockParams","outputs":[{"components":[{"internalType":"uint48","name":"releaseTime","type":"uint48"},{"internalType":"enum DataTypes.TimeLockActionType","name":"actionType","type":"uint8"}],"internalType":"struct DataTypes.TimeLockParams","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTimeLockStrategyData","outputs":[{"components":[{"internalType":"uint256","name":"minThreshold","type":"uint256"},{"internalType":"uint256","name":"midThreshold","type":"uint256"},{"internalType":"uint48","name":"minWaitTime","type":"uint48"},{"internalType":"uint48","name":"midWaitTime","type":"uint48"},{"internalType":"uint48","name":"maxWaitTime","type":"uint48"},{"internalType":"uint48","name":"poolPeriodWaitTime","type":"uint48"},{"internalType":"uint256","name":"poolPeriodLimit","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint128","name":"totalAmountInCurrentPeriod","type":"uint128"},{"internalType":"uint48","name":"lastResetTimestamp","type":"uint48"}],"internalType":"struct ITimeLockStrategy.TimeLockStrategyData","name":"timeLockStrategyData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastResetTimestamp","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAmountInCurrentPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101a060405234801561001157600080fd5b50604051610d23380380610d23833981016040819052610030916101f3565b6001600160a01b0389166080528688106100915760405162461bcd60e51b815260206004820152601b60248201527f6d696e5468726573686f6c64203e206d69645468726573686f6c64000000000060448201526064015b60405180910390fd5b8465ffffffffffff168665ffffffffffff16106100f05760405162461bcd60e51b815260206004820152601960248201527f6d696e5761697454696d65203e206d69645761697454696d65000000000000006044820152606401610088565b8365ffffffffffff168565ffffffffffff161061014f5760405162461bcd60e51b815260206004820152601960248201527f6d69645761697454696d65203e206d61785761697454696d65000000000000006044820152606401610088565b6000831161019f5760405162461bcd60e51b815260206004820152601a60248201527f706f6f6c506572696f644c696d69742063616e277420626520300000000000006044820152606401610088565b60a09790975260c09590955265ffffffffffff93841660e05291831661010052821661012052610160521661014052610180525061028e565b805165ffffffffffff811681146101ee57600080fd5b919050565b60008060008060008060008060006101208a8c03121561021257600080fd5b89516001600160a01b038116811461022957600080fd5b60208b015160408c0151919a509850965061024660608b016101d8565b955061025460808b016101d8565b945061026260a08b016101d8565b935060c08a0151925061027760e08b016101d8565b91506101008a015190509295985092959850929598565b60805160a05160c05160e05161010051610120516101405161016051610180516109b661036d6000396000818161023501528181610334015261063801526000818160de015281816101e7015261073101526000818161020d015281816102dd01526107590152600081816101bf015281816103a901526105ef015260008181610197015281816103f001526105bd0152600081816101700152818161035b015261054f015260008181610143015281816102b601526105910152600081816101200152818161038201526105230152600061047201526109b66000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c8063b4d1d79511610081578063c2f866661161005b578063c2f86666146103a4578063edbc9768146103cb578063fe70f69d146103eb57600080fd5b8063b4d1d7951461032f578063bca67b9314610356578063bd11c4c01461037d57600080fd5b80638fa6a295116100b25780638fa6a295146102b1578063b0594468146102d8578063b343a0df1461031657600080fd5b806316fa4fe7146100d9578063468b8ffa146101135780635cdb8be814610286575b600080fd5b6101007f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b60408051610140810182527f000000000000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000602082015265ffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116828401527f0000000000000000000000000000000000000000000000000000000000000000811660608301527f0000000000000000000000000000000000000000000000000000000000000000811660808301527f000000000000000000000000000000000000000000000000000000000000000060c08301527f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f000000000000000000000000000000000000000000000000000000000000000060e08301526000546001600160801b038116610100840152600160801b900416610120820152905161010a9190610782565b600054610299906001600160801b031681565b6040516001600160801b03909116815260200161010a565b6101007f000000000000000000000000000000000000000000000000000000000000000081565b6102ff7f000000000000000000000000000000000000000000000000000000000000000081565b60405165ffffffffffff909116815260200161010a565b6000546102ff90600160801b900465ffffffffffff1681565b6101007f000000000000000000000000000000000000000000000000000000000000000081565b6102ff7f000000000000000000000000000000000000000000000000000000000000000081565b6101007f000000000000000000000000000000000000000000000000000000000000000081565b6102ff7f000000000000000000000000000000000000000000000000000000000000000081565b6103de6103d9366004610849565b610412565b60405161010a9190610861565b6102ff7f000000000000000000000000000000000000000000000000000000000000000081565b604080518082019091526000808252602082015260408051808201909152600281527f323300000000000000000000000000000000000000000000000000000000000060208201523373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ca91906108a2565b60405180910390fd5b50426104ef604080518082019091526000808252602082015290565b6104fd828560400135610632565b610507908361090d565b8151829061051690839061090d565b65ffffffffffff169052507f00000000000000000000000000000000000000000000000000000000000000006040850135101561058f577f00000000000000000000000000000000000000000000000000000000000000008160000181815161057f919061090d565b65ffffffffffff1690525061062b565b7f0000000000000000000000000000000000000000000000000000000000000000846040013510156105ed577f00000000000000000000000000000000000000000000000000000000000000008160000181815161057f919061090d565b7f00000000000000000000000000000000000000000000000000000000000000008160000181815161061f919061090d565b65ffffffffffff169052505b9392505050565b600080547f00000000000000000000000000000000000000000000000000000000000000009061067190600160801b900465ffffffffffff1685610937565b65ffffffffffff16106106de57600080547fffffffffffffffffffff0000000000000000000000000000000000000000000016600160801b65ffffffffffff8616021781556040517f9d26d68d3551d8e6920af85ae14553e5e89fd48bab1201c39604396f1a688dcb9190a15b600080546106f69084906001600160801b031661095e565b600080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216918217905590507f000000000000000000000000000000000000000000000000000000000000000081111561077b577f000000000000000000000000000000000000000000000000000000000000000091505b5092915050565b600061014082019050825182526020830151602083015260408301516107b2604084018265ffffffffffff169052565b5060608301516107cc606084018265ffffffffffff169052565b5060808301516107e6608084018265ffffffffffff169052565b5060a083015161080060a084018265ffffffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151610830828501826001600160801b03169052565b50506101209283015165ffffffffffff16919092015290565b60006060828403121561085b57600080fd5b50919050565b815165ffffffffffff168152602082015160408201906002811061089557634e487b7160e01b600052602160045260246000fd5b8060208401525092915050565b600060208083528351808285015260005b818110156108cf578581018301518582016040015282016108b3565b818111156108e1576000604083870101525b50601f01601f1916929092016040019392505050565b634e487b7160e01b600052601160045260246000fd5b600065ffffffffffff80831681851680830382111561092e5761092e6108f7565b01949350505050565b600065ffffffffffff83811690831681811015610956576109566108f7565b039392505050565b60006001600160801b0380831681851680830382111561092e5761092e6108f756fea2646970667358221220a26e88865daa7f4c0bda6b54ac302fb79e868c5ce5137a59f0e40825ddabf30164736f6c634300080a0033000000000000000000000000638a98bbb92a7582d07c52ff407d49664dc8b3ee00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000001c20000000000000000000000000000000000000000000000000000000000000a8c000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000015180
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100d45760003560e01c8063b4d1d79511610081578063c2f866661161005b578063c2f86666146103a4578063edbc9768146103cb578063fe70f69d146103eb57600080fd5b8063b4d1d7951461032f578063bca67b9314610356578063bd11c4c01461037d57600080fd5b80638fa6a295116100b25780638fa6a295146102b1578063b0594468146102d8578063b343a0df1461031657600080fd5b806316fa4fe7146100d9578063468b8ffa146101135780635cdb8be814610286575b600080fd5b6101007f00000000000000000000000000000000000000000000000000000000000000c881565b6040519081526020015b60405180910390f35b60408051610140810182527f000000000000000000000000000000000000000000000000000000000000000281527f0000000000000000000000000000000000000000000000000000000000000006602082015265ffffffffffff7f000000000000000000000000000000000000000000000000000000000000000c8116828401527f0000000000000000000000000000000000000000000000000000000000001c20811660608301527f000000000000000000000000000000000000000000000000000000000000a8c0811660808301527f00000000000000000000000000000000000000000000000000000000000000c860c08301527f0000000000000000000000000000000000000000000000000000000000000258811660a08301527f000000000000000000000000000000000000000000000000000000000001518060e08301526000546001600160801b038116610100840152600160801b900416610120820152905161010a9190610782565b600054610299906001600160801b031681565b6040516001600160801b03909116815260200161010a565b6101007f000000000000000000000000000000000000000000000000000000000000000681565b6102ff7f000000000000000000000000000000000000000000000000000000000000025881565b60405165ffffffffffff909116815260200161010a565b6000546102ff90600160801b900465ffffffffffff1681565b6101007f000000000000000000000000000000000000000000000000000000000001518081565b6102ff7f000000000000000000000000000000000000000000000000000000000000000c81565b6101007f000000000000000000000000000000000000000000000000000000000000000281565b6102ff7f000000000000000000000000000000000000000000000000000000000000a8c081565b6103de6103d9366004610849565b610412565b60405161010a9190610861565b6102ff7f0000000000000000000000000000000000000000000000000000000000001c2081565b604080518082019091526000808252602082015260408051808201909152600281527f323300000000000000000000000000000000000000000000000000000000000060208201523373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000638a98bbb92a7582d07c52ff407d49664dc8b3ee16146104d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ca91906108a2565b60405180910390fd5b50426104ef604080518082019091526000808252602082015290565b6104fd828560400135610632565b610507908361090d565b8151829061051690839061090d565b65ffffffffffff169052507f00000000000000000000000000000000000000000000000000000000000000026040850135101561058f577f000000000000000000000000000000000000000000000000000000000000000c8160000181815161057f919061090d565b65ffffffffffff1690525061062b565b7f0000000000000000000000000000000000000000000000000000000000000006846040013510156105ed577f0000000000000000000000000000000000000000000000000000000000001c208160000181815161057f919061090d565b7f000000000000000000000000000000000000000000000000000000000000a8c08160000181815161061f919061090d565b65ffffffffffff169052505b9392505050565b600080547f00000000000000000000000000000000000000000000000000000000000151809061067190600160801b900465ffffffffffff1685610937565b65ffffffffffff16106106de57600080547fffffffffffffffffffff0000000000000000000000000000000000000000000016600160801b65ffffffffffff8616021781556040517f9d26d68d3551d8e6920af85ae14553e5e89fd48bab1201c39604396f1a688dcb9190a15b600080546106f69084906001600160801b031661095e565b600080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166001600160801b0392909216918217905590507f00000000000000000000000000000000000000000000000000000000000000c881111561077b577f000000000000000000000000000000000000000000000000000000000000025891505b5092915050565b600061014082019050825182526020830151602083015260408301516107b2604084018265ffffffffffff169052565b5060608301516107cc606084018265ffffffffffff169052565b5060808301516107e6608084018265ffffffffffff169052565b5060a083015161080060a084018265ffffffffffff169052565b5060c083015160c083015260e083015160e083015261010080840151610830828501826001600160801b03169052565b50506101209283015165ffffffffffff16919092015290565b60006060828403121561085b57600080fd5b50919050565b815165ffffffffffff168152602082015160408201906002811061089557634e487b7160e01b600052602160045260246000fd5b8060208401525092915050565b600060208083528351808285015260005b818110156108cf578581018301518582016040015282016108b3565b818111156108e1576000604083870101525b50601f01601f1916929092016040019392505050565b634e487b7160e01b600052601160045260246000fd5b600065ffffffffffff80831681851680830382111561092e5761092e6108f7565b01949350505050565b600065ffffffffffff83811690831681811015610956576109566108f7565b039392505050565b60006001600160801b0380831681851680830382111561092e5761092e6108f756fea2646970667358221220a26e88865daa7f4c0bda6b54ac302fb79e868c5ce5137a59f0e40825ddabf30164736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000638a98bbb92a7582d07c52ff407d49664dc8b3ee00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000001c20000000000000000000000000000000000000000000000000000000000000a8c000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000015180
-----Decoded View---------------
Arg [0] : pool (address): 0x638a98BBB92a7582d07C52ff407D49664DC8b3Ee
Arg [1] : minThreshold (uint256): 2
Arg [2] : midThreshold (uint256): 6
Arg [3] : minWaitTime (uint48): 12
Arg [4] : midWaitTime (uint48): 7200
Arg [5] : maxWaitTime (uint48): 43200
Arg [6] : poolPeriodLimit (uint256): 200
Arg [7] : poolPeriodWaitTime (uint48): 600
Arg [8] : period (uint256): 86400
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000638a98bbb92a7582d07c52ff407d49664dc8b3ee
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 0000000000000000000000000000000000000000000000000000000000001c20
Arg [5] : 000000000000000000000000000000000000000000000000000000000000a8c0
Arg [6] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [8] : 0000000000000000000000000000000000000000000000000000000000015180
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.