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 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; interface ILPManager { // governance function setConfig( bool dynamicFeesEnabled, uint16 adminMintLPFeeBps, uint16 adminBurnLPFeeBps, uint16 feeBasisBps, uint16 taxBasisBps, uint24 cooldownDuration, uint16 maxOracleAge, uint128 minLiquidityValueUsd, uint128 maxLiquidityValueUsd, bool marketMakerLPShareEnabled, uint16 marketMakerLPShareBps, bool nativeTokenEnabled, uint8 nativeTokenTokenId, address adminFeeRecipient, uint24 priceValidityPeriod, uint64 baseMultiplier, uint64 maxAllowedPriceDeviation, uint16 perfFeeBps, uint16 adminPerfFeeBps ) external; function getConfig() external view returns ( bool dynamicFeesEnabled, uint16 adminMintLPFeeBps, uint16 adminBurnLPFeeBps, uint16 feeBasisBps, uint16 taxBasisBps, uint24 cooldownDuration, uint16 maxOracleAge, uint128 minLiquidityValueUsd, uint128 maxLiquidityValueUsd, bool marketMakerLPShareEnabled, uint16 marketMakerLPShareBps, bool nativeTokenEnabled, uint8 nativeTokenTokenId, address adminFeeRecipient, uint24 priceValidityPeriod, uint64 baseMultiplier, uint64 maxAllowedPriceDeviation, uint16 perfFeeBps, uint16 adminPerfFeeBps, bool slashingAvailableStatus ); 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 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
6080806040523460155761099c908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816368637549146104c457508063a9b631f7146102325763d3c1a7431461003d575f80fd5b3461016f57604036600319011261016f57610056610701565b6024359060ff821680920361016f57604051633962f82d60e01b81526001600160a01b039190911690602081600481855afa90811561017b575f91610200575b508210156101f1576040516327b2595f60e11b8152600481018390529161010083602481855afa92831561017b576024936020915f916101bb575b506040516370a0823160e01b81526004810185905294859182906001600160a01b03165afa92831561017b575f93610186575b5060209060246040518094819363246451e560e01b835260048301525afa90811561017b575f91610144575b602061013c8385610834565b604051908152f35b90506020813d602011610173575b8161015f6020938361074a565b8101031261016f57516020610130565b5f80fd5b3d9150610152565b6040513d5f823e3d90fd5b9092506020813d6020116101b3575b816101a26020938361074a565b8101031261016f5751916020610104565b3d9150610195565b6101dd91506101003d81116101ea575b6101d5818361074a565b8101906107b4565b505050505050505f6100d1565b503d6101cb565b633a4d776760e11b5f5260045ffd5b90506020813d60201161022a575b8161021b6020938361074a565b8101031261016f57515f610096565b3d915061020e565b3461016f57602036600319011261016f576001600160a01b03610253610701565b16604051633962f82d60e01b8152602081600481855afa90811561017b575f91610492575b5061028281610879565b9161028c82610879565b905f5b60ff81169084821015610464576040516327b2595f60e11b8152600481018390529161010083602481875afa92831561017b575f905f94610434575b506040516370a0823160e01b81526004810186905290602090829060249082906001600160a01b03165afa90811561017b575f91610403575b5060405163246451e560e01b81526004810183905290602082602481895afa90811561017b575f916103ce575b61033b9250610834565b9283610347838a6108ab565b5260405193632ea68d8560e01b8552826004860152604085602481895afa801561017b576103939561038d93610386935f925f94610398575b506108f4565b91866108ab565b52610780565b61028f565b9093506103bd91925060403d81116103c7575b6103b5818361074a565b810190610841565b919091928d610380565b503d6103ab565b90506020823d82116103fb575b816103e86020938361074a565b8101031261016f5761033b915190610331565b3d91506103db565b90506020813d821161042c575b8161041d6020938361074a565b8101031261016f575188610304565b3d9150610410565b6020945060249150610454906101003d81116101ea576101d5818361074a565b50509894935050505091506102cb565b6104808661048e86604051938493604085526040850190610717565b908382036020850152610717565b0390f35b90506020813d6020116104bc575b816104ad6020938361074a565b8101031261016f575182610278565b3d91506104a0565b3461016f57602036600319011261016f576104dd610701565b633962f82d60e01b82526001600160a01b0316905f90602081600481865afa90811561017b575f916106cf575b505f915b60ff831690828210156106c4576040516327b2595f60e11b8152600481018390529061010082602481895afa91821561017b575f905f93610694575b506040516370a0823160e01b81526004810188905290602090829060249082906001600160a01b03165afa90811561017b575f91610663575b5060405163246451e560e01b815260048101859052906020826024818b5afa90811561017b575f9161062e575b6105ba9250610834565b60405193632ea68d8560e01b855260048501526040846024818a5afa801561017b57610602946105fc946105f6935f925f9461060857506108f4565b90610834565b92610780565b9161050e565b90935061062491925060403d81116103c7576103b5818361074a565b919091928b610380565b90506020823d821161065b575b816106486020938361074a565b8101031261016f576105ba9151906105b0565b3d915061063b565b90506020813d821161068c575b8161067d6020938361074a565b8101031261016f575187610583565b3d9150610670565b60209350602491506106b4906101003d81116101ea576101d5818361074a565b505097949350505050915061054a565b602090604051908152f35b90506020813d6020116106f9575b816106ea6020938361074a565b8101031261016f57518361050a565b3d91506106dd565b600435906001600160a01b038216820361016f57565b90602080835192838152019201905f5b8181106107345750505090565b8251845260209384019390920191600101610727565b90601f8019910116810190811067ffffffffffffffff82111761076c57604052565b634e487b7160e01b5f52604160045260245ffd5b60ff1660ff81146107915760010190565b634e487b7160e01b5f52601160045260245ffd5b519061ffff8216820361016f57565b91908261010091031261016f5781516001600160a01b038116810361016f57916020810151801515810361016f57916107ef604083016107a5565b916107fc606082016107a5565b91610809608083016107a5565b9160a081015160ff8116810361016f579160c082015162ffffff8116810361016f5760e09092015190565b9190820180921161079157565b919082604091031261016f57602082519201518060030b810361016f5790565b67ffffffffffffffff811161076c5760051b60200190565b9061088382610861565b610890604051918261074a565b82815280926108a1601f1991610861565b0190602036910137565b80518210156108bf5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b8181029291811591840414171561079157565b604d811161079157600a0a90565b91929060ff61090f9260030b911603926011198401926108d3565b905f811315610942576109239192506108e6565b90811561092e570490565b634e487b7160e01b5f52601260045260245ffd5b600160ff1b146107915761095d6012610963935f03016108e6565b906108d3565b9056fea26469706673582212203b6453ca768ab36651ed67c7359f24a8ece3e795183986aca8e38b309129c45d64736f6c634300081c0033
Deployed Bytecode
0x6080806040526004361015610012575f80fd5b5f3560e01c90816368637549146104c457508063a9b631f7146102325763d3c1a7431461003d575f80fd5b3461016f57604036600319011261016f57610056610701565b6024359060ff821680920361016f57604051633962f82d60e01b81526001600160a01b039190911690602081600481855afa90811561017b575f91610200575b508210156101f1576040516327b2595f60e11b8152600481018390529161010083602481855afa92831561017b576024936020915f916101bb575b506040516370a0823160e01b81526004810185905294859182906001600160a01b03165afa92831561017b575f93610186575b5060209060246040518094819363246451e560e01b835260048301525afa90811561017b575f91610144575b602061013c8385610834565b604051908152f35b90506020813d602011610173575b8161015f6020938361074a565b8101031261016f57516020610130565b5f80fd5b3d9150610152565b6040513d5f823e3d90fd5b9092506020813d6020116101b3575b816101a26020938361074a565b8101031261016f5751916020610104565b3d9150610195565b6101dd91506101003d81116101ea575b6101d5818361074a565b8101906107b4565b505050505050505f6100d1565b503d6101cb565b633a4d776760e11b5f5260045ffd5b90506020813d60201161022a575b8161021b6020938361074a565b8101031261016f57515f610096565b3d915061020e565b3461016f57602036600319011261016f576001600160a01b03610253610701565b16604051633962f82d60e01b8152602081600481855afa90811561017b575f91610492575b5061028281610879565b9161028c82610879565b905f5b60ff81169084821015610464576040516327b2595f60e11b8152600481018390529161010083602481875afa92831561017b575f905f94610434575b506040516370a0823160e01b81526004810186905290602090829060249082906001600160a01b03165afa90811561017b575f91610403575b5060405163246451e560e01b81526004810183905290602082602481895afa90811561017b575f916103ce575b61033b9250610834565b9283610347838a6108ab565b5260405193632ea68d8560e01b8552826004860152604085602481895afa801561017b576103939561038d93610386935f925f94610398575b506108f4565b91866108ab565b52610780565b61028f565b9093506103bd91925060403d81116103c7575b6103b5818361074a565b810190610841565b919091928d610380565b503d6103ab565b90506020823d82116103fb575b816103e86020938361074a565b8101031261016f5761033b915190610331565b3d91506103db565b90506020813d821161042c575b8161041d6020938361074a565b8101031261016f575188610304565b3d9150610410565b6020945060249150610454906101003d81116101ea576101d5818361074a565b50509894935050505091506102cb565b6104808661048e86604051938493604085526040850190610717565b908382036020850152610717565b0390f35b90506020813d6020116104bc575b816104ad6020938361074a565b8101031261016f575182610278565b3d91506104a0565b3461016f57602036600319011261016f576104dd610701565b633962f82d60e01b82526001600160a01b0316905f90602081600481865afa90811561017b575f916106cf575b505f915b60ff831690828210156106c4576040516327b2595f60e11b8152600481018390529061010082602481895afa91821561017b575f905f93610694575b506040516370a0823160e01b81526004810188905290602090829060249082906001600160a01b03165afa90811561017b575f91610663575b5060405163246451e560e01b815260048101859052906020826024818b5afa90811561017b575f9161062e575b6105ba9250610834565b60405193632ea68d8560e01b855260048501526040846024818a5afa801561017b57610602946105fc946105f6935f925f9461060857506108f4565b90610834565b92610780565b9161050e565b90935061062491925060403d81116103c7576103b5818361074a565b919091928b610380565b90506020823d821161065b575b816106486020938361074a565b8101031261016f576105ba9151906105b0565b3d915061063b565b90506020813d821161068c575b8161067d6020938361074a565b8101031261016f575187610583565b3d9150610670565b60209350602491506106b4906101003d81116101ea576101d5818361074a565b505097949350505050915061054a565b602090604051908152f35b90506020813d6020116106f9575b816106ea6020938361074a565b8101031261016f57518361050a565b3d91506106dd565b600435906001600160a01b038216820361016f57565b90602080835192838152019201905f5b8181106107345750505090565b8251845260209384019390920191600101610727565b90601f8019910116810190811067ffffffffffffffff82111761076c57604052565b634e487b7160e01b5f52604160045260245ffd5b60ff1660ff81146107915760010190565b634e487b7160e01b5f52601160045260245ffd5b519061ffff8216820361016f57565b91908261010091031261016f5781516001600160a01b038116810361016f57916020810151801515810361016f57916107ef604083016107a5565b916107fc606082016107a5565b91610809608083016107a5565b9160a081015160ff8116810361016f579160c082015162ffffff8116810361016f5760e09092015190565b9190820180921161079157565b919082604091031261016f57602082519201518060030b810361016f5790565b67ffffffffffffffff811161076c5760051b60200190565b9061088382610861565b610890604051918261074a565b82815280926108a1601f1991610861565b0190602036910137565b80518210156108bf5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b8181029291811591840414171561079157565b604d811161079157600a0a90565b91929060ff61090f9260030b911603926011198401926108d3565b905f811315610942576109239192506108e6565b90811561092e570490565b634e487b7160e01b5f52601260045260245ffd5b600160ff1b146107915761095d6012610963935f03016108e6565b906108d3565b9056fea26469706673582212203b6453ca768ab36651ed67c7359f24a8ece3e795183986aca8e38b309129c45d64736f6c634300081c0033
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://3b6453ca768ab36651ed67c7359f24a8ece3e795183986aca8e38b309129c45d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.