Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60c06040 | 21977896 | 356 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SonicMainnetDecoderAndSanitizer
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 {UniswapV3DecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/UniswapV3DecoderAndSanitizer.sol";
import {ERC4626DecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/ERC4626DecoderAndSanitizer.sol";
import {EtherFiDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/EtherFiDecoderAndSanitizer.sol";
import {NativeWrapperDecoderAndSanitizer} from
"src/base/DecodersAndSanitizers/Protocols/NativeWrapperDecoderAndSanitizer.sol";
import {OneInchDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/OneInchDecoderAndSanitizer.sol";
import {AaveV3DecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/AaveV3DecoderAndSanitizer.sol";
import {LidoDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/LidoDecoderAndSanitizer.sol";
import {FluidFTokenDecoderAndSanitizer} from
"src/base/DecodersAndSanitizers/Protocols/FluidFTokenDecoderAndSanitizer.sol";
import {OFTDecoderAndSanitizer} from
"src/base/DecodersAndSanitizers/Protocols/OFTDecoderAndSanitizer.sol";
import {TellerDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/TellerDecoderAndSanitizer.sol";
import {OdosDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/OdosDecoderAndSanitizer.sol";
import {FluidDexDecoderAndSanitizer} from "src/base/DecodersAndSanitizers/Protocols/FluidDexDecoderAndSanitizer.sol";
contract SonicMainnetDecoderAndSanitizer is
UniswapV3DecoderAndSanitizer,
ERC4626DecoderAndSanitizer,
EtherFiDecoderAndSanitizer,
NativeWrapperDecoderAndSanitizer,
OneInchDecoderAndSanitizer,
AaveV3DecoderAndSanitizer,
LidoDecoderAndSanitizer,
FluidFTokenDecoderAndSanitizer,
OFTDecoderAndSanitizer,
TellerDecoderAndSanitizer,
OdosDecoderAndSanitizer
{
constructor(address _uniswapV3NonFungiblePositionManager, address _odosRouter)
UniswapV3DecoderAndSanitizer(_uniswapV3NonFungiblePositionManager)
OdosDecoderAndSanitizer(_odosRouter)
{}
//============================== HANDLE FUNCTION COLLISIONS ===============================
/**
* @notice EtherFi, NativeWrapper all specify a `deposit()`,
* all cases are handled the same way.
*/
function deposit()
external
pure
override(EtherFiDecoderAndSanitizer, NativeWrapperDecoderAndSanitizer)
returns (bytes memory addressesFound)
{
return addressesFound;
}
function wrap(uint256)
external
pure
override(EtherFiDecoderAndSanitizer, LidoDecoderAndSanitizer)
returns (bytes memory addressesFound)
{
// Nothing to sanitize or return
return addressesFound;
}
function unwrap(uint256)
external
pure
override(EtherFiDecoderAndSanitizer, LidoDecoderAndSanitizer)
returns (bytes memory addressesFound)
{
// Nothing to sanitize or return
return addressesFound;
}
}// 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 {INonFungiblePositionManager} from "src/interfaces/RawDataDecoderAndSanitizerInterfaces.sol";
import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
abstract contract UniswapV3DecoderAndSanitizer is BaseDecoderAndSanitizer {
//============================== ERRORS ===============================
error UniswapV3DecoderAndSanitizer__BadPathFormat();
error UniswapV3DecoderAndSanitizer__BadTokenId();
//============================== IMMUTABLES ===============================
/**
* @notice The networks uniswapV3 nonfungible position manager.
*/
INonFungiblePositionManager internal immutable uniswapV3NonFungiblePositionManager;
constructor(address _uniswapV3NonFungiblePositionManager) {
uniswapV3NonFungiblePositionManager = INonFungiblePositionManager(_uniswapV3NonFungiblePositionManager);
}
//============================== UNISWAP V3 ===============================
function exactInput(DecoderCustomTypes.ExactInputParams calldata params)
external
pure
virtual
returns (bytes memory addressesFound)
{
// Nothing to sanitize
// Return addresses found
// Determine how many addresses are in params.path.
uint256 chunkSize = 23; // 3 bytes for uint24 fee, and 20 bytes for address token
uint256 pathLength = params.path.length;
if (pathLength % chunkSize != 20) revert UniswapV3DecoderAndSanitizer__BadPathFormat();
uint256 pathAddressLength = 1 + (pathLength / chunkSize);
uint256 pathIndex;
for (uint256 i; i < pathAddressLength; ++i) {
addressesFound = abi.encodePacked(addressesFound, params.path[pathIndex:pathIndex + 20]);
pathIndex += chunkSize;
}
addressesFound = abi.encodePacked(addressesFound, params.recipient);
}
function mint(DecoderCustomTypes.MintParams calldata params)
external
pure
virtual
returns (bytes memory addressesFound)
{
// Nothing to sanitize
// Return addresses found
addressesFound = abi.encodePacked(params.token0, params.token1, params.recipient);
}
function increaseLiquidity(DecoderCustomTypes.IncreaseLiquidityParams calldata params)
external
view
virtual
returns (bytes memory addressesFound)
{
// Sanitize raw data
address owner = uniswapV3NonFungiblePositionManager.ownerOf(params.tokenId);
// Extract addresses from uniswapV3NonFungiblePositionManager.positions(params.tokenId).
(, address operator, address token0, address token1,,,,,,,,) =
uniswapV3NonFungiblePositionManager.positions(params.tokenId);
addressesFound = abi.encodePacked(operator, token0, token1, owner);
}
function decreaseLiquidity(DecoderCustomTypes.DecreaseLiquidityParams calldata params)
external
view
virtual
returns (bytes memory addressesFound)
{
// Sanitize raw data
// NOTE ownerOf check is done in PositionManager contract as well, but it is added here
// just for completeness.
address owner = uniswapV3NonFungiblePositionManager.ownerOf(params.tokenId);
// No addresses in data
return abi.encodePacked(owner);
}
function collect(DecoderCustomTypes.CollectParams calldata params)
external
view
virtual
returns (bytes memory addressesFound)
{
// Sanitize raw data
// NOTE ownerOf check is done in PositionManager contract as well, but it is added here
// just for completeness.
address owner = uniswapV3NonFungiblePositionManager.ownerOf(params.tokenId);
// Return addresses found
addressesFound = abi.encodePacked(params.recipient, owner);
}
function burn(uint256 /*tokenId*/ ) external pure virtual returns (bytes memory addressesFound) {
// positionManager.burn(tokenId) will verify that the tokenId has no liquidity, and no tokens owed.
// Nothing to sanitize or return
return addressesFound;
}
}// 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);
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;
import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
abstract contract EtherFiDecoderAndSanitizer is BaseDecoderAndSanitizer {
//============================== ETHERFI ===============================
function deposit() external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
function wrap(uint256) external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
function unwrap(uint256) external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
function requestWithdraw(address _addr, uint256) external pure virtual returns (bytes memory addressesFound) {
addressesFound = abi.encodePacked(_addr);
}
function claimWithdraw(uint256) external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;
import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
abstract contract NativeWrapperDecoderAndSanitizer is BaseDecoderAndSanitizer {
//============================== ETHERFI ===============================
function deposit() external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
function withdraw(uint256) external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;
import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
abstract contract OneInchDecoderAndSanitizer is BaseDecoderAndSanitizer {
//============================== ERRORS ===============================
error OneInchDecoderAndSanitizer__PermitNotSupported();
//============================== ONEINCH ===============================
function swap(
address executor,
DecoderCustomTypes.SwapDescription calldata desc,
bytes calldata permit,
bytes calldata
) external pure returns (bytes memory addressesFound) {
if (permit.length > 0) revert OneInchDecoderAndSanitizer__PermitNotSupported();
addressesFound = abi.encodePacked(executor, desc.srcToken, desc.dstToken, desc.srcReceiver, desc.dstReceiver);
}
function uniswapV3Swap(uint256, uint256, uint256[] calldata pools)
external
pure
returns (bytes memory addressesFound)
{
for (uint256 i; i < pools.length; ++i) {
addressesFound = abi.encodePacked(addressesFound, uint160(pools[i]));
}
}
}// 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";
abstract contract LidoDecoderAndSanitizer is BaseDecoderAndSanitizer {
//============================== LIDO ===============================
function submit(address referral) external pure virtual returns (bytes memory addressesFound) {
addressesFound = abi.encodePacked(referral);
}
function wrap(uint256) external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
function unwrap(uint256) external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
function requestWithdrawals(uint256[] calldata, address _owner)
external
pure
virtual
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(_owner);
}
function claimWithdrawal(uint256) external pure virtual returns (bytes memory addressesFound) {
// Nothing to sanitize or return
return addressesFound;
}
function claimWithdrawals(uint256[] calldata, uint256[] calldata)
external
pure
virtual
returns (bytes memory addressesFound)
{
// Nothing to sanitize or return
return addressesFound;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;
import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
abstract contract FluidFTokenDecoderAndSanitizer is BaseDecoderAndSanitizer {
//============================== Fluid FToken ===============================
function deposit(uint256, /*assets_*/ address receiver_, uint256 /*minAmountOut_*/ )
external
pure
virtual
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(receiver_);
}
function mint(uint256, /*shares_*/ address receiver_, uint256 /*maxAssets_*/ )
external
pure
virtual
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(receiver_);
}
function withdraw(uint256, /*assets_*/ address receiver_, address owner_, uint256 /*maxSharesBurn_*/ )
external
pure
virtual
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(receiver_, owner_);
}
function redeem(uint256, /*shares_*/ address receiver_, address owner_, uint256 /*minAmountOut_*/ )
external
pure
virtual
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(receiver_, owner_);
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;
import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
abstract contract OFTDecoderAndSanitizer is BaseDecoderAndSanitizer {
error OFTDecoderAndSanitizer__NonZeroMessage();
error OFTDecoderAndSanitizer__NonZeroOFTCommand();
//============================== OFT ===============================
function send(
DecoderCustomTypes.SendParam calldata _sendParam,
DecoderCustomTypes.MessagingFee calldata, /*_fee*/
address _refundAddress
) external pure virtual returns (bytes memory sensitiveArguments) {
// Sanitize Message.
if (_sendParam.composeMsg.length > 0) {
revert OFTDecoderAndSanitizer__NonZeroMessage();
}
if (_sendParam.oftCmd.length > 0) {
revert OFTDecoderAndSanitizer__NonZeroOFTCommand();
}
sensitiveArguments =
abi.encodePacked(address(uint160(_sendParam.dstEid)), address(bytes20(_sendParam.to << 96)), _refundAddress);
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;
import {BaseDecoderAndSanitizer, DecoderCustomTypes} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
abstract contract TellerDecoderAndSanitizer is BaseDecoderAndSanitizer {
//============================== Teller ===============================
function bulkDeposit(address depositAsset, uint256, /*depositAmount*/ uint256, /*minimumMint*/ address to)
external
pure
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(depositAsset, to);
}
function bulkWithdraw(address withdrawAsset, uint256, /*shareAmount*/ uint256, /*minimumAssets*/ address to)
external
pure
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(withdrawAsset, to);
}
function deposit(address depositAsset, uint256, /*depositAmount*/ uint256 /*minimumMint*/ )
external
pure
virtual
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(depositAsset);
}
// BoringOnChainQueue.sol
function requestOnChainWithdraw(address asset, uint128, uint16, uint24)
external
pure
virtual
returns (bytes memory addressesFound)
{
addressesFound = abi.encodePacked(asset);
}
}// 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} from "src/base/DecodersAndSanitizers/BaseDecoderAndSanitizer.sol";
abstract contract FluidDexDecoderAndSanitizer is BaseDecoderAndSanitizer {
/// @notice T2 and T3
/*
* @notice Vault T2 and T3 ((smart collateral, normal debt) / (normal collateral, smart debt))
* @notice T2 params on LHS, T3 on RHS -> T2ParamName/T3ParamName
* @dev These use the same function sig, so I'm just grouping them together
* @param nftId The ID of the NFT representing the vault position, use 0 for a new position
* @param newColToken0/newCol The change in collateral amount (positive for deposit, negative for withdrawal) * @param newColtoken1/newDebtToken0 The change in debt amount for token0 (positive for borrowing, negative for repayment)
* @param colSharesMinMax/newDebtToken1 The change in debt amount for token1 (positive for borrowing, negative for repayment)
* @param newDebt/debtSharesMinMax Min or max debt shares to mint or burn (positive for borrowing, negative for repayment)
* @param to The address to receive withdrawn collateral or borrowed tokens (if address(0), defaults to msg.sender)
*/
function operate(
uint256, /*nftId*/
int256, /*newColToken0 / newCol*/
int256, /*newColToken1 / newDebtToken0*/
int256, /*colSharesMinMax / newDebtToken1*/
int256, /*newDebt / debtSharesMinMax*/
address to
) external pure virtual returns (bytes memory addressesFound) {
addressesFound = abi.encodePacked(to);
}
/*
* @param nftId The ID of the NFT representing the vault position, use 0 for a new position
* @param perfectColShares The change in collateral shares (positive for deposit, negative for withdrawal)
* @param colToken0MinMax_ min or max collateral amount of token0 to withdraw or deposit (positive for deposit, negative for withdrawal)
* @param colToken1MinMax_ min or max collateral amount of token1 to withdraw or deposit (positive for deposit, negative for withdrawal)
* @param newDebt_ The change in debt amount (positive for borrowing, negative for repayment)
* @param to_ The address to receive withdrawn collateral or borrowed tokens (if address(0), defaults to msg.sender)
*/
function operatePerfect(
uint256, /*nftId*/
int256, /*perfectColShares*/
int256, /*colToken0MinMax*/
int256, /*colToken1MinMax*/
int256, /*newDebt*/
address to
) external pure virtual returns (bytes memory addressesFound) {
addressesFound = abi.encodePacked(to);
}
/// @notice T4 (smart collateral, smart debt)
/*
* @param nftId The ID of the NFT representing the vault position
* @param newColToken0 The change in collateral amount for token0 (positive for deposit, negative for withdrawal)
* @param newColToken1 The change in collateral amount for token1 (positive for deposit, negative for withdrawal)
* @param colSharesMinMax Min or max collateral shares to mint or burn (positive for deposit, negative for withdrawal)
* @param newDebtToken0 The change in debt amount for token0 (positive for borrowing, negative for repayment)
* @param newDebtToken1 The change in debt amount for token1 (positive for borrowing, negative for repayment)
* @param debtSharesMinMax Min or max debt shares to burn or mint (positive for borrowing, negative for repayment)
* @param to The address to receive funds (if address(0), defaults to msg.sender)
*/
function operate(
uint256, /*nftId*/
int256, /*newColToken0*/
int256, /*newColToken1*/
int256, /*colSharesMinMax*/
int256, /*newDebtToken0*/
int256, /*newDebtToken1*/
int256, /*debtSharesMinMax*/
address to
) external pure virtual returns (bytes memory addressesFound) {
addressesFound = abi.encodePacked(to);
}
/*
* @param nftId_ The ID of the NFT representing the vault position
* @param perfectColShares_ The change in collateral shares (positive for deposit, negative for withdrawal)
* @param colToken0MinMax_ Min or max collateral amount of token0 to withdraw or deposit (positive for deposit, negative for withdrawal)
* @param colToken1MinMax_ Min or max collateral amount of token1 to withdraw or deposit (positive for deposit, negative for withdrawal)
* @param perfectDebtShares_ The change in debt shares (positive for borrowing, negative for repayment)
* @param debtToken0MinMax_ Min or max debt amount for token0 to borrow or payback (positive for borrowing, negative for repayment)
* @param debtToken1MinMax_ Min or max debt amount for token1 to borrow or payback (positive for borrowing, negative for repayment)
* @param to_ The address to receive funds (if address(0), defaults to msg.sender)
*/
function operatePerfect(
uint256, /*nftId*/
int256, /*perfectColShares*/
int256, /*colToken0MinMax*/
int256, /*colToken1MinMax*/
int256, /*perfectDebtShares*/
int256, /*debtToken0MinMax*/
int256, /*debtToken1MinMax*/
address to
) external pure virtual returns (bytes memory addressesFound) {
addressesFound = abi.encodePacked(to);
}
}// 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;
// Swell
interface INonFungiblePositionManager {
struct Position {
// the nonce for permits
uint96 nonce;
// the address that is approved for spending this token
address operator;
// the ID of the pool with which this token is connected
uint80 poolId;
// the tick range of the position
int24 tickLower;
int24 tickUpper;
// the liquidity of the position
uint128 liquidity;
// the fee growth of the aggregate position as of the last action on the individual position
uint256 feeGrowthInside0LastX128;
uint256 feeGrowthInside1LastX128;
// how many uncollected tokens are owed to the position, as of the last computation
uint128 tokensOwed0;
uint128 tokensOwed1;
}
function ownerOf(uint256 tokenId) external view returns (address);
function positions(uint256 tokenId)
external
view
returns (
uint96 nonce,
address operator,
address token0,
address token1,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint128 liquidity,
uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128,
uint128 tokensOwed0,
uint128 tokensOwed1
);
}
interface PancakeSwapV3MasterChef {
function userPositionInfos(uint256 id)
external
view
returns (
uint128 liquidity,
uint128 boostLiquidity,
int24 tickLower,
int24 tickUpper,
uint256 rewardsGrowthInside,
uint256 reward,
address user,
uint256 pid,
uint256 boostMultiplier
);
}
interface CamelotNonFungiblePositionManager {
function ownerOf(uint256 tokenId) external view returns (address);
function positions(uint256 tokenId)
external
view
returns (
uint96 nonce,
address operator,
address token0,
address token1,
int24 tickLower,
int24 tickUpper,
uint128 liquidity,
uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128,
uint128 tokensOwed0,
uint128 tokensOwed1
);
}
interface IRecipeMarketHub {
function offerHashToIPOffer(bytes32 offer)
external
view
returns (uint256, bytes32, address, uint256, uint256, uint256);
}
interface IPoolRegistry {
function poolInfo(uint256 _pid) external view returns (address, address, address, address, uint8);
}{
"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":"_uniswapV3NonFungiblePositionManager","type":"address"},{"internalType":"address","name":"_odosRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BaseDecoderAndSanitizer__FunctionSelectorNotSupported","type":"error"},{"inputs":[],"name":"OFTDecoderAndSanitizer__NonZeroMessage","type":"error"},{"inputs":[],"name":"OFTDecoderAndSanitizer__NonZeroOFTCommand","type":"error"},{"inputs":[],"name":"OneInchDecoderAndSanitizer__PermitNotSupported","type":"error"},{"inputs":[],"name":"UniswapV3DecoderAndSanitizer__BadPathFormat","type":"error"},{"inputs":[],"name":"UniswapV3DecoderAndSanitizer__BadTokenId","type":"error"},{"stateMutability":"nonpayable","type":"fallback"},{"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":"address","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"bulkDeposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawAsset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"bulkWithdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burn","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":"uint256","name":"","type":"uint256"}],"name":"claimWithdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimWithdrawal","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"claimWithdrawals","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":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint128","name":"amount0Max","type":"uint128"},{"internalType":"uint128","name":"amount1Max","type":"uint128"}],"internalType":"struct DecoderCustomTypes.CollectParams","name":"params","type":"tuple"}],"name":"collect","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct DecoderCustomTypes.DecreaseLiquidityParams","name":"params","type":"tuple"}],"name":"decreaseLiquidity","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositAsset","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"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"}],"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":"uint256","name":"","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"internalType":"struct DecoderCustomTypes.ExactInputParams","name":"params","type":"tuple"}],"name":"exactInput","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct DecoderCustomTypes.IncreaseLiquidityParams","name":"params","type":"tuple"}],"name":"increaseLiquidity","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct DecoderCustomTypes.MintParams","name":"params","type":"tuple"}],"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"}],"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"},{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"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":"address","name":"asset","type":"address"},{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint24","name":"","type":"uint24"}],"name":"requestOnChainWithdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestWithdraw","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"requestWithdrawals","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct DecoderCustomTypes.SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct DecoderCustomTypes.MessagingFee","name":"","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"internalType":"bytes","name":"sensitiveArguments","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":"referral","type":"address"}],"name":"submit","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":[{"internalType":"address","name":"executor","type":"address"},{"components":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address payable","name":"srcReceiver","type":"address"},{"internalType":"address payable","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"}],"internalType":"struct DecoderCustomTypes.SwapDescription","name":"desc","type":"tuple"},{"internalType":"bytes","name":"permit","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"swap","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":[{"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":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"pools","type":"uint256[]"}],"name":"uniswapV3Swap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unwrap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdraw","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":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","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":[],"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"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrap","outputs":[{"internalType":"bytes","name":"addressesFound","type":"bytes"}],"stateMutability":"pure","type":"function"}]Contract Creation Code
60c060405234801562000010575f80fd5b5060405162001d5338038062001d53833981016040819052620000339162000067565b6001600160a01b039182166080521660a0526200009d565b80516001600160a01b038116811462000062575f80fd5b919050565b5f806040838503121562000079575f80fd5b62000084836200004b565b915062000094602084016200004b565b90509250929050565b60805160a051611c71620000e25f395f8181610b5901528181610bf90152610c9c01525f8181610508015281816106a001528181610738015261101b0152611c715ff3fe608060405234801561000f575f80fd5b5060043610610288575f3560e01c806394bf804d1161015a578063bc157ac1116100cc578063de0e9a3e11610085578063de0e9a3e14610350578063e3afe0a314610485578063e449022e1461049d578063ea598cb014610350578063f844443614610350578063fc6f7865146104b057610288565b8063bc157ac1146103de578063c04b8d5914610445578063c7c7f5b314610458578063d0e30db01461046b578063d668104214610472578063da3ef9d21461046b57610288565b8063a318c1a41161011e578063a318c1a41461040c578063a415bcad1461041f578063a9059cbb146102a1578063b13acedd14610350578063b460af9414610432578063ba0876521461043257610288565b806394bf804d146103cb578063999927df146103035780639d574420146103715780639f40a7b31461040c578063a1903eab1461030357610288565b80633b635ce4116101fe57806369328dec116101b757806369328dec146103a55780636bb3b476146103b85780636e553f65146103cb578063836a1040146103de57806383bd37f9146103f157806388316456146103f957610288565b80633b635ce41461035e5780633e64ce991461037157806342966c6814610350578063573ade81146103715780635a3b74b914610384578063617ba0371461039257610288565b806315a0ea6a1161025057806315a0ea6a14610303578063219f5d1714610316578063236300dc1461032957806328530a471461033c5780632e1a7d4d14610350578063397a1b28146102a157610288565b8063095ea7b3146102a157806309f0e0c2146102a15780630c49ccbe146102ca5780630efe6a8b146102dd57806312aa3caf146102f0575b604051633790be8760e21b815260040160405180910390fd5b6102b46102af3660046110d7565b6104c3565b6040516102c19190611123565b60405180910390f35b6102b46102d836600461116b565b6104ed565b6102b46102eb36600461118c565b6105a3565b6102b46102fe366004611213565b6105ce565b6102b46103113660046112a4565b61065c565b6102b46103243660046112bf565b610685565b6102b4610337366004611310565b610813565b6102b461034a36600461137f565b50606090565b6102b461034a36600461139f565b6102b461036c3660046113c9565b610840565b6102b461037f3660046114cf565b61086a565b6102b46102af366004611516565b6102b46103a0366004611562565b610898565b6102b46103b33660046115b0565b6108ad565b6102b46103c636600461161c565b6108c2565b6102b46103d9366004611668565b6108d5565b6102b46103ec36600461168b565b6108e8565b6102b46108fb565b6102b46104073660046116c0565b610d50565b6102b461041a3660046116d1565b610db3565b6102b461042d366004611716565b610dc8565b6102b4610440366004611761565b610ddd565b6102b4610453366004611795565b610df2565b6102b46104663660046117cf565b610eda565b60606102b4565b6102b461048036600461182d565b610f8b565b6102b4610493366004611875565b6060949350505050565b6102b46104ab3660046118dc565b610f9e565b6102b46104be36600461191f565b611000565b6060826040516020016104d6919061192f565b604051602081830303815290604052905092915050565b6040516331a9108f60e11b8152813560048201526060905f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015610555573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105799190611952565b90508060405160200161058c919061192f565b604051602081830303815290604052915050919050565b6060836040516020016105b6919061192f565b60405160208183030381529060405290509392505050565b606083156105ef5760405163aa8bfebd60e01b815260040160405180910390fd5b866105fd60208801886112a4565b61060d6040890160208a016112a4565b61061d60608a0160408b016112a4565b61062d60808b0160608c016112a4565b60405160200161064195949392919061196d565b60405160208183030381529060405290509695505050505050565b60608160405160200161066f919061192f565b6040516020818303038152906040529050919050565b6040516331a9108f60e11b8152813560048201526060905f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa1580156106ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107119190611952565b60405163133f757160e31b8152843560048201529091505f90819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906399fbab889060240161018060405180830381865afa15801561077e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a291906119d3565b505050505050505093509350935050828282866040516020016107f99493929190606094851b6001600160601b0319908116825293851b8416601482015291841b8316602883015290921b16603c82015260500190565b604051602081830303815290604052945050505050919050565b606082604051602001610826919061192f565b604051602081830303815290604052905095945050505050565b6060855f0151866040015187606001518860c001518660405160200161082695949392919061196d565b6060848260405160200161087f929190611aac565b6040516020818303038152906040529050949350505050565b6060848360405160200161087f929190611aac565b606083826040516020016105b6929190611aac565b60608460405160200161087f919061192f565b6060816040516020016104d6919061192f565b6060826040516020016105b6919061192f565b6040805160e0810182525f8082526020820181905291810182905260608181018390526080820183905260a0820183905260c08201929092525f80365f61095560405180604001604052805f81526020015f151581525090565b604080518082019091525f8082526020820152604080518082019091525f8082526020820152336109d8565b5f80823560f01c8080156109ac57600181146109ba576002600160a01b0393506002850192506109d1565b5f93506002850192506109d1565b6001600160a01b03853560501c1693506016850192505b5050915091565b5f60046109e481610981565b915091506002600160a01b038203610a0b576001198082013560f01c018652600160208701525b818b52610a1781610981565b915091506002600160a01b038203610a3e576001198082013560f01c018552600160208601525b60608b0182905260018101903560f81c8015610a69578135600882602003021c60208d015280820191505b50803560f81c6001820191508135600882602003021c8060808e01528183019250823560e81c915062ffffff8262ffffff0382020460a08e01525050600381019050610ab481610981565b915091506002600160a01b038203610adb576001198082013560f01c018452600160208501525b819950610ae781610981565b909250905081610af5578991505b8160408c0152610b0481610981565b909250905081610b12578291505b60c08b0191909152602085810151823560e01c995060058301985060049092013560f81c029550159050610bd657825160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa158015610ba6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bca9190611952565b6001600160a01b031688525b816020015115610c7957815160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa158015610c46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611952565b6001600160a01b031660608901525b806020015115610d1057805160405163b810fb4360e01b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b810fb4390602401602060405180830381865afa158015610ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0d9190611952565b96505b87516040808a015160608b015160c08c01519251610d349493908c9060200161196d565b6040516020818303038152906040529850505050505050505090565b6060610d5f60208301836112a4565b610d6f60408401602085016112a4565b610d81610140850161012086016112a4565b6040516001600160601b0319606094851b8116602083015292841b83166034820152921b166048820152605c0161066f565b6060838360405160200161087f929190611aac565b60608582604051602001610826929190611aac565b606082826040516020016105b6929190611aac565b606060175f610e018480611ace565b9150610e0f90508282611b25565b601414610e2f57604051633e8c06ad60e01b815260040160405180910390fd5b5f610e3a8383611b4c565b610e45906001611b5f565b90505f805b82811015610eb75785610e5d8880611ace565b8490610e6a826014611b5f565b92610e7793929190611b78565b604051602001610e8993929190611b9f565b60408051601f198184030181529190529550610ea58583611b5f565b9150610eb081611bc5565b9050610e4a565b5084610ec960408801602089016112a4565b6040516020016107f9929190611bdd565b60605f610eea60a0860186611ace565b90501115610f0b57604051633483a65b60e11b815260040160405180910390fd5b5f610f1960c0860186611ace565b90501115610f3a57604051630d90fb5b60e21b815260040160405180910390fd5b610f476020850185611c0e565b60405163ffffffff60601b606092831b166020828101919091526001600160601b031990870135831b811660348301529184901b9091166048820152605c016105b6565b6060816040516020016105b6919061192f565b60605f5b82811015610ff75781848483818110610fbd57610fbd611c27565b90506020020135604051602001610fd5929190611bdd565b604051602081830303815290604052915080610ff090611bc5565b9050610fa2565b50949350505050565b6040516331a9108f60e11b8152813560048201526060905f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015611068573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108c9190611952565b905061109e60408401602085016112a4565b8160405160200161058c929190611aac565b6001600160a01b03811681146110c4575f80fd5b50565b80356110d2816110b0565b919050565b5f80604083850312156110e8575f80fd5b82356110f3816110b0565b946020939093013593505050565b5f5b8381101561111b578181015183820152602001611103565b50505f910152565b602081525f8251806020840152611141816040850160208701611101565b601f01601f19169190910160400192915050565b5f60a08284031215611165575f80fd5b50919050565b5f60a0828403121561117b575f80fd5b6111858383611155565b9392505050565b5f805f6060848603121561119e575f80fd5b83356111a9816110b0565b95602085013595506040909401359392505050565b5f60e08284031215611165575f80fd5b5f8083601f8401126111de575f80fd5b50813567ffffffffffffffff8111156111f5575f80fd5b60208301915083602082850101111561120c575f80fd5b9250929050565b5f805f805f806101408789031215611229575f80fd5b8635611234816110b0565b955061124388602089016111be565b945061010087013567ffffffffffffffff80821115611260575f80fd5b61126c8a838b016111ce565b9096509450610120890135915080821115611285575f80fd5b5061129289828a016111ce565b979a9699509497509295939492505050565b5f602082840312156112b4575f80fd5b8135611185816110b0565b5f60c08284031215611165575f80fd5b5f8083601f8401126112df575f80fd5b50813567ffffffffffffffff8111156112f6575f80fd5b6020830191508360208260051b850101111561120c575f80fd5b5f805f805f60808688031215611324575f80fd5b853567ffffffffffffffff81111561133a575f80fd5b611346888289016112cf565b909650945050602086013592506040860135611361816110b0565b91506060860135611371816110b0565b809150509295509295909350565b5f6020828403121561138f575f80fd5b813560ff81168114611185575f80fd5b5f602082840312156113af575f80fd5b5035919050565b803563ffffffff811681146110d2575f80fd5b5f805f805f8587036101408112156113df575f80fd5b60e08112156113ec575f80fd5b5060405160e0810167ffffffffffffffff828210818311171561141d57634e487b7160e01b5f52604160045260245ffd5b8160405261142a896110c7565b83526020890135602084015261144260408a016110c7565b604084015261145360608a016110c7565b60608401526080890135608084015260a089013560a084015261147860c08a016110c7565b60c084015291965060e08801359180831115611492575f80fd5b50506114a0888289016111ce565b90955093506114b4905061010087016110c7565b91506114c361012087016113b6565b90509295509295909350565b5f805f80608085870312156114e2575f80fd5b84356114ed816110b0565b93506020850135925060408501359150606085013561150b816110b0565b939692955090935050565b5f8060408385031215611527575f80fd5b8235611532816110b0565b915060208301358015158114611546575f80fd5b809150509250929050565b803561ffff811681146110d2575f80fd5b5f805f8060808587031215611575575f80fd5b8435611580816110b0565b9350602085013592506040850135611597816110b0565b91506115a560608601611551565b905092959194509250565b5f805f606084860312156115c2575f80fd5b83356115cd816110b0565b92506020840135915060408401356115e4816110b0565b809150509250925092565b6fffffffffffffffffffffffffffffffff811681146110c4575f80fd5b62ffffff811681146110c4575f80fd5b5f805f806080858703121561162f575f80fd5b843561163a816110b0565b9350602085013561164a816115ef565b925061165860408601611551565b9150606085013561150b8161160c565b5f8060408385031215611679575f80fd5b823591506020830135611546816110b0565b5f805f6060848603121561169d575f80fd5b8335925060208401356116af816110b0565b929592945050506040919091013590565b5f6101608284031215611165575f80fd5b5f805f80608085870312156116e4575f80fd5b8435935060208501356116f6816110b0565b92506040850135611706816110b0565b9396929550929360600135925050565b5f805f805f60a0868803121561172a575f80fd5b8535611735816110b0565b9450602086013593506040860135925061175160608701611551565b91506080860135611371816110b0565b5f805f60608486031215611773575f80fd5b833592506020840135611785816110b0565b915060408401356115e4816110b0565b5f602082840312156117a5575f80fd5b813567ffffffffffffffff8111156117bb575f80fd5b6117c784828501611155565b949350505050565b5f805f83850360808112156117e2575f80fd5b843567ffffffffffffffff8111156117f8575f80fd5b611804878288016111be565b9450506040601f1982011215611818575f80fd5b5060208401915060608401356115e4816110b0565b5f805f6040848603121561183f575f80fd5b833567ffffffffffffffff811115611855575f80fd5b611861868287016112cf565b90945092505060208401356115e4816110b0565b5f805f8060408587031215611888575f80fd5b843567ffffffffffffffff8082111561189f575f80fd5b6118ab888389016112cf565b909650945060208701359150808211156118c3575f80fd5b506118d0878288016112cf565b95989497509550505050565b5f805f80606085870312156118ef575f80fd5b8435935060208501359250604085013567ffffffffffffffff811115611913575f80fd5b6118d0878288016112cf565b5f60808284031215611165575f80fd5b60609190911b6001600160601b031916815260140190565b80516110d2816110b0565b5f60208284031215611962575f80fd5b8151611185816110b0565b6001600160601b0319606096871b8116825294861b8516601482015292851b8416602884015290841b8316603c83015290921b16605082015260640190565b80516110d28161160c565b8051600281900b81146110d2575f80fd5b80516110d2816115ef565b5f805f805f805f805f805f806101808d8f0312156119ef575f80fd5b8c516bffffffffffffffffffffffff81168114611a0a575f80fd5b9b50611a1860208e01611947565b9a50611a2660408e01611947565b9950611a3460608e01611947565b9850611a4260808e016119ac565b9750611a5060a08e016119b7565b9650611a5e60c08e016119b7565b9550611a6c60e08e016119c8565b94506101008d015193506101208d01519250611a8b6101408e016119c8565b9150611a9a6101608e016119c8565b90509295989b509295989b509295989b565b6001600160601b0319606093841b811682529190921b16601482015260280190565b5f808335601e19843603018112611ae3575f80fd5b83018035915067ffffffffffffffff821115611afd575f80fd5b60200191503681900382131561120c575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f82611b3357611b33611b11565b500690565b634e487b7160e01b5f52601160045260245ffd5b5f82611b5a57611b5a611b11565b500490565b80820180821115611b7257611b72611b38565b92915050565b5f8085851115611b86575f80fd5b83861115611b92575f80fd5b5050820193919092039150565b5f8451611bb0818460208901611101565b8201838582375f930192835250909392505050565b5f60018201611bd657611bd6611b38565b5060010190565b5f8351611bee818460208801611101565b60609390931b6001600160601b0319169190920190815260140192915050565b5f60208284031215611c1e575f80fd5b611185826113b6565b634e487b7160e01b5f52603260045260245ffdfea264697066735822122042f34e0794ec4a7a064408b36cebc99ffe1d5846b691a1bfb9d72e82119680da64736f6c63430008150033000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610288575f3560e01c806394bf804d1161015a578063bc157ac1116100cc578063de0e9a3e11610085578063de0e9a3e14610350578063e3afe0a314610485578063e449022e1461049d578063ea598cb014610350578063f844443614610350578063fc6f7865146104b057610288565b8063bc157ac1146103de578063c04b8d5914610445578063c7c7f5b314610458578063d0e30db01461046b578063d668104214610472578063da3ef9d21461046b57610288565b8063a318c1a41161011e578063a318c1a41461040c578063a415bcad1461041f578063a9059cbb146102a1578063b13acedd14610350578063b460af9414610432578063ba0876521461043257610288565b806394bf804d146103cb578063999927df146103035780639d574420146103715780639f40a7b31461040c578063a1903eab1461030357610288565b80633b635ce4116101fe57806369328dec116101b757806369328dec146103a55780636bb3b476146103b85780636e553f65146103cb578063836a1040146103de57806383bd37f9146103f157806388316456146103f957610288565b80633b635ce41461035e5780633e64ce991461037157806342966c6814610350578063573ade81146103715780635a3b74b914610384578063617ba0371461039257610288565b806315a0ea6a1161025057806315a0ea6a14610303578063219f5d1714610316578063236300dc1461032957806328530a471461033c5780632e1a7d4d14610350578063397a1b28146102a157610288565b8063095ea7b3146102a157806309f0e0c2146102a15780630c49ccbe146102ca5780630efe6a8b146102dd57806312aa3caf146102f0575b604051633790be8760e21b815260040160405180910390fd5b6102b46102af3660046110d7565b6104c3565b6040516102c19190611123565b60405180910390f35b6102b46102d836600461116b565b6104ed565b6102b46102eb36600461118c565b6105a3565b6102b46102fe366004611213565b6105ce565b6102b46103113660046112a4565b61065c565b6102b46103243660046112bf565b610685565b6102b4610337366004611310565b610813565b6102b461034a36600461137f565b50606090565b6102b461034a36600461139f565b6102b461036c3660046113c9565b610840565b6102b461037f3660046114cf565b61086a565b6102b46102af366004611516565b6102b46103a0366004611562565b610898565b6102b46103b33660046115b0565b6108ad565b6102b46103c636600461161c565b6108c2565b6102b46103d9366004611668565b6108d5565b6102b46103ec36600461168b565b6108e8565b6102b46108fb565b6102b46104073660046116c0565b610d50565b6102b461041a3660046116d1565b610db3565b6102b461042d366004611716565b610dc8565b6102b4610440366004611761565b610ddd565b6102b4610453366004611795565b610df2565b6102b46104663660046117cf565b610eda565b60606102b4565b6102b461048036600461182d565b610f8b565b6102b4610493366004611875565b6060949350505050565b6102b46104ab3660046118dc565b610f9e565b6102b46104be36600461191f565b611000565b6060826040516020016104d6919061192f565b604051602081830303815290604052905092915050565b6040516331a9108f60e11b8152813560048201526060905f907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe886001600160a01b031690636352211e90602401602060405180830381865afa158015610555573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105799190611952565b90508060405160200161058c919061192f565b604051602081830303815290604052915050919050565b6060836040516020016105b6919061192f565b60405160208183030381529060405290509392505050565b606083156105ef5760405163aa8bfebd60e01b815260040160405180910390fd5b866105fd60208801886112a4565b61060d6040890160208a016112a4565b61061d60608a0160408b016112a4565b61062d60808b0160608c016112a4565b60405160200161064195949392919061196d565b60405160208183030381529060405290509695505050505050565b60608160405160200161066f919061192f565b6040516020818303038152906040529050919050565b6040516331a9108f60e11b8152813560048201526060905f907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe886001600160a01b031690636352211e90602401602060405180830381865afa1580156106ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107119190611952565b60405163133f757160e31b8152843560048201529091505f90819081906001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8816906399fbab889060240161018060405180830381865afa15801561077e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a291906119d3565b505050505050505093509350935050828282866040516020016107f99493929190606094851b6001600160601b0319908116825293851b8416601482015291841b8316602883015290921b16603c82015260500190565b604051602081830303815290604052945050505050919050565b606082604051602001610826919061192f565b604051602081830303815290604052905095945050505050565b6060855f0151866040015187606001518860c001518660405160200161082695949392919061196d565b6060848260405160200161087f929190611aac565b6040516020818303038152906040529050949350505050565b6060848360405160200161087f929190611aac565b606083826040516020016105b6929190611aac565b60608460405160200161087f919061192f565b6060816040516020016104d6919061192f565b6060826040516020016105b6919061192f565b6040805160e0810182525f8082526020820181905291810182905260608181018390526080820183905260a0820183905260c08201929092525f80365f61095560405180604001604052805f81526020015f151581525090565b604080518082019091525f8082526020820152604080518082019091525f8082526020820152336109d8565b5f80823560f01c8080156109ac57600181146109ba576002600160a01b0393506002850192506109d1565b5f93506002850192506109d1565b6001600160a01b03853560501c1693506016850192505b5050915091565b5f60046109e481610981565b915091506002600160a01b038203610a0b576001198082013560f01c018652600160208701525b818b52610a1781610981565b915091506002600160a01b038203610a3e576001198082013560f01c018552600160208601525b60608b0182905260018101903560f81c8015610a69578135600882602003021c60208d015280820191505b50803560f81c6001820191508135600882602003021c8060808e01528183019250823560e81c915062ffffff8262ffffff0382020460a08e01525050600381019050610ab481610981565b915091506002600160a01b038203610adb576001198082013560f01c018452600160208501525b819950610ae781610981565b909250905081610af5578991505b8160408c0152610b0481610981565b909250905081610b12578291505b60c08b0191909152602085810151823560e01c995060058301985060049092013560f81c029550159050610bd657825160405163b810fb4360e01b815260048101919091527f000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b07725596001600160a01b03169063b810fb4390602401602060405180830381865afa158015610ba6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bca9190611952565b6001600160a01b031688525b816020015115610c7957815160405163b810fb4360e01b815260048101919091527f000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b07725596001600160a01b03169063b810fb4390602401602060405180830381865afa158015610c46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611952565b6001600160a01b031660608901525b806020015115610d1057805160405163b810fb4360e01b815260048101919091527f000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b07725596001600160a01b03169063b810fb4390602401602060405180830381865afa158015610ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0d9190611952565b96505b87516040808a015160608b015160c08c01519251610d349493908c9060200161196d565b6040516020818303038152906040529850505050505050505090565b6060610d5f60208301836112a4565b610d6f60408401602085016112a4565b610d81610140850161012086016112a4565b6040516001600160601b0319606094851b8116602083015292841b83166034820152921b166048820152605c0161066f565b6060838360405160200161087f929190611aac565b60608582604051602001610826929190611aac565b606082826040516020016105b6929190611aac565b606060175f610e018480611ace565b9150610e0f90508282611b25565b601414610e2f57604051633e8c06ad60e01b815260040160405180910390fd5b5f610e3a8383611b4c565b610e45906001611b5f565b90505f805b82811015610eb75785610e5d8880611ace565b8490610e6a826014611b5f565b92610e7793929190611b78565b604051602001610e8993929190611b9f565b60408051601f198184030181529190529550610ea58583611b5f565b9150610eb081611bc5565b9050610e4a565b5084610ec960408801602089016112a4565b6040516020016107f9929190611bdd565b60605f610eea60a0860186611ace565b90501115610f0b57604051633483a65b60e11b815260040160405180910390fd5b5f610f1960c0860186611ace565b90501115610f3a57604051630d90fb5b60e21b815260040160405180910390fd5b610f476020850185611c0e565b60405163ffffffff60601b606092831b166020828101919091526001600160601b031990870135831b811660348301529184901b9091166048820152605c016105b6565b6060816040516020016105b6919061192f565b60605f5b82811015610ff75781848483818110610fbd57610fbd611c27565b90506020020135604051602001610fd5929190611bdd565b604051602081830303815290604052915080610ff090611bc5565b9050610fa2565b50949350505050565b6040516331a9108f60e11b8152813560048201526060905f907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe886001600160a01b031690636352211e90602401602060405180830381865afa158015611068573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108c9190611952565b905061109e60408401602085016112a4565b8160405160200161058c929190611aac565b6001600160a01b03811681146110c4575f80fd5b50565b80356110d2816110b0565b919050565b5f80604083850312156110e8575f80fd5b82356110f3816110b0565b946020939093013593505050565b5f5b8381101561111b578181015183820152602001611103565b50505f910152565b602081525f8251806020840152611141816040850160208701611101565b601f01601f19169190910160400192915050565b5f60a08284031215611165575f80fd5b50919050565b5f60a0828403121561117b575f80fd5b6111858383611155565b9392505050565b5f805f6060848603121561119e575f80fd5b83356111a9816110b0565b95602085013595506040909401359392505050565b5f60e08284031215611165575f80fd5b5f8083601f8401126111de575f80fd5b50813567ffffffffffffffff8111156111f5575f80fd5b60208301915083602082850101111561120c575f80fd5b9250929050565b5f805f805f806101408789031215611229575f80fd5b8635611234816110b0565b955061124388602089016111be565b945061010087013567ffffffffffffffff80821115611260575f80fd5b61126c8a838b016111ce565b9096509450610120890135915080821115611285575f80fd5b5061129289828a016111ce565b979a9699509497509295939492505050565b5f602082840312156112b4575f80fd5b8135611185816110b0565b5f60c08284031215611165575f80fd5b5f8083601f8401126112df575f80fd5b50813567ffffffffffffffff8111156112f6575f80fd5b6020830191508360208260051b850101111561120c575f80fd5b5f805f805f60808688031215611324575f80fd5b853567ffffffffffffffff81111561133a575f80fd5b611346888289016112cf565b909650945050602086013592506040860135611361816110b0565b91506060860135611371816110b0565b809150509295509295909350565b5f6020828403121561138f575f80fd5b813560ff81168114611185575f80fd5b5f602082840312156113af575f80fd5b5035919050565b803563ffffffff811681146110d2575f80fd5b5f805f805f8587036101408112156113df575f80fd5b60e08112156113ec575f80fd5b5060405160e0810167ffffffffffffffff828210818311171561141d57634e487b7160e01b5f52604160045260245ffd5b8160405261142a896110c7565b83526020890135602084015261144260408a016110c7565b604084015261145360608a016110c7565b60608401526080890135608084015260a089013560a084015261147860c08a016110c7565b60c084015291965060e08801359180831115611492575f80fd5b50506114a0888289016111ce565b90955093506114b4905061010087016110c7565b91506114c361012087016113b6565b90509295509295909350565b5f805f80608085870312156114e2575f80fd5b84356114ed816110b0565b93506020850135925060408501359150606085013561150b816110b0565b939692955090935050565b5f8060408385031215611527575f80fd5b8235611532816110b0565b915060208301358015158114611546575f80fd5b809150509250929050565b803561ffff811681146110d2575f80fd5b5f805f8060808587031215611575575f80fd5b8435611580816110b0565b9350602085013592506040850135611597816110b0565b91506115a560608601611551565b905092959194509250565b5f805f606084860312156115c2575f80fd5b83356115cd816110b0565b92506020840135915060408401356115e4816110b0565b809150509250925092565b6fffffffffffffffffffffffffffffffff811681146110c4575f80fd5b62ffffff811681146110c4575f80fd5b5f805f806080858703121561162f575f80fd5b843561163a816110b0565b9350602085013561164a816115ef565b925061165860408601611551565b9150606085013561150b8161160c565b5f8060408385031215611679575f80fd5b823591506020830135611546816110b0565b5f805f6060848603121561169d575f80fd5b8335925060208401356116af816110b0565b929592945050506040919091013590565b5f6101608284031215611165575f80fd5b5f805f80608085870312156116e4575f80fd5b8435935060208501356116f6816110b0565b92506040850135611706816110b0565b9396929550929360600135925050565b5f805f805f60a0868803121561172a575f80fd5b8535611735816110b0565b9450602086013593506040860135925061175160608701611551565b91506080860135611371816110b0565b5f805f60608486031215611773575f80fd5b833592506020840135611785816110b0565b915060408401356115e4816110b0565b5f602082840312156117a5575f80fd5b813567ffffffffffffffff8111156117bb575f80fd5b6117c784828501611155565b949350505050565b5f805f83850360808112156117e2575f80fd5b843567ffffffffffffffff8111156117f8575f80fd5b611804878288016111be565b9450506040601f1982011215611818575f80fd5b5060208401915060608401356115e4816110b0565b5f805f6040848603121561183f575f80fd5b833567ffffffffffffffff811115611855575f80fd5b611861868287016112cf565b90945092505060208401356115e4816110b0565b5f805f8060408587031215611888575f80fd5b843567ffffffffffffffff8082111561189f575f80fd5b6118ab888389016112cf565b909650945060208701359150808211156118c3575f80fd5b506118d0878288016112cf565b95989497509550505050565b5f805f80606085870312156118ef575f80fd5b8435935060208501359250604085013567ffffffffffffffff811115611913575f80fd5b6118d0878288016112cf565b5f60808284031215611165575f80fd5b60609190911b6001600160601b031916815260140190565b80516110d2816110b0565b5f60208284031215611962575f80fd5b8151611185816110b0565b6001600160601b0319606096871b8116825294861b8516601482015292851b8416602884015290841b8316603c83015290921b16605082015260640190565b80516110d28161160c565b8051600281900b81146110d2575f80fd5b80516110d2816115ef565b5f805f805f805f805f805f806101808d8f0312156119ef575f80fd5b8c516bffffffffffffffffffffffff81168114611a0a575f80fd5b9b50611a1860208e01611947565b9a50611a2660408e01611947565b9950611a3460608e01611947565b9850611a4260808e016119ac565b9750611a5060a08e016119b7565b9650611a5e60c08e016119b7565b9550611a6c60e08e016119c8565b94506101008d015193506101208d01519250611a8b6101408e016119c8565b9150611a9a6101608e016119c8565b90509295989b509295989b509295989b565b6001600160601b0319606093841b811682529190921b16601482015260280190565b5f808335601e19843603018112611ae3575f80fd5b83018035915067ffffffffffffffff821115611afd575f80fd5b60200191503681900382131561120c575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f82611b3357611b33611b11565b500690565b634e487b7160e01b5f52601160045260245ffd5b5f82611b5a57611b5a611b11565b500490565b80820180821115611b7257611b72611b38565b92915050565b5f8085851115611b86575f80fd5b83861115611b92575f80fd5b5050820193919092039150565b5f8451611bb0818460208901611101565b8201838582375f930192835250909392505050565b5f60018201611bd657611bd6611b38565b5060010190565b5f8351611bee818460208801611101565b60609390931b6001600160601b0319169190920190815260140192915050565b5f60208284031215611c1e575f80fd5b611185826113b6565b634e487b7160e01b5f52603260045260245ffdfea264697066735822122042f34e0794ec4a7a064408b36cebc99ffe1d5846b691a1bfb9d72e82119680da64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559
-----Decoded View---------------
Arg [0] : _uniswapV3NonFungiblePositionManager (address): 0xC36442b4a4522E871399CD717aBDD847Ab11FE88
Arg [1] : _odosRouter (address): 0xCf5540fFFCdC3d510B18bFcA6d2b9987b0772559
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88
Arg [1] : 000000000000000000000000cf5540fffcdc3d510b18bfca6d2b9987b0772559
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.