Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LPManagerHelper
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 // (c) Long Gamma Labs, 2024. pragma solidity ^0.8.28; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { ErrorReporter } from "./ErrorReporter.sol"; import { ILPManager } from "./interfaces/ILPManager.sol"; import { IProxyLOB } from "./interfaces/IProxyLOB.sol"; import { TokenValueCalculator } from "./utils/TokenValueCalculator.sol"; contract LPManagerHelper { /// @notice Calculates the total USD value of all tokens in the liquidity pool. /// @return totalUSDValue The total USD value of the liquidity pool, normalized to 18 decimal places. function getTotalValue(address lpManagerAddress) external view returns (uint256 totalUSDValue) { ILPManager lpManager = ILPManager(lpManagerAddress); IProxyLOB proxyLOB = IProxyLOB(lpManagerAddress); uint256 tokensCount = lpManager.getTokensCount(); for (uint8 i = 0; i < tokensCount; ++i) { (address tokenAddress,,,,, uint8 decimals,,) = lpManager.tokens(i); IERC20 token = IERC20(tokenAddress); uint256 currentTokenShares = token.balanceOf(lpManagerAddress) + proxyLOB.lobReservesByTokenId(i); (uint256 currentTokenPrice, int32 currentTokenPriceExpo) = proxyLOB.getPriceOf(i); uint256 currentTokenValue = TokenValueCalculator.calcNormalizedValue( currentTokenShares, decimals, currentTokenPrice, currentTokenPriceExpo ); totalUSDValue += currentTokenValue; } } /// @notice Returns two arrays, one with the shares of each token, and the other with their USD value. /// @dev This function is primarily intended for off-chain analysis. /// @return shares An array with the shares of each token. /// @return usdValues An array with the USD values of each token. function getTokenSharesAndValues(address lpManagerAddress) external view returns (uint256[] memory shares, uint256[] memory usdValues) { ILPManager lpManager = ILPManager(lpManagerAddress); IProxyLOB proxyLOB = IProxyLOB(lpManagerAddress); uint256 tokenCount = lpManager.getTokensCount(); shares = new uint256[](tokenCount); usdValues = new uint256[](tokenCount); for (uint8 i = 0; i < tokenCount; ++i) { (address tokenAddress,,,,, uint8 decimals,,) = lpManager.tokens(i); IERC20 token = IERC20(tokenAddress); uint256 currentTokenShares = token.balanceOf(lpManagerAddress) + proxyLOB.lobReservesByTokenId(i); shares[i] = currentTokenShares; (uint256 currentTokenPrice, int32 currentTokenPriceExpo) = proxyLOB.getPriceOf(i); usdValues[i] = TokenValueCalculator.calcNormalizedValue( currentTokenShares, decimals, currentTokenPrice, currentTokenPriceExpo ); } } /// @notice Retrieves the total number of token shares, considering the balance on the contract and orders. /// @param tokenId The identifier of the token in the tokens array. /// @return The total number of token shares. function getTotalSharesOf(address lpManagerAddress, uint8 tokenId) external view returns (uint256) { ILPManager lpManager = ILPManager(lpManagerAddress); IProxyLOB proxyLOB = IProxyLOB(lpManagerAddress); require(tokenId < lpManager.getTokensCount(), ErrorReporter.WrongTokenId()); (address tokenAddress,,,,,,,) = lpManager.tokens(tokenId); IERC20 token = IERC20(tokenAddress); uint256 tokensInContract = token.balanceOf(lpManagerAddress); uint256 tokensInOrders = proxyLOB.lobReservesByTokenId(tokenId); return (tokensInContract + tokensInOrders); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @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 Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: BUSL-1.1 // (c) Long Gamma Labs, 2024. pragma solidity ^0.8.28; contract ErrorReporter { error CooldownDurationNotYetPassed(); // 0x5fba365d error EmptyDomainName(); // 0x2f601761 error EmptyTokenName(); // 0xe2592aed error EmptyTokenSymbol(); // 0x19c7070a error Expired(); // 0x203d82d8 error FeeBpsExceedsMaximum(); // 0x132df9c5 error Forbidden(); // 0xee90c468 error InsufficientBalance(); // 0xf4d678b8 error InsufficientFeeForPythUpdate(); // 0xe4764c6f error InsufficientLiquidityValue(); // 0x5b635d0b error InsufficientMarketMakerLPShare(); // 0x28f53493 error InsufficientMintedLP(); // 0x212c18d0 error InsufficientTokenAmount(); // 0x2ec48042 error InsufficientUSDValue(); // 0xd6f69157 error InvalidFloatingPointRepresentation(); // 0xa25f85b7 error InvalidLob(); // 0xb9c44f1a error InvalidLobAddress(); // 0xec09da35 error InvalidOracleConfidenceLevel(); // 0xe6b9bbad error InvalidSignature(); // 0x8baa579f error InvalidTokenWeights(); // 0x4b8072c3 error InvalidTrader(); // 0xfb7595a2 error InvalidTransfer(); // 0x2f352531 error LobDisabled(); // 0xa6876da4 error MarketMakerLPShareExceedsMaximum(); // 0x84d3d6cb error MaxLiquidityValueExceeded(); // 0x9009a2d8 error MaxOracleAgeExceedsMaximum(); // 0x8b7df994 error NativeGasTokenDisabled(); // 0x60787531 error NonPositivePrice(); // 0x13caeeae error NotImplementedYet(); // 0xf88c75b4 error OracleConfTooHigh(); // 0x004f2349 error OrderAlreadyUsed(); // 0x88b39043 error PartiallyPaused(); // 0x1fa6172a error PriceTooBig(); // 0x9bec8e38 error PriceTooSmall(); // 0x8460540d error SlashingUnAvailable(); // 0xd7b45887 error TokenDisabled(); // 0x1931ea85 error TokenWeightExceeded(); // 0x725ad4f5 error TransferFailed(); // 0x90b8ec18 error UnknownLob(); // 0x0b1066eb error WrongNumber(); // 0x3546a07e error WrongTokenId(); // 0x749aeece error ZeroAddress(); // 0xd92e233d error ZeroAmount(); // 0x1f2a2005 }
// SPDX-License-Identifier: BUSL-1.1 // (c) Long Gamma Labs, 2024. pragma solidity ^0.8.28; struct FeeConfig { /// @notice Enable or disable dynamic fees adjustment based on token weight imbalances. bool dynamicFeesEnabled; /// @notice Admin fee for minting LP tokens (100 = 1%, maximum 1000 = 10%). uint16 adminMintLPFeeBps; /// @notice Admin fee for burning LP tokens (100 = 1%, maximum 1000 = 10%). uint16 adminBurnLPFeeBps; /// @notice Base protocol fee (100 = 1%, maximum 1000 = 10%). uint16 feeBasisBps; /// @notice Additional tax fee for imbalanced operations (100 = 1%, maximum 1000 = 10%). uint16 taxBasisBps; /// @notice Performance fee in basis points charged when LP token price reaches new high-water mark (100 = 1%, maximum 3000 = 30%). uint16 perfFeeBps; /// @notice Admin's share of the performance fee in basis points (100 = 1%, maximum 10000 = 100%). uint16 adminPerfFeeBps; /// @notice The address that will receive the admin fees. address adminFeeRecipient; } struct LiquidityConfig { /// @notice Lockup period after adding liquidity in seconds /// during which removeLiquidity and LP token transfers are blocked /// (maximum 16 777 215 seconds ≈ 194 days) uint24 cooldownDuration; /// @notice Minimum liquidity value in USD (scaled by 1e18). uint128 minLiquidityValueUsd; /// @notice Maximum liquidity value in USD (scaled by 1e18). uint128 maxLiquidityValueUsd; } struct MarketMakerConfig { /// @notice Enable or disable minimum market maker share in LP tokens. bool marketMakerLPShareEnabled; /// @notice Minimum market maker share in LP tokens (100 = 1%, maximum 10000 = 100%). uint16 marketMakerLPShareBps; } struct NativeTokenConfig { /// @notice Flag to enable or disable the use of the native GAS token for transactions. bool enabled; /// @notice The index of the token in the tokens array that is used as the native GAS token, if enabled. uint8 tokenId; } struct PriceConfig { /// @notice Maximum allowable age of oracle price data in seconds. uint16 maxOracleAge; /// @notice The period in seconds for which the LP token price is considered valid. uint24 priceValidityPeriod; /// @notice Base multiplier for calculating the allowed LP token price deviation (scaled by 1e18). uint64 baseMultiplier; /// @notice The maximum allowed deviation of the LP token price from the previous valid price. uint64 maxAllowedPriceDeviation; } interface ILPManager { // governance function setConfig( FeeConfig calldata feeConfig, LiquidityConfig calldata liquidityConfig, MarketMakerConfig calldata mmConfig, NativeTokenConfig calldata nativeConfig, PriceConfig calldata priceConfig ) external; function getConfig() external view returns ( FeeConfig memory feeConfig, LiquidityConfig memory liquidityConfig, MarketMakerConfig memory mmConfig, NativeTokenConfig memory nativeConfig, PriceConfig memory priceConfig, bool slashingStatus ); function changeToken( address tokenAddress, bool isActive, uint16 targetWeight, uint16 lowerBoundWeight, uint16 upperBoundWeight, uint8 decimals, uint24 oracleConfRel, bytes32 oraclePriceId ) external; function changeLob( address lobAddress, bool isActive, uint8 tokenIdX, uint8 tokenIdY, uint16 maxOrderDistanceBps ) external; function slashMakersShares(uint256 amount) external; function disableSlashingStatus() external; function pause() external; function validateLPPriceAndDistributeFees(bytes[] calldata priceUpdateData) payable external; // client entries function addLiquidity( uint8 tokenID, uint256 amount, uint256 minUsdValue, uint256 minLPMinted, uint256 expires, bytes[] calldata priceUpdateData ) external payable returns (uint256); function removeLiquidity( uint8 tokenID, uint256 burnLP, uint256 minUsdValue, uint256 minTokenGet, uint256 expires, bytes[] calldata priceUpdateData ) external payable returns (uint256); function collectFees() external; // views function getFeeBasisPoints( uint256 totalValue, uint256 initialTokenValue, uint256 nextTokenValue, uint16 targetTokenWeight ) external view returns (uint256); function tokens(uint256 index) external view returns ( address tokenAddress, bool isActive, uint16 targetWeight, uint16 lowerBoundWeight, uint16 upperBoundWeight, uint8 decimals, uint24 oracleConfRel, bytes32 oraclePriceId ); function lastAddedAt(address account) external view returns (uint256); function totalWeight() external view returns (uint24); function checkCooldown(address account) external view; function getTokensCount() external view returns (uint256); function marketMakers(address account) external view returns (bool); function primaryMarketMaker() external view returns (address); function validateMarketMakerLPShare() external view; function ensureNotPartiallyPaused() external view; function lobs(uint256 index) external view returns ( address lobAddress, uint8 tokenIdX, uint8 tokenIdY, bool isActive, uint16 maxOrderDistanceBps ); }
// SPDX-License-Identifier: BUSL-1.1 // (c) Long Gamma Labs, 2024. pragma solidity ^0.8.28; interface IProxyLOB { function lobReservesByTokenId(uint8 tokenId) external view returns (uint256); function getPriceOf(uint8 tokenId) external view returns (uint256, int32); function placeOrder( uint8 lobId, bool isAsk, uint128 quantity, uint72 price, uint128 maxCommission, bool marketOnly, bool postOnly, uint256 expires, bytes[] calldata priceUpdateData ) external payable returns (uint64 orderId); function claimOrder(uint8 lobId, uint64 orderId, bool onlyClaim, uint256 expires) external; }
// SPDX-License-Identifier: BUSL-1.1 // (c) Long Gamma Labs, 2024. pragma solidity ^0.8.28; library TokenValueCalculator { /// @notice Calculates normalized USD value of tokens with 18 decimals precision. /// @param tokenShares The amount of token shares. /// @param tokenDecimals The number of decimals the token uses. /// @param price The price of one token in USD, scaled by 10^priceExpo. /// @param priceExpo The exponent that the price is scaled by. /// @return The normalized USD value of the token shares, normalized to 18 decimal places. function calcNormalizedValue( uint256 tokenShares, uint8 tokenDecimals, uint256 price, int32 priceExpo ) internal pure returns (uint256) { int256 decimalAdjustment; unchecked { decimalAdjustment = int256(uint256(tokenDecimals)) - priceExpo - 18; } uint256 normalizedValue = tokenShares * price; if (decimalAdjustment > 0) { normalizedValue /= 10 ** uint256(decimalAdjustment); } else { normalizedValue *= 10 ** uint256(-decimalAdjustment); } return normalizedValue; } /// @notice Calculates the amount of token shares corresponding to a given USD value, taking into account /// token decimals and price normalization. This is the inverse operation of calcNormalizedValue. /// @param usdValue The value in USD for which to calculate the corresponding token shares. /// @param tokenDecimals The number of decimals of the token for which shares are being calculated. /// @param price The price of the token in USD, adjusted by the price exponent. /// @param priceExpo The exponent to which the price is normalized (e.g., -18 for wei normalization). /// @return tokenAmount The calculated amount of token shares. function calcTokenShares( uint256 usdValue, uint8 tokenDecimals, uint256 price, int32 priceExpo ) internal pure returns (uint256) { int256 decimalAdjustment; unchecked { decimalAdjustment = int256(uint256(tokenDecimals)) - priceExpo - 18; } uint256 tokenAmount; if (decimalAdjustment > 0) { // There is no practical benefit to using mulDiv with real data here. tokenAmount = usdValue * 10 ** uint256(decimalAdjustment) / price; } else { tokenAmount = usdValue / (price * 10 ** uint256(-decimalAdjustment)); } return tokenAmount; } }
{ "remappings": [ "forge-std/=lib/forge-std/src/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "@onchainclob/contracts/=lib/onchain-clob-contracts/src/", "@pythnetwork/pyth-sdk-solidity/=lib/pyth-sdk-solidity/", "@solmate/src/=lib/onchain-clob-contracts/lib/solmate/src/", "ds-test/=lib/solmate/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "onchain-clob-contracts/=lib/onchain-clob-contracts/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "pyth-sdk-solidity/=lib/pyth-sdk-solidity/", "solmate/=lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "cancun", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"WrongTokenId","type":"error"},{"inputs":[{"internalType":"address","name":"lpManagerAddress","type":"address"}],"name":"getTokenSharesAndValues","outputs":[{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"uint256[]","name":"usdValues","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpManagerAddress","type":"address"},{"internalType":"uint8","name":"tokenId","type":"uint8"}],"name":"getTotalSharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpManagerAddress","type":"address"}],"name":"getTotalValue","outputs":[{"internalType":"uint256","name":"totalUSDValue","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080806040523460155761099c908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816368637549146104c457508063a9b631f7146102325763d3c1a7431461003d575f80fd5b3461016f57604036600319011261016f57610056610701565b6024359060ff821680920361016f57604051633962f82d60e01b81526001600160a01b039190911690602081600481855afa90811561017b575f91610200575b508210156101f1576040516327b2595f60e11b8152600481018390529161010083602481855afa92831561017b576024936020915f916101bb575b506040516370a0823160e01b81526004810185905294859182906001600160a01b03165afa92831561017b575f93610186575b5060209060246040518094819363246451e560e01b835260048301525afa90811561017b575f91610144575b602061013c8385610834565b604051908152f35b90506020813d602011610173575b8161015f6020938361074a565b8101031261016f57516020610130565b5f80fd5b3d9150610152565b6040513d5f823e3d90fd5b9092506020813d6020116101b3575b816101a26020938361074a565b8101031261016f5751916020610104565b3d9150610195565b6101dd91506101003d81116101ea575b6101d5818361074a565b8101906107b4565b505050505050505f6100d1565b503d6101cb565b633a4d776760e11b5f5260045ffd5b90506020813d60201161022a575b8161021b6020938361074a565b8101031261016f57515f610096565b3d915061020e565b3461016f57602036600319011261016f576001600160a01b03610253610701565b16604051633962f82d60e01b8152602081600481855afa90811561017b575f91610492575b5061028281610879565b9161028c82610879565b905f5b60ff81169084821015610464576040516327b2595f60e11b8152600481018390529161010083602481875afa92831561017b575f905f94610434575b506040516370a0823160e01b81526004810186905290602090829060249082906001600160a01b03165afa90811561017b575f91610403575b5060405163246451e560e01b81526004810183905290602082602481895afa90811561017b575f916103ce575b61033b9250610834565b9283610347838a6108ab565b5260405193632ea68d8560e01b8552826004860152604085602481895afa801561017b576103939561038d93610386935f925f94610398575b506108f4565b91866108ab565b52610780565b61028f565b9093506103bd91925060403d81116103c7575b6103b5818361074a565b810190610841565b919091928d610380565b503d6103ab565b90506020823d82116103fb575b816103e86020938361074a565b8101031261016f5761033b915190610331565b3d91506103db565b90506020813d821161042c575b8161041d6020938361074a565b8101031261016f575188610304565b3d9150610410565b6020945060249150610454906101003d81116101ea576101d5818361074a565b50509894935050505091506102cb565b6104808661048e86604051938493604085526040850190610717565b908382036020850152610717565b0390f35b90506020813d6020116104bc575b816104ad6020938361074a565b8101031261016f575182610278565b3d91506104a0565b3461016f57602036600319011261016f576104dd610701565b633962f82d60e01b82526001600160a01b0316905f90602081600481865afa90811561017b575f916106cf575b505f915b60ff831690828210156106c4576040516327b2595f60e11b8152600481018390529061010082602481895afa91821561017b575f905f93610694575b506040516370a0823160e01b81526004810188905290602090829060249082906001600160a01b03165afa90811561017b575f91610663575b5060405163246451e560e01b815260048101859052906020826024818b5afa90811561017b575f9161062e575b6105ba9250610834565b60405193632ea68d8560e01b855260048501526040846024818a5afa801561017b57610602946105fc946105f6935f925f9461060857506108f4565b90610834565b92610780565b9161050e565b90935061062491925060403d81116103c7576103b5818361074a565b919091928b610380565b90506020823d821161065b575b816106486020938361074a565b8101031261016f576105ba9151906105b0565b3d915061063b565b90506020813d821161068c575b8161067d6020938361074a565b8101031261016f575187610583565b3d9150610670565b60209350602491506106b4906101003d81116101ea576101d5818361074a565b505097949350505050915061054a565b602090604051908152f35b90506020813d6020116106f9575b816106ea6020938361074a565b8101031261016f57518361050a565b3d91506106dd565b600435906001600160a01b038216820361016f57565b90602080835192838152019201905f5b8181106107345750505090565b8251845260209384019390920191600101610727565b90601f8019910116810190811067ffffffffffffffff82111761076c57604052565b634e487b7160e01b5f52604160045260245ffd5b60ff1660ff81146107915760010190565b634e487b7160e01b5f52601160045260245ffd5b519061ffff8216820361016f57565b91908261010091031261016f5781516001600160a01b038116810361016f57916020810151801515810361016f57916107ef604083016107a5565b916107fc606082016107a5565b91610809608083016107a5565b9160a081015160ff8116810361016f579160c082015162ffffff8116810361016f5760e09092015190565b9190820180921161079157565b919082604091031261016f57602082519201518060030b810361016f5790565b67ffffffffffffffff811161076c5760051b60200190565b9061088382610861565b610890604051918261074a565b82815280926108a1601f1991610861565b0190602036910137565b80518210156108bf5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b8181029291811591840414171561079157565b604d811161079157600a0a90565b91929060ff61090f9260030b911603926011198401926108d3565b905f811315610942576109239192506108e6565b90811561092e570490565b634e487b7160e01b5f52601260045260245ffd5b600160ff1b146107915761095d6012610963935f03016108e6565b906108d3565b9056fea264697066735822122021a98ca3901770dd6f7b8d71f4074289939ab372690f1bc473a977ea4794035d64736f6c634300081c0033
Deployed Bytecode
0x6080806040526004361015610012575f80fd5b5f3560e01c90816368637549146104c457508063a9b631f7146102325763d3c1a7431461003d575f80fd5b3461016f57604036600319011261016f57610056610701565b6024359060ff821680920361016f57604051633962f82d60e01b81526001600160a01b039190911690602081600481855afa90811561017b575f91610200575b508210156101f1576040516327b2595f60e11b8152600481018390529161010083602481855afa92831561017b576024936020915f916101bb575b506040516370a0823160e01b81526004810185905294859182906001600160a01b03165afa92831561017b575f93610186575b5060209060246040518094819363246451e560e01b835260048301525afa90811561017b575f91610144575b602061013c8385610834565b604051908152f35b90506020813d602011610173575b8161015f6020938361074a565b8101031261016f57516020610130565b5f80fd5b3d9150610152565b6040513d5f823e3d90fd5b9092506020813d6020116101b3575b816101a26020938361074a565b8101031261016f5751916020610104565b3d9150610195565b6101dd91506101003d81116101ea575b6101d5818361074a565b8101906107b4565b505050505050505f6100d1565b503d6101cb565b633a4d776760e11b5f5260045ffd5b90506020813d60201161022a575b8161021b6020938361074a565b8101031261016f57515f610096565b3d915061020e565b3461016f57602036600319011261016f576001600160a01b03610253610701565b16604051633962f82d60e01b8152602081600481855afa90811561017b575f91610492575b5061028281610879565b9161028c82610879565b905f5b60ff81169084821015610464576040516327b2595f60e11b8152600481018390529161010083602481875afa92831561017b575f905f94610434575b506040516370a0823160e01b81526004810186905290602090829060249082906001600160a01b03165afa90811561017b575f91610403575b5060405163246451e560e01b81526004810183905290602082602481895afa90811561017b575f916103ce575b61033b9250610834565b9283610347838a6108ab565b5260405193632ea68d8560e01b8552826004860152604085602481895afa801561017b576103939561038d93610386935f925f94610398575b506108f4565b91866108ab565b52610780565b61028f565b9093506103bd91925060403d81116103c7575b6103b5818361074a565b810190610841565b919091928d610380565b503d6103ab565b90506020823d82116103fb575b816103e86020938361074a565b8101031261016f5761033b915190610331565b3d91506103db565b90506020813d821161042c575b8161041d6020938361074a565b8101031261016f575188610304565b3d9150610410565b6020945060249150610454906101003d81116101ea576101d5818361074a565b50509894935050505091506102cb565b6104808661048e86604051938493604085526040850190610717565b908382036020850152610717565b0390f35b90506020813d6020116104bc575b816104ad6020938361074a565b8101031261016f575182610278565b3d91506104a0565b3461016f57602036600319011261016f576104dd610701565b633962f82d60e01b82526001600160a01b0316905f90602081600481865afa90811561017b575f916106cf575b505f915b60ff831690828210156106c4576040516327b2595f60e11b8152600481018390529061010082602481895afa91821561017b575f905f93610694575b506040516370a0823160e01b81526004810188905290602090829060249082906001600160a01b03165afa90811561017b575f91610663575b5060405163246451e560e01b815260048101859052906020826024818b5afa90811561017b575f9161062e575b6105ba9250610834565b60405193632ea68d8560e01b855260048501526040846024818a5afa801561017b57610602946105fc946105f6935f925f9461060857506108f4565b90610834565b92610780565b9161050e565b90935061062491925060403d81116103c7576103b5818361074a565b919091928b610380565b90506020823d821161065b575b816106486020938361074a565b8101031261016f576105ba9151906105b0565b3d915061063b565b90506020813d821161068c575b8161067d6020938361074a565b8101031261016f575187610583565b3d9150610670565b60209350602491506106b4906101003d81116101ea576101d5818361074a565b505097949350505050915061054a565b602090604051908152f35b90506020813d6020116106f9575b816106ea6020938361074a565b8101031261016f57518361050a565b3d91506106dd565b600435906001600160a01b038216820361016f57565b90602080835192838152019201905f5b8181106107345750505090565b8251845260209384019390920191600101610727565b90601f8019910116810190811067ffffffffffffffff82111761076c57604052565b634e487b7160e01b5f52604160045260245ffd5b60ff1660ff81146107915760010190565b634e487b7160e01b5f52601160045260245ffd5b519061ffff8216820361016f57565b91908261010091031261016f5781516001600160a01b038116810361016f57916020810151801515810361016f57916107ef604083016107a5565b916107fc606082016107a5565b91610809608083016107a5565b9160a081015160ff8116810361016f579160c082015162ffffff8116810361016f5760e09092015190565b9190820180921161079157565b919082604091031261016f57602082519201518060030b810361016f5790565b67ffffffffffffffff811161076c5760051b60200190565b9061088382610861565b610890604051918261074a565b82815280926108a1601f1991610861565b0190602036910137565b80518210156108bf5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b8181029291811591840414171561079157565b604d811161079157600a0a90565b91929060ff61090f9260030b911603926011198401926108d3565b905f811315610942576109239192506108e6565b90811561092e570490565b634e487b7160e01b5f52601260045260245ffd5b600160ff1b146107915761095d6012610963935f03016108e6565b906108d3565b9056fea264697066735822122021a98ca3901770dd6f7b8d71f4074289939ab372690f1bc473a977ea4794035d64736f6c634300081c0033
Deployed Bytecode Sourcemap
411:3434:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;411:3434:2;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;3471:26:2;;-1:-1:-1;;;;;411:3434:2;;;;;;;;;;3471:26;;;;;;;411:3434;3471:26;;;411:3434;3461:36;;;411:3434;;;;;-1:-1:-1;;;3571:25:2;;411:3434;3571:25;;411:3434;;;;3571:25;411:3434;;;3571:25;;;;;;;;411:3434;3571:25;411:3434;3571:25;411:3434;3571:25;;;411:3434;-1:-1:-1;411:3434:2;;-1:-1:-1;;;3678:33:2;;411:3434;3678:33;;411:3434;;;;;;;;-1:-1:-1;;;;;411:3434:2;3678:33;;;;;;;411:3434;3678:33;;;411:3434;;;;;;;;;;;;;;3746:38;;411:3434;3746:38;;411:3434;3746:38;;;;;;;411:3434;3746:38;;;411:3434;;3802:33;;;;:::i;:::-;411:3434;;;;;;3746:38;;;411:3434;3746:38;;411:3434;3746:38;;;;;;411:3434;3746:38;;;:::i;:::-;;;411:3434;;;;;;3746:38;;411:3434;;;;3746:38;;;-1:-1:-1;3746:38:2;;;411:3434;;;;;;;;;3678:33;;;;411:3434;3678:33;;411:3434;3678:33;;;;;;411:3434;3678:33;;;:::i;:::-;;;411:3434;;;;;;;3678:33;;;;;-1:-1:-1;3678:33:2;;3571:25;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;411:3434;;;;;;;;;3471:26;;;411:3434;3471:26;;411:3434;3471:26;;;;;;411:3434;3471:26;;;:::i;:::-;;;411:3434;;;;;3471:26;;;;;;-1:-1:-1;3471:26:2;;411:3434;;;;;;-1:-1:-1;;411:3434:2;;;;-1:-1:-1;;;;;411:3434:2;;:::i;:::-;;;;;;;2202:26;;411:3434;2202:26;411:3434;2202:26;;;;;;;;;411:3434;2202:26;;;411:3434;2247:25;;;;:::i;:::-;2294;;;;:::i;:::-;2335:11;411:3434;2364:3;411:3434;;;2348:14;;;;;;;411:3434;;-1:-1:-1;;;2430:19:2;;411:3434;2430:19;;411:3434;;;;2430:19;411:3434;2430:19;411:3434;2430:19;;;;;;;;411:3434;;;2430:19;;;2364:3;-1:-1:-1;411:3434:2;;-1:-1:-1;;;2541:33:2;;411:3434;2541:33;;411:3434;;;;;;;;2430:19;;411:3434;;-1:-1:-1;;;;;411:3434:2;2541:33;;;;;;;411:3434;2541:33;;;2364:3;-1:-1:-1;411:3434:2;;-1:-1:-1;;;2577:32:2;;411:3434;2577:32;;411:3434;;;;;;2430:19;411:3434;2577:32;;;;;;;;411:3434;2577:32;;;2364:3;2541:68;;;;:::i;:::-;2623:30;;;;;;:::i;:::-;411:3434;;;;;;;2726:22;;;411:3434;2726:22;;411:3434;;2726:22;2430:19;2726:22;;;;;;;;2364:3;2726:22;2763:205;2726:22;2778:190;2726:22;411:3434;;;2726:22;;;2364:3;2778:190;;:::i;:::-;2763:205;;;:::i;:::-;411:3434;2364:3;:::i;:::-;2335:11;;2726:22;;;;;;;;411:3434;2726:22;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;2577:32;;;411:3434;2577:32;;;;;;;;;411:3434;2577:32;;;:::i;:::-;;;411:3434;;;;2541:68;411:3434;;2577:32;;;;;;-1:-1:-1;2577:32:2;;2541:33;;;411:3434;2541:33;;;;;;;;;411:3434;2541:33;;;:::i;:::-;;;411:3434;;;;;2541:33;;;;;;-1:-1:-1;2541:33:2;;2430:19;411:3434;2430:19;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;2348:14;411:3434;2348:14;411:3434;2348:14;411:3434;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;2202:26;;;411:3434;2202:26;;411:3434;2202:26;;;;;;411:3434;2202:26;;;:::i;:::-;;;411:3434;;;;;2202:26;;;;;;-1:-1:-1;2202:26:2;;411:3434;;;;;;-1:-1:-1;;411:3434:2;;;;;;:::i;:::-;-1:-1:-1;;;878:26:2;;-1:-1:-1;;;;;411:3434:2;;;;;;;;;878:26;;;;;;;411:3434;878:26;;;411:3434;928:11;411:3434;923:668;958:3;411:3434;;;941:15;;;;;;;411:3434;;-1:-1:-1;;;1024:19:2;;411:3434;1024:19;;411:3434;;;;1024:19;411:3434;1024:19;411:3434;1024:19;;;;;;;;411:3434;;;1024:19;;;958:3;-1:-1:-1;411:3434:2;;-1:-1:-1;;;1136:33:2;;411:3434;1136:33;;411:3434;;;;;;;;1024:19;;411:3434;;-1:-1:-1;;;;;411:3434:2;1136:33;;;;;;;411:3434;1136:33;;;958:3;-1:-1:-1;411:3434:2;;-1:-1:-1;;;1172:32:2;;411:3434;1172:32;;411:3434;;;;;;1024:19;411:3434;1172:32;;;;;;;;411:3434;1172:32;;;958:3;1136:68;;;;:::i;:::-;411:3434;;;;;;1277:22;;411:3434;1277:22;;411:3434;;1277:22;1024:19;1277:22;;;;;;;;958:3;1277:22;1546:34;1277:22;1342:190;1277:22;411:3434;;;1277:22;;;1342:190;;:::i;:::-;1546:34;;:::i;:::-;958:3;;:::i;:::-;928:11;;;1277:22;;;;;;;;411:3434;1277:22;;;;;;;;;:::i;:::-;;;;;;;;1172:32;;;411:3434;1172:32;;;;;;;;;411:3434;1172:32;;;:::i;:::-;;;411:3434;;;;1136:68;411:3434;;1172:32;;;;;;-1:-1:-1;1172:32:2;;1136:33;;;411:3434;1136:33;;;;;;;;;411:3434;1136:33;;;:::i;:::-;;;411:3434;;;;;1136:33;;;;;;-1:-1:-1;1136:33:2;;1024:19;411:3434;1024:19;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;941:15;411:3434;941:15;411:3434;;;;;;878:26;;;411:3434;878:26;;411:3434;878:26;;;;;;411:3434;878:26;;;:::i;:::-;;;411:3434;;;;;878:26;;;;;;-1:-1:-1;878:26:2;;411:3434;;;;-1:-1:-1;;;;;411:3434:2;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;411:3434:2;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;411:3434:2;;;;;-1:-1:-1;411:3434:2;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;411:3434:2;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;577:617:5:-;;;;411:3434:2;940:19:5;577:617;411:3434:2;;;;;;;;;;940:19:5;;:::i;:::-;973:21;-1:-1:-1;973:21:5;;-1:-1:-1;;;1029:32:5;;;;;:::i;:::-;411:3434:2;;;;;;577:617:5;:::o;411:3434:2:-;;;;-1:-1:-1;411:3434:2;883:2:5;411:3434:2;;;-1:-1:-1;411:3434:2;969:186:5;-1:-1:-1;;;411:3434:2;;;1111:33:5;883:2;1092:52;411:3434:2;-1:-1:-1;411:3434:2;;1111:33:5;:::i;:::-;1092:52;;:::i;:::-;577:617;:::o
Swarm Source
ipfs://21a98ca3901770dd6f7b8d71f4074289939ab372690f1bc473a977ea4794035d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.