Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11738097 | 43 hrs ago | Contract Creation | 0 S |
Loading...
Loading
Contract Name:
SonicVaultDecoderAndSanitizer
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 200 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import {BaseDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol"; import {SonicGatewayDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/SonicGatewayDecoderAndSanitizer.sol"; import {OdosDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/OdosDecoderAndSanitizer.sol"; import {AaveV3DecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/AaveV3DecoderAndSanitizer.sol"; import {SiloDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/SiloDecoderAndSanitizer.sol"; contract SonicVaultDecoderAndSanitizer is BaseDecoderAndSanitizer, SonicGatewayDecoderAndSanitizer, OdosDecoderAndSanitizer, AaveV3DecoderAndSanitizer, SiloDecoderAndSanitizer { constructor(address _odosRouter) OdosDecoderAndSanitizer(_odosRouter){} }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import {DecoderCustomTypes} from "src/interfaces/DecoderCustomTypes.sol"; contract BaseDecoderAndSanitizer { error BaseDecoderAndSanitizer__FunctionSelectorNotSupported(); //============================== IMMUTABLES =============================== function approve(address spender, uint256) external pure returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(spender); } function transfer(address _to, uint256) external pure returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_to); } function claimFees(address feeAsset) external pure returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(feeAsset); } function claimYield(address yieldAsset) external pure returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(yieldAsset); } function withdrawNonBoringToken(address token, uint256 /*amount*/ ) external pure returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(token); } function withdrawNativeFromDrone() external pure returns (bytes memory addressesFound) { return addressesFound; } //============================== FALLBACK =============================== /** * @notice The purpose of this function is to revert with a known error, * so that during merkle tree creation we can verify that a * leafs decoder and sanitizer implments the required function * selector. */ fallback() external { revert BaseDecoderAndSanitizer__FunctionSelectorNotSupported(); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import {BaseDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol"; abstract contract SonicGatewayDecoderAndSanitizer is BaseDecoderAndSanitizer { ////////////////// Sonic Gateway ////////////////// //bridges mainnet -> sonic function deposit(uint96, /*uid*/ address token, uint256 /*amount*/ ) external pure virtual returns (bytes memory addressesFound) { return abi.encodePacked(token); } //bridges sonic -> mainnet function withdraw(uint96, /*uid*/ address token, uint256 /*amount*/ ) external pure virtual returns (bytes memory addressesFound) { return abi.encodePacked(token); } function claim(uint256, /*id*/ address token, uint256, /*amount*/ bytes calldata /*proof*/ ) external pure virtual returns (bytes memory addressesFound) { return abi.encodePacked(token); } //if the bridge is "dead", we can cancel our deposit if needed function cancelDepositWhileDead(uint256, /*id*/ address token, uint256, /*amount*/ bytes calldata /*proof*/ ) external pure virtual returns (bytes memory addressesFound) { return abi.encodePacked(token); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol"; abstract contract OdosDecoderAndSanitizer is BaseDecoderAndSanitizer { // Reference to the OdosRouterV2 contract IOdosRouterV2 internal immutable odosRouter; //temp constructor(address _odosRouter) { odosRouter = IOdosRouterV2(_odosRouter); } function swap( DecoderCustomTypes.swapTokenInfo memory tokenInfo, bytes calldata /*pathDefinition*/, address executor, uint32 /*referralCode*/ ) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(tokenInfo.inputToken, tokenInfo.inputReceiver, tokenInfo.outputToken, tokenInfo.outputReceiver, executor); } function swapCompact() external view virtual returns (bytes memory addressesFound) { DecoderCustomTypes.swapTokenInfo memory tokenInfo; address executor; uint32 referralCode; bytes calldata pathDefinition; // Variables to store indices for addresses that need lookup Address memory inputTokenLookup; Address memory outputTokenLookup; Address memory executorLookup; { address msgSender = msg.sender; assembly { // Assembly function to get address from calldata function getAddress(currPos) -> result, newPos { let inputPos := shr(240, calldataload(currPos)) switch inputPos // Reserve the null address as a special case that can be specified with 2 null bytes case 0x0000 { result := 0 newPos := add(currPos, 2) } // This case means that the address is encoded in the calldata directly following the code case 0x0001 { result := and(shr(80, calldataload(currPos)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) newPos := add(currPos, 22) } // For addresses from the addressList, we'll just store the index for later retrieval default { // We'll use this later to know we need to look up from addressList result := 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE newPos := add(currPos, 2) } } let result := 0 let pos := 4 let fromList := 0 // Load in the input and output token addresses result, pos := getAddress(pos) if eq(result, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE) { let inputPos := shr(240, calldataload(sub(pos, 2))) //sub 2 because we added 2 in `getAddress`, shr 240 bits to get index mstore(add(inputTokenLookup, 0x00), sub(inputPos, 2)) // Store index mstore(add(inputTokenLookup, 0x20), 1) // Set needsLookup to true } mstore(tokenInfo, result) result, pos := getAddress(pos) if eq(result, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE) { let inputPos := shr(240, calldataload(sub(pos, 2))) mstore(add(outputTokenLookup, 0x00), sub(inputPos, 2)) mstore(add(outputTokenLookup, 0x20), 1) } mstore(add(tokenInfo, 0x60), result) // Load in the input amount - a 0 byte means the full balance is to be used let inputAmountLength := shr(248, calldataload(pos)) pos := add(pos, 1) if inputAmountLength { mstore(add(tokenInfo, 0x20), shr(mul(sub(32, inputAmountLength), 8), calldataload(pos))) pos := add(pos, inputAmountLength) } // Load in the quoted output amount let quoteAmountLength := shr(248, calldataload(pos)) pos := add(pos, 1) let outputQuote := shr(mul(sub(32, quoteAmountLength), 8), calldataload(pos)) mstore(add(tokenInfo, 0x80), outputQuote) pos := add(pos, quoteAmountLength) // Load the slippage tolerance and use to get the minimum output amount { let slippageTolerance := shr(232, calldataload(pos)) mstore(add(tokenInfo, 0xA0), div(mul(outputQuote, sub(0xFFFFFF, slippageTolerance)), 0xFFFFFF)) } pos := add(pos, 3) // Load in the executor address result, pos := getAddress(pos) if eq(result, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE) { let inputPos := shr(240, calldataload(sub(pos, 2))) mstore(add(executorLookup, 0x00), sub(inputPos, 2)) mstore(add(executorLookup, 0x20), 1) } executor := result // Load in the destination to send the input to - Zero denotes the executor result, pos := getAddress(pos) if eq(result, 0) { result := executor } mstore(add(tokenInfo, 0x40), result) // Load in the destination to send the output to - Zero denotes msg.sender result, pos := getAddress(pos) if eq(result, 0) { result := msgSender } mstore(add(tokenInfo, 0xC0), result) // Load in the referralCode referralCode := shr(224, calldataload(pos)) pos := add(pos, 4) // Set the offset and size for the pathDefinition portion of the msg.data pathDefinition.length := mul(shr(248, calldataload(pos)), 32) pathDefinition.offset := add(pos, 1) } } // For inputToken if (inputTokenLookup.needsLookup) { tokenInfo.inputToken = odosRouter.addressList(inputTokenLookup.tokenIndex); } // For outputToken if (outputTokenLookup.needsLookup) { tokenInfo.outputToken = odosRouter.addressList(outputTokenLookup.tokenIndex); } // For executor if (executorLookup.needsLookup) { executor = odosRouter.addressList(executorLookup.tokenIndex); } addressesFound = abi.encodePacked(tokenInfo.inputToken, tokenInfo.inputReceiver, tokenInfo.outputToken, tokenInfo.outputReceiver, executor); } } interface IOdosRouterV2 { function addressList(uint256 index) external view returns (address); } struct Address { uint256 tokenIndex; bool needsLookup; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol"; abstract contract AaveV3DecoderAndSanitizer is BaseDecoderAndSanitizer { //============================== AAVEV3 =============================== function supply(address asset, uint256, address onBehalfOf, uint16) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(asset, onBehalfOf); } function withdraw(address asset, uint256, address to) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(asset, to); } function borrow(address asset, uint256, uint256, uint16, address onBehalfOf) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(asset, onBehalfOf); } function repay(address asset, uint256, uint256, address onBehalfOf) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(asset, onBehalfOf); } function setUserUseReserveAsCollateral(address asset, bool) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(asset); } function setUserEMode(uint8) external pure virtual returns (bytes memory addressesFound) { // Nothing to sanitize or return return addressesFound; } function claimRewards(address[] calldata, /*assets*/ uint256, /*amount*/ address to, address /*reward*/ ) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(to); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol"; import {ERC4626DecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/ERC4626DecoderAndSanitizer.sol"; abstract contract SiloDecoderAndSanitizer is BaseDecoderAndSanitizer, ERC4626DecoderAndSanitizer { //in addition to ERC4626 functions for depositing, these functions can be used function deposit(uint256, /*_assets*/ address _receiver, DecoderCustomTypes.CollateralType /*_collateralType*/ ) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_receiver); } function mint(uint256, /*_shares*/ address _receiver, DecoderCustomTypes.CollateralType /*_collateralType*/ ) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_receiver); } function withdraw( uint256, /*_assets*/ address _receiver, address _owner, DecoderCustomTypes.CollateralType /*_collateralType*/ ) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_receiver, _owner); } function redeem( uint256, /*_shares*/ address _receiver, address _owner, DecoderCustomTypes.CollateralType /*_collateralType*/ ) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_receiver, _owner); } function borrow(uint256, /*_assets*/ address _receiver, address _borrower) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_receiver, _borrower); } function borrowShares(uint256, /*_shares*/ address _receiver, address _borrower) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_receiver, _borrower); } function borrowSameAsset(uint256, /*_assets*/ address _receiver, address _borrower) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_receiver, _borrower); } function repay(uint256, /*_assets*/ address _borrower) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_borrower); } function repayShares(uint256, /*_shares*/ address _borrower) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_borrower); } function transitionCollateral( uint256, /*_shares*/ address _owner, DecoderCustomTypes.CollateralType /*_transitionFrom*/ ) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(_owner); } function switchCollateralToThisSilo() external pure virtual returns (bytes memory addressesFound) { return addressesFound; } function accrueInterest() external pure virtual returns (bytes memory addressesFound) { return addressesFound; } // SILO ROUTER FUNCTIONS function execute(DecoderCustomTypes.Action[] memory actions) external pure virtual returns (bytes memory addressesFound) { for (uint256 i = 0; i < actions.length; i++) { address silo = address(actions[i].silo); address asset = address(actions[i].asset); addressesFound = abi.encodePacked(silo, asset); } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; contract DecoderCustomTypes { // ========================================= BALANCER ========================================= struct JoinPoolRequest { address[] assets; uint256[] maxAmountsIn; bytes userData; bool fromInternalBalance; } struct ExitPoolRequest { address[] assets; uint256[] minAmountsOut; bytes userData; bool toInternalBalance; } enum SwapKind { GIVEN_IN, GIVEN_OUT } struct SingleSwap { bytes32 poolId; SwapKind kind; address assetIn; address assetOut; uint256 amount; bytes userData; } struct FundManagement { address sender; bool fromInternalBalance; address recipient; bool toInternalBalance; } // ========================================= UNISWAP V3 ========================================= struct MintParams { address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } struct IncreaseLiquidityParams { uint256 tokenId; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; } struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } struct ExactInputParamsRouter02 { bytes path; address recipient; uint256 amountIn; uint256 amountOutMinimum; } struct PancakeSwapExactInputParams { bytes path; address recipient; uint256 amountIn; uint256 amountOutMinimum; } // ========================================= MORPHO BLUE ========================================= struct MarketParams { address loanToken; address collateralToken; address oracle; address irm; uint256 lltv; } // ========================================= 1INCH ========================================= struct SwapDescription { address srcToken; address dstToken; address payable srcReceiver; address payable dstReceiver; uint256 amount; uint256 minReturnAmount; uint256 flags; } // ========================================= PENDLE ========================================= struct TokenInput { // TOKEN DATA address tokenIn; uint256 netTokenIn; address tokenMintSy; // AGGREGATOR DATA address pendleSwap; SwapData swapData; } struct TokenOutput { // TOKEN DATA address tokenOut; uint256 minTokenOut; address tokenRedeemSy; // AGGREGATOR DATA address pendleSwap; SwapData swapData; } struct ApproxParams { uint256 guessMin; uint256 guessMax; uint256 guessOffchain; // pass 0 in to skip this variable uint256 maxIteration; // every iteration, the diff between guessMin and guessMax will be divided by 2 uint256 eps; // the max eps between the returned result & the correct result, base 1e18. Normally this number will be set // to 1e15 (1e18/1000 = 0.1%) } struct SwapData { SwapType swapType; address extRouter; bytes extCalldata; bool needScale; } enum SwapType { NONE, KYBERSWAP, ONE_INCH, // ETH_WETH not used in Aggregator ETH_WETH } struct LimitOrderData { address limitRouter; uint256 epsSkipMarket; // only used for swap operations, will be ignored otherwise FillOrderParams[] normalFills; FillOrderParams[] flashFills; bytes optData; } struct FillOrderParams { Order order; bytes signature; uint256 makingAmount; } struct Order { uint256 salt; uint256 expiry; uint256 nonce; OrderType orderType; address token; address YT; address maker; address receiver; uint256 makingAmount; uint256 lnImpliedRate; uint256 failSafeRate; bytes permit; } enum OrderType { SY_FOR_PT, PT_FOR_SY, SY_FOR_YT, YT_FOR_SY } // ========================================= EIGEN LAYER ========================================= struct QueuedWithdrawalParams { // Array of strategies that the QueuedWithdrawal contains address[] strategies; // Array containing the amount of shares in each Strategy in the `strategies` array uint256[] shares; // The address of the withdrawer address withdrawer; } struct Withdrawal { // The address that originated the Withdrawal address staker; // The address that the staker was delegated to at the time that the Withdrawal was created address delegatedTo; // The address that can complete the Withdrawal + will receive funds when completing the withdrawal address withdrawer; // Nonce used to guarantee that otherwise identical withdrawals have unique hashes uint256 nonce; // Block number when the Withdrawal was created uint32 startBlock; // Array of strategies that the Withdrawal contains address[] strategies; // Array containing the amount of shares in each Strategy in the `strategies` array uint256[] shares; } struct SignatureWithExpiry { // the signature itself, formatted as a single bytes object bytes signature; // the expiration timestamp (UTC) of the signature uint256 expiry; } struct EarnerTreeMerkleLeaf { address earner; bytes32 earnerTokenRoot; } struct TokenTreeMerkleLeaf { address token; uint256 cumulativeEarnings; } struct RewardsMerkleClaim { uint32 rootIndex; uint32 earnerIndex; bytes earnerTreeProof; EarnerTreeMerkleLeaf earnerLeaf; uint32[] tokenIndices; bytes[] tokenTreeProofs; TokenTreeMerkleLeaf[] tokenLeaves; } // ========================================= CCIP ========================================= // If extraArgs is empty bytes, the default is 200k gas limit. struct EVM2AnyMessage { bytes receiver; // abi.encode(receiver address) for dest EVM chains bytes data; // Data payload EVMTokenAmount[] tokenAmounts; // Token transfers address feeToken; // Address of feeToken. address(0) means you will send msg.value. bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV2) } /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers. struct EVMTokenAmount { address token; // token address on the local chain. uint256 amount; // Amount of tokens. } struct EVMExtraArgsV1 { uint256 gasLimit; } // ========================================= OFT ========================================= struct SendParam { uint32 dstEid; // Destination endpoint ID. bytes32 to; // Recipient address. uint256 amountLD; // Amount to send in local decimals. uint256 minAmountLD; // Minimum amount to send in local decimals. bytes extraOptions; // Additional options supplied by the caller to be used in the LayerZero message. bytes composeMsg; // The composed message for the send() operation. bytes oftCmd; // The OFT command to be executed, unused in default OFT implementations. } struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; } // ========================================= L1StandardBridge ========================================= struct WithdrawalTransaction { uint256 nonce; address sender; address target; uint256 value; uint256 gasLimit; bytes data; } struct OutputRootProof { bytes32 version; bytes32 stateRoot; bytes32 messagePasserStorageRoot; bytes32 latestBlockhash; } // ========================================= Mantle L1StandardBridge ========================================= struct MantleWithdrawalTransaction { uint256 nonce; address sender; address target; uint256 mntValue; uint256 value; uint256 gasLimit; bytes data; } // ========================================= Linea Bridge ========================================= struct ClaimMessageWithProofParams { bytes32[] proof; uint256 messageNumber; uint32 leafIndex; address from; address to; uint256 fee; uint256 value; address payable feeRecipient; bytes32 merkleRoot; bytes data; } // ========================================= Scroll Bridge ========================================= struct L2MessageProof { uint256 batchIndex; bytes merkleProof; } // ========================================= Camelot V3 ========================================= struct CamelotMintParams { address token0; address token1; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } // ========================================= Velodrome V3 ========================================= struct VelodromeMintParams { address token0; address token1; int24 tickSpacing; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; uint160 sqrtPriceX96; } // ========================================= Karak ========================================= struct QueuedWithdrawal { address staker; address delegatedTo; uint256 nonce; uint256 start; WithdrawRequest request; } struct WithdrawRequest { address[] vaults; uint256[] shares; address withdrawer; } // ========================================= Term Finance ================================== /// @dev TermAuctionOfferSubmission represents an offer submission to offeror an amount of money for a specific interest rate struct TermAuctionOfferSubmission { /// @dev For an existing offer this is the unique onchain identifier for this offer. For a new offer this is a randomized input that will be used to generate the unique onchain identifier. bytes32 id; /// @dev The address of the offeror address offeror; /// @dev Hash of the offered price as a percentage of the initial loaned amount vs amount returned at maturity. This stores 9 decimal places bytes32 offerPriceHash; /// @dev The maximum amount of purchase tokens that can be lent uint256 amount; /// @dev The address of the ERC20 purchase token address purchaseToken; } // ========================================= Dolomite Finance ================================== enum BalanceCheckFlag { Both, From, To, None } // ========================================= Silo Finance ================================== /// @dev There are 2 types of accounting in the system: for non-borrowable collateral deposit called "protected" and /// for borrowable collateral deposit called "collateral". System does /// identical calculations for each type of accounting but it uses different data. To avoid code duplication /// this enum is used to decide which data should be read. enum CollateralType { Protected, // default Collateral } enum ActionType { Deposit, Mint, Repay, RepayShares } struct Action { // what do you want to do? uint8 actionType; // which Silo are you interacting with? address silo; // what asset do you want to use? address asset; // options specific for actions bytes options; } struct AnyAction { // how much assets or shares do you want to use? uint256 amount; // are you using Protected, Collateral uint8 assetType; } // ========================================= LBTC Bridge ================================== struct DepositBridgeAction { uint256 fromChain; bytes32 fromContract; uint256 toChain; address toContract; address recipient; uint64 amount; uint256 nonce; } // ========================================= Odos ================================== struct swapTokenInfo { address inputToken; uint256 inputAmount; address inputReceiver; address outputToken; uint256 outputQuote; uint256 outputMin; address outputReceiver; } // ========================================= Level ================================== /// @dev for reference //enum OrderType { // MINT, // REDEEM //} struct LevelOrder { uint8 order_type; address benefactor; address beneficiary; address collateral_asset; uint256 collateral_amount; uint256 lvlusd_amount; } struct Route { address[] addresses; uint256[] ratios; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.21; import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol"; abstract contract ERC4626DecoderAndSanitizer is BaseDecoderAndSanitizer { //============================== ERC4626 =============================== function deposit(uint256, address receiver) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(receiver); } function mint(uint256, address receiver) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(receiver); } function withdraw(uint256, address receiver, address owner) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(receiver, owner); } function redeem(uint256, address receiver, address owner) external pure virtual returns (bytes memory addressesFound) { addressesFound = abi.encodePacked(receiver, owner); } }
{ "remappings": [ "@solmate/=lib/solmate/src/", "@forge-std/=lib/forge-std/src/", "@ds-test/=lib/forge-std/lib/ds-test/src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "@openzeppelin/=lib/openzeppelin-contracts/", "@ccip/=lib/ccip/", "@oapp-auth/=lib/OAppAuth/src/", "@devtools-oapp-evm/=lib/OAppAuth/lib/devtools/packages/oapp-evm/contracts/oapp/", "@layerzerolabs/lz-evm-messagelib-v2/=lib/OAppAuth/node_modules/@layerzerolabs/lz-evm-messagelib-v2/", "@layerzerolabs/lz-evm-protocol-v2/=lib/OAppAuth/lib/LayerZero-V2/packages/layerzero-v2/evm/protocol/", "@layerzerolabs/oapp-evm/=lib/OAppAuth/lib/devtools/packages/oapp-evm/", "@lz-oapp-evm/=lib/OAppAuth/lib/LayerZero-V2/packages/layerzero-v2/evm/oapp/contracts/oapp/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "LayerZero-V2/=lib/OAppAuth/lib/", "OAppAuth/=lib/OAppAuth/", "ccip/=lib/ccip/contracts/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "halmos-cheatcodes/=lib/OAppAuth/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "solidity-bytes-utils/=lib/OAppAuth/node_modules/solidity-bytes-utils/", "solmate/=lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "shanghai", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_odosRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BaseDecoderAndSanitizer__FunctionSelectorNotSupported","type":"error"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"accrueInterest","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"onBehalfOf","type":"address"}],"name":"borrow","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_borrower","type":"address"}],"name":"borrow","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_borrower","type":"address"}],"name":"borrowSameAsset","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_borrower","type":"address"}],"name":"borrowShares","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"cancelDepositWhileDead","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"claim","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"feeAsset","type":"address"}],"name":"claimFees","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"claimRewards","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"yieldAsset","type":"address"}],"name":"claimYield","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint96","name":"","type":"uint96"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"enum DecoderCustomTypes.CollateralType","name":"","type":"uint8"}],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"actionType","type":"uint8"},{"internalType":"address","name":"silo","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"bytes","name":"options","type":"bytes"}],"internalType":"struct DecoderCustomTypes.Action[]","name":"actions","type":"tuple[]"}],"name":"execute","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"enum DecoderCustomTypes.CollateralType","name":"","type":"uint8"}],"name":"mint","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"enum DecoderCustomTypes.CollateralType","name":"","type":"uint8"}],"name":"redeem","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"onBehalfOf","type":"address"}],"name":"repay","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_borrower","type":"address"}],"name":"repay","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_borrower","type":"address"}],"name":"repayShares","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"setUserEMode","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"name":"setUserUseReserveAsCollateral","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"supply","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"uint256","name":"inputAmount","type":"uint256"},{"internalType":"address","name":"inputReceiver","type":"address"},{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint256","name":"outputQuote","type":"uint256"},{"internalType":"uint256","name":"outputMin","type":"uint256"},{"internalType":"address","name":"outputReceiver","type":"address"}],"internalType":"struct DecoderCustomTypes.swapTokenInfo","name":"tokenInfo","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"swap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"swapCompact","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchCollateralToThisSilo","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"enum DecoderCustomTypes.CollateralType","name":"","type":"uint8"}],"name":"transitionCollateral","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint96","name":"","type":"uint96"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"enum DecoderCustomTypes.CollateralType","name":"","type":"uint8"}],"name":"withdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawNativeFromDrone","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawNonBoringToken","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60a060405234801561000f575f80fd5b5060405161136c38038061136c83398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b6080516112da6100925f395f8181610758015281816107f8015261089b01526112da5ff3fe608060405234801561000f575f80fd5b506004361061021a575f3560e01c8063999927df11610123578063b8337c2a116100ab578063d51641841161007a578063d516418414610329578063da3ef9d214610344578063da5376601461036c578063e36754eb14610303578063fa9b1c6a1461035e5761021a565b8063b8337c2a1461036c578063ba08765214610329578063c061ddc71461035e578063c3cd3eda1461037f5761021a565b8063a6afed95116100f2578063a6afed9514610344578063a9059cbb14610233578063acb7081514610303578063b460af9414610329578063b7ec8d4b1461035e5761021a565b8063999927df1461025c5780639f63522414610316578063a1ecef5c14610344578063a415bcad1461034b5761021a565b8063617ba037116101a65780637fe2c8b7116101755780637fe2c8b71461032957806383bd37f91461033c578063889576f71461032957806394bf804d1461030357806399016142146102ca5761021a565b8063617ba037146102dd57806369328dec146102f05780636e553f65146103035780637542cda8146103165761021a565b806328530a47116101ed57806328530a47146102825780633b635ce414610296578063573ade81146102a95780635a3b74b9146102bc5780635eaf5260146102ca5761021a565b8063095ea7b31461023357806309f0e0c21461023357806315a0ea6a1461025c578063236300dc1461026f575b604051633790be8760e21b815260040160405180910390fd5b610246610241366004610a2e565b610392565b6040516102539190610a58565b60405180910390f35b61024661026a366004610aa3565b6103bc565b61024661027d366004610ac5565b6103e5565b610246610290366004610b70565b50606090565b6102466102a4366004610c72565b610412565b6102466102b7366004610d5a565b61043c565b610246610241366004610da1565b6102466102d8366004610ddc565b61046a565b6102466102eb366004610e52565b61047d565b6102466102fe366004610ea0565b610492565b610246610311366004610edf565b6104bf565b610246610324366004610f02565b6104d2565b610246610337366004610f50565b6104e5565b6102466104fa565b6060610246565b610246610359366004610f84565b61094f565b610246610324366004610fdd565b61024661037a366004611018565b610964565b61024661038d36600461105b565b610979565b6060826040516020016103a591906111d8565b604051602081830303815290604052905092915050565b6060816040516020016103cf91906111d8565b6040516020818303038152906040529050919050565b6060826040516020016103f891906111d8565b604051602081830303815290604052905095945050505050565b6060855f0151866040015187606001518860c00151866040516020016103f89594939291906111f0565b6060848260405160200161045192919061122f565b6040516020818303038152906040529050949350505050565b6060846040516020016103f891906111d8565b6060848360405160200161045192919061122f565b606083826040516020016104a792919061122f565b60405160208183030381529060405290509392505050565b6060816040516020016103a591906111d8565b6060826040516020016104a791906111d8565b606082826040516020016104a792919061122f565b6040805160e0810182525f8082526020820181905291810182905260608181018390526080820183905260a0820183905260c08201929092525f80365f61055460405180604001604052805f81526020015f151581525090565b604080518082019091525f8082526020820152604080518082019091525f8082526020820152336105d7565b5f80823560f01c8080156105ab57600181146105b9576002600160a01b0393506002850192506105d0565b5f93506002850192506105d0565b6001600160a01b03853560501c1693506016850192505b5050915091565b5f60046105e381610580565b915091506002600160a01b03820361060a576001198082013560f01c018652600160208701525b818b5261061681610580565b915091506002600160a01b03820361063d576001198082013560f01c018552600160208601525b60608b0182905260018101903560f81c8015610668578135600882602003021c60208d015280820191505b50803560f81c6001820191508135600882602003021c8060808e01528183019250823560e81c915062ffffff8262ffffff0382020460a08e015250506003810190506106b381610580565b915091506002600160a01b0382036106da576001198082013560f01c018452600160208501525b8199506106e681610580565b9092509050816106f4578991505b8160408c015261070381610580565b909250905081610711578291505b60c08b0191909152602085810151823560e01c995060058301985060049092013560f81c0295501590506107d557825160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa1580156107a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c99190611251565b6001600160a01b031688525b81602001511561087857815160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa158015610845573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108699190611251565b6001600160a01b031660608901525b80602001511561090f57805160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa1580156108e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090c9190611251565b96505b87516040808a015160608b015160c08c015192516109339493908c906020016111f0565b6040516020818303038152906040529850505050505050505090565b606085826040516020016103f892919061122f565b6060838360405160200161045192919061122f565b60605f5b8251811015610a01575f8382815181106109995761099961126c565b60200260200101516020015190505f8483815181106109ba576109ba61126c565b602002602001015160400151905081816040516020016109db92919061122f565b6040516020818303038152906040529350505080806109f990611280565b91505061097d565b50919050565b6001600160a01b0381168114610a1b575f80fd5b50565b8035610a2981610a07565b919050565b5f8060408385031215610a3f575f80fd5b8235610a4a81610a07565b946020939093013593505050565b5f6020808352835180828501525f5b81811015610a8357858101830151858201604001528201610a67565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215610ab3575f80fd5b8135610abe81610a07565b9392505050565b5f805f805f60808688031215610ad9575f80fd5b853567ffffffffffffffff80821115610af0575f80fd5b818801915088601f830112610b03575f80fd5b813581811115610b11575f80fd5b8960208260051b8501011115610b25575f80fd5b6020928301975095505086013592506040860135610b4281610a07565b91506060860135610b5281610a07565b809150509295509295909350565b803560ff81168114610a29575f80fd5b5f60208284031215610b80575f80fd5b610abe82610b60565b634e487b7160e01b5f52604160045260245ffd5b60405160e0810167ffffffffffffffff81118282101715610bc057610bc0610b89565b60405290565b6040516080810167ffffffffffffffff81118282101715610bc057610bc0610b89565b604051601f8201601f1916810167ffffffffffffffff81118282101715610c1257610c12610b89565b604052919050565b5f8083601f840112610c2a575f80fd5b50813567ffffffffffffffff811115610c41575f80fd5b602083019150836020828501011115610c58575f80fd5b9250929050565b803563ffffffff81168114610a29575f80fd5b5f805f805f858703610140811215610c88575f80fd5b60e0811215610c95575f80fd5b50610c9e610b9d565b8635610ca981610a07565b8152602087810135908201526040870135610cc381610a07565b60408201526060870135610cd681610a07565b806060830152506080870135608082015260a087013560a082015260c0870135610cff81610a07565b60c0820152945060e086013567ffffffffffffffff811115610d1f575f80fd5b610d2b88828901610c1a565b9095509350610d3f90506101008701610a1e565b9150610d4e6101208701610c5f565b90509295509295909350565b5f805f8060808587031215610d6d575f80fd5b8435610d7881610a07565b935060208501359250604085013591506060850135610d9681610a07565b939692955090935050565b5f8060408385031215610db2575f80fd5b8235610dbd81610a07565b915060208301358015158114610dd1575f80fd5b809150509250929050565b5f805f805f60808688031215610df0575f80fd5b853594506020860135610e0281610a07565b935060408601359250606086013567ffffffffffffffff811115610e24575f80fd5b610e3088828901610c1a565b969995985093965092949392505050565b803561ffff81168114610a29575f80fd5b5f805f8060808587031215610e65575f80fd5b8435610e7081610a07565b9350602085013592506040850135610e8781610a07565b9150610e9560608601610e41565b905092959194509250565b5f805f60608486031215610eb2575f80fd5b8335610ebd81610a07565b9250602084013591506040840135610ed481610a07565b809150509250925092565b5f8060408385031215610ef0575f80fd5b823591506020830135610dd181610a07565b5f805f60608486031215610f14575f80fd5b83356bffffffffffffffffffffffff81168114610f2f575f80fd5b92506020840135610f3f81610a07565b929592945050506040919091013590565b5f805f60608486031215610f62575f80fd5b833592506020840135610f7481610a07565b91506040840135610ed481610a07565b5f805f805f60a08688031215610f98575f80fd5b8535610fa381610a07565b94506020860135935060408601359250610fbf60608701610e41565b91506080860135610b5281610a07565b803560028110610a29575f80fd5b5f805f60608486031215610fef575f80fd5b83359250602084013561100181610a07565b915061100f60408501610fcf565b90509250925092565b5f805f806080858703121561102b575f80fd5b84359350602085013561103d81610a07565b9250604085013561104d81610a07565b9150610e9560608601610fcf565b5f602080838503121561106c575f80fd5b823567ffffffffffffffff80821115611083575f80fd5b818501915085601f830112611096575f80fd5b8135818111156110a8576110a8610b89565b8060051b6110b7858201610be9565b91825283810185019185810190898411156110d0575f80fd5b86860192505b838310156111cb578235858111156110ed575f8081fd5b86016080601f19828d038101821315611105575f8081fd5b61110d610bc6565b6111188b8501610b60565b815260408085013561112981610a07565b828d015260608581013561113c81610a07565b8383015293850135938a851115611152575f8081fd5b84860195508f603f870112611168575f94508485fd5b8c86013594508a85111561117e5761117e610b89565b61118e8d85601f88011601610be9565b93508484528f828688010111156111a4575f8081fd5b848287018e8601375f9484018d0194909452509182015283525091860191908601906110d6565b9998505050505050505050565b60609190911b6001600160601b031916815260140190565b6001600160601b0319606096871b8116825294861b8516601482015292851b8416602884015290841b8316603c83015290921b16605082015260640190565b6001600160601b0319606093841b811682529190921b16601482015260280190565b5f60208284031215611261575f80fd5b8151610abe81610a07565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161129d57634e487b7160e01b5f52601160045260245ffd5b506001019056fea264697066735822122059729a98c88b33afec4811406280cc385b27ee7e8bb65d502be27c7eafb9f3dd64736f6c63430008150033000000000000000000000000ac041df48df9791b0654f1dbbf2cc8450c5f2e9d
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061021a575f3560e01c8063999927df11610123578063b8337c2a116100ab578063d51641841161007a578063d516418414610329578063da3ef9d214610344578063da5376601461036c578063e36754eb14610303578063fa9b1c6a1461035e5761021a565b8063b8337c2a1461036c578063ba08765214610329578063c061ddc71461035e578063c3cd3eda1461037f5761021a565b8063a6afed95116100f2578063a6afed9514610344578063a9059cbb14610233578063acb7081514610303578063b460af9414610329578063b7ec8d4b1461035e5761021a565b8063999927df1461025c5780639f63522414610316578063a1ecef5c14610344578063a415bcad1461034b5761021a565b8063617ba037116101a65780637fe2c8b7116101755780637fe2c8b71461032957806383bd37f91461033c578063889576f71461032957806394bf804d1461030357806399016142146102ca5761021a565b8063617ba037146102dd57806369328dec146102f05780636e553f65146103035780637542cda8146103165761021a565b806328530a47116101ed57806328530a47146102825780633b635ce414610296578063573ade81146102a95780635a3b74b9146102bc5780635eaf5260146102ca5761021a565b8063095ea7b31461023357806309f0e0c21461023357806315a0ea6a1461025c578063236300dc1461026f575b604051633790be8760e21b815260040160405180910390fd5b610246610241366004610a2e565b610392565b6040516102539190610a58565b60405180910390f35b61024661026a366004610aa3565b6103bc565b61024661027d366004610ac5565b6103e5565b610246610290366004610b70565b50606090565b6102466102a4366004610c72565b610412565b6102466102b7366004610d5a565b61043c565b610246610241366004610da1565b6102466102d8366004610ddc565b61046a565b6102466102eb366004610e52565b61047d565b6102466102fe366004610ea0565b610492565b610246610311366004610edf565b6104bf565b610246610324366004610f02565b6104d2565b610246610337366004610f50565b6104e5565b6102466104fa565b6060610246565b610246610359366004610f84565b61094f565b610246610324366004610fdd565b61024661037a366004611018565b610964565b61024661038d36600461105b565b610979565b6060826040516020016103a591906111d8565b604051602081830303815290604052905092915050565b6060816040516020016103cf91906111d8565b6040516020818303038152906040529050919050565b6060826040516020016103f891906111d8565b604051602081830303815290604052905095945050505050565b6060855f0151866040015187606001518860c00151866040516020016103f89594939291906111f0565b6060848260405160200161045192919061122f565b6040516020818303038152906040529050949350505050565b6060846040516020016103f891906111d8565b6060848360405160200161045192919061122f565b606083826040516020016104a792919061122f565b60405160208183030381529060405290509392505050565b6060816040516020016103a591906111d8565b6060826040516020016104a791906111d8565b606082826040516020016104a792919061122f565b6040805160e0810182525f8082526020820181905291810182905260608181018390526080820183905260a0820183905260c08201929092525f80365f61055460405180604001604052805f81526020015f151581525090565b604080518082019091525f8082526020820152604080518082019091525f8082526020820152336105d7565b5f80823560f01c8080156105ab57600181146105b9576002600160a01b0393506002850192506105d0565b5f93506002850192506105d0565b6001600160a01b03853560501c1693506016850192505b5050915091565b5f60046105e381610580565b915091506002600160a01b03820361060a576001198082013560f01c018652600160208701525b818b5261061681610580565b915091506002600160a01b03820361063d576001198082013560f01c018552600160208601525b60608b0182905260018101903560f81c8015610668578135600882602003021c60208d015280820191505b50803560f81c6001820191508135600882602003021c8060808e01528183019250823560e81c915062ffffff8262ffffff0382020460a08e015250506003810190506106b381610580565b915091506002600160a01b0382036106da576001198082013560f01c018452600160208501525b8199506106e681610580565b9092509050816106f4578991505b8160408c015261070381610580565b909250905081610711578291505b60c08b0191909152602085810151823560e01c995060058301985060049092013560f81c0295501590506107d557825160405163b810fb4360e01b815260048101919091527f000000000000000000000000ac041df48df9791b0654f1dbbf2cc8450c5f2e9d6001600160a01b03169063b810fb4390602401602060405180830381865afa1580156107a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c99190611251565b6001600160a01b031688525b81602001511561087857815160405163b810fb4360e01b815260048101919091527f000000000000000000000000ac041df48df9791b0654f1dbbf2cc8450c5f2e9d6001600160a01b03169063b810fb4390602401602060405180830381865afa158015610845573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108699190611251565b6001600160a01b031660608901525b80602001511561090f57805160405163b810fb4360e01b815260048101919091527f000000000000000000000000ac041df48df9791b0654f1dbbf2cc8450c5f2e9d6001600160a01b03169063b810fb4390602401602060405180830381865afa1580156108e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090c9190611251565b96505b87516040808a015160608b015160c08c015192516109339493908c906020016111f0565b6040516020818303038152906040529850505050505050505090565b606085826040516020016103f892919061122f565b6060838360405160200161045192919061122f565b60605f5b8251811015610a01575f8382815181106109995761099961126c565b60200260200101516020015190505f8483815181106109ba576109ba61126c565b602002602001015160400151905081816040516020016109db92919061122f565b6040516020818303038152906040529350505080806109f990611280565b91505061097d565b50919050565b6001600160a01b0381168114610a1b575f80fd5b50565b8035610a2981610a07565b919050565b5f8060408385031215610a3f575f80fd5b8235610a4a81610a07565b946020939093013593505050565b5f6020808352835180828501525f5b81811015610a8357858101830151858201604001528201610a67565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215610ab3575f80fd5b8135610abe81610a07565b9392505050565b5f805f805f60808688031215610ad9575f80fd5b853567ffffffffffffffff80821115610af0575f80fd5b818801915088601f830112610b03575f80fd5b813581811115610b11575f80fd5b8960208260051b8501011115610b25575f80fd5b6020928301975095505086013592506040860135610b4281610a07565b91506060860135610b5281610a07565b809150509295509295909350565b803560ff81168114610a29575f80fd5b5f60208284031215610b80575f80fd5b610abe82610b60565b634e487b7160e01b5f52604160045260245ffd5b60405160e0810167ffffffffffffffff81118282101715610bc057610bc0610b89565b60405290565b6040516080810167ffffffffffffffff81118282101715610bc057610bc0610b89565b604051601f8201601f1916810167ffffffffffffffff81118282101715610c1257610c12610b89565b604052919050565b5f8083601f840112610c2a575f80fd5b50813567ffffffffffffffff811115610c41575f80fd5b602083019150836020828501011115610c58575f80fd5b9250929050565b803563ffffffff81168114610a29575f80fd5b5f805f805f858703610140811215610c88575f80fd5b60e0811215610c95575f80fd5b50610c9e610b9d565b8635610ca981610a07565b8152602087810135908201526040870135610cc381610a07565b60408201526060870135610cd681610a07565b806060830152506080870135608082015260a087013560a082015260c0870135610cff81610a07565b60c0820152945060e086013567ffffffffffffffff811115610d1f575f80fd5b610d2b88828901610c1a565b9095509350610d3f90506101008701610a1e565b9150610d4e6101208701610c5f565b90509295509295909350565b5f805f8060808587031215610d6d575f80fd5b8435610d7881610a07565b935060208501359250604085013591506060850135610d9681610a07565b939692955090935050565b5f8060408385031215610db2575f80fd5b8235610dbd81610a07565b915060208301358015158114610dd1575f80fd5b809150509250929050565b5f805f805f60808688031215610df0575f80fd5b853594506020860135610e0281610a07565b935060408601359250606086013567ffffffffffffffff811115610e24575f80fd5b610e3088828901610c1a565b969995985093965092949392505050565b803561ffff81168114610a29575f80fd5b5f805f8060808587031215610e65575f80fd5b8435610e7081610a07565b9350602085013592506040850135610e8781610a07565b9150610e9560608601610e41565b905092959194509250565b5f805f60608486031215610eb2575f80fd5b8335610ebd81610a07565b9250602084013591506040840135610ed481610a07565b809150509250925092565b5f8060408385031215610ef0575f80fd5b823591506020830135610dd181610a07565b5f805f60608486031215610f14575f80fd5b83356bffffffffffffffffffffffff81168114610f2f575f80fd5b92506020840135610f3f81610a07565b929592945050506040919091013590565b5f805f60608486031215610f62575f80fd5b833592506020840135610f7481610a07565b91506040840135610ed481610a07565b5f805f805f60a08688031215610f98575f80fd5b8535610fa381610a07565b94506020860135935060408601359250610fbf60608701610e41565b91506080860135610b5281610a07565b803560028110610a29575f80fd5b5f805f60608486031215610fef575f80fd5b83359250602084013561100181610a07565b915061100f60408501610fcf565b90509250925092565b5f805f806080858703121561102b575f80fd5b84359350602085013561103d81610a07565b9250604085013561104d81610a07565b9150610e9560608601610fcf565b5f602080838503121561106c575f80fd5b823567ffffffffffffffff80821115611083575f80fd5b818501915085601f830112611096575f80fd5b8135818111156110a8576110a8610b89565b8060051b6110b7858201610be9565b91825283810185019185810190898411156110d0575f80fd5b86860192505b838310156111cb578235858111156110ed575f8081fd5b86016080601f19828d038101821315611105575f8081fd5b61110d610bc6565b6111188b8501610b60565b815260408085013561112981610a07565b828d015260608581013561113c81610a07565b8383015293850135938a851115611152575f8081fd5b84860195508f603f870112611168575f94508485fd5b8c86013594508a85111561117e5761117e610b89565b61118e8d85601f88011601610be9565b93508484528f828688010111156111a4575f8081fd5b848287018e8601375f9484018d0194909452509182015283525091860191908601906110d6565b9998505050505050505050565b60609190911b6001600160601b031916815260140190565b6001600160601b0319606096871b8116825294861b8516601482015292851b8416602884015290841b8316603c83015290921b16605082015260640190565b6001600160601b0319606093841b811682529190921b16601482015260280190565b5f60208284031215611261575f80fd5b8151610abe81610a07565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161129d57634e487b7160e01b5f52601160045260245ffd5b506001019056fea264697066735822122059729a98c88b33afec4811406280cc385b27ee7e8bb65d502be27c7eafb9f3dd64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ac041df48df9791b0654f1dbbf2cc8450c5f2e9d
-----Decoded View---------------
Arg [0] : _odosRouter (address): 0xaC041Df48dF9791B0654f1Dbbf2CC8450C5f2e9D
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ac041df48df9791b0654f1dbbf2cc8450c5f2e9d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.