Skip to main content

Panoptic pool

Creates and manages undercollateralized options. Manages positions, collateral, liquidations and forced exercises.

Panoptic Pool, create permissionless option on top of Uniswap V3

All liquidity deployed to/from Uniswap v3 is owned by this smart contract

Write Methods

startPool

function startPool(
address _univ3pool,
address _collateralReference
) external nonpayable

Creates a method for creating a Panoptic pool on top of an existing Uniswap v3 pair

Must be called first before any transaction can occur. Must also deploy collateralReference first.

Parameters

NameTypeDescription
_univ3pooladdressAddress of the target Uniswap v3 pool
_collateralReferenceaddressundefined

deposit

function deposit(
uint128 assets,
address token
) external nonpayable returns (uint256 shares)

Will internally compute the number of shares to mint

Parameters

NameTypeDescription
assetsuint128User-specified amount of token deposited
tokenaddressAddress of the token deposited, must be uniswapPool's token0 or token1

Returns

NameTypeDescription
sharesuint256The number of shares minted when assets were deposited

withdraw

function withdraw(
uint256 shares,
address token,
uint256[] positionIdList
) external nonpayable returns (uint128 assets)

Withdraw collateral assets from the Panoptic Pool

Will internally compute the number of shares to burn

Parameters

NameTypeDescription
sharesuint256User-specified amount of shares token to be withdrawn. Will withdraw all if greater than user's balance
tokenaddressAddress of the token deposited, must be uniswapPool's token0 or token1
positionIdListuint256[]List of positions owned by the user. Written as [tokenId1, tokenId2, ...]

Returns

NameTypeDescription
assetsuint128The number of assets withdrawn

mintOptions

function mintOptions(
uint256[] positionIdList,
uint128 positionSize,
uint256 effectiveLiquidityLimit
) external nonpayable returns (bool)

Mints a specific number of contracts for a new option

Must be a new option, will revert if a position with that tokenId already exists.

Parameters

NameTypeDescription
positionIdListuint256[]List of positions owned by msg.sender. Written as [tokenId1, tokenId2, ..., tokenIdN] with tokenIdN as the NEW TOKEN
positionSizeuint128The number of contracts to be minted, expressed in terms of the numeraire
effectiveLiquidityLimituint256Maximum amount of "spread" defined as baseLiquidity/(baseLiquidity - legLiquidity) for a new position. Generate using effectiveLiquidityFactorHelper first or set to 0 for no limit / only short options

Returns

NameTypeDescription
_0boolReturns true if the mint is successful

mintOptionsITM

function mintOptionsITM(
uint256[] positionIdList,
uint128 positionSize,
uint256 effectiveLiquidityLimit,
int24 tickLimitLow,
int24 tickLimitHigh
) external nonpayable returns (bool success)

Mints a specific number of contracts for a new option that is ITM

Must be a new option, will revert if a position with that tokenId already exists or it is not ITM.

Parameters

NameTypeDescription
positionIdListuint256[]List of positions owned by msg.sender. Written as [tokenId1, tokenId2, ..., tokenIdN] with tokenIdN as the NEW TOKEN
positionSizeuint128The number of contracts to be minted, expressed in terms of the numeraire
effectiveLiquidityLimituint256Maximum amount of "spread" defined as baseLiquidity/(baseLiquidity - legLiquidity) for a new position. Generate using effectiveLiquidityFactorHelper first or set to 0 for no limit / only short options
tickLimitLowint24Low price slippage limit when minting ITM option
tickLimitHighint24High price slippage limit when minting ITM option

Returns

NameTypeDescription
successboolReturns true if the ITM mint is successful

burnOptions

function burnOptions(
uint256 tokenId
) external nonpayable returns (bool)

Burns the entire balance of tokenId of msg.sender

Will exercise if necessary, and will revert if user does not have enough collateral to exercise.

Parameters

NameTypeDescription
tokenIduint256The tokenId of the position to be burnt

Returns

NameTypeDescription
_0boolReturns true is the burn is successful

burnOptionsITM

function burnOptionsITM(
uint256 tokenId,
int24 tickLimitLow,
int24 tickLimitHigh
) external nonpayable returns (bool)

Burns the entire balance of tokenId of msg.sender

Will exercise if necessary, and will revert if user does not have enough collateral to exercise.

Parameters

NameTypeDescription
tokenIduint256The tokenId of the position to be burnt
tickLimitLowint24Price slippage limit when burning an ITM option
tickLimitHighint24Price slippage limit when burning an ITM option

Returns

NameTypeDescription
_0boolReturns true is the burn is successful

forceExercise

function forceExercise(
address _account,
int24 tickLimitLow,
int24 tickLimitHigh,
uint256[] _positionIdList,
uint256[] _touchedId,
uint256[] _leftoverIds
) external nonpayable

Will revert if: number of touchedId is larger than 1 or if user force exercises their own position

Parameters

NameTypeDescription
_accountaddressundefined
tickLimitLowint24The lower tick slippagelimit
tickLimitHighint24The upper tick slippagelimit
_positionIdListuint256[]undefined
_touchedIduint256[]undefined
_leftoverIdsuint256[]undefined

liquidateAccount

function liquidateAccount(
address _account,
int24 tickLimitLow,
int24 tickLimitHigh,
uint256[] _positionIdList,
uint256[] emptyList
) external nonpayable

Liquidates a distressed account. Will burn all positions and will issue a bonus to the liquidator

Will revert if: accout is not margin called or if the user liquidates themselves

Parameters

NameTypeDescription
_accountaddressundefined
tickLimitLowint24The lower tick slippagelimit
tickLimitHighint24The upper tick slippagelimit
_positionIdListuint256[]undefined
emptyListuint256[]Must always be provided as []

View Methods

calculateAccumulatedFeesBatch

function calculateAccumulatedFeesBatch(
address user,
uint256[] positionIdList
) external view returns (int128 premium0, int128 premium1)

Computes the total amount of premium accumulated for a list of positions

Could be costly because it reads information from 2 ticks for each leg of each tokenId

Parameters

NameTypeDescription
useraddressAddress of the user that owns the positions
positionIdListuint256[]List of positions. Written as [tokenId1, tokenId2, ...]

Returns

NameTypeDescription
premium0int128Premium for token0 (negative = amount is owed)
premium1int128Premium for token1 (negative = amount is owed)

checkCollateral

function checkCollateral(
address token,
address account,
int24 atTick,
uint256[] positionIdList
) external view returns (uint128, uint128)

Computes the collateral requirement of a given account and for a given token

To be used as a helper function or called from another contract

Parameters

NameTypeDescription
tokenaddressAddress of the collateral token
accountaddressAddress of the account to check collateral
atTickint24Value of the tick at which collateral is checked (user-specified)
positionIdListuint256[]List of positions owned by the user. Written as [tokenId1, tokenId2, ...]

Returns

NameTypeDescription
tokenBalanceuint128Balance of token held by the account
tokenRequireduint128Amount of token required as collateral for that account

optionPositionBalance

function optionPositionBalance(
address user,
uint256 tokenId)
external view returns (uint128 balance, uint128 poolUtilizations)

Returns the total number of contracts by user for a specified position

Parameters

NameTypeDescription
useraddressAddress of the account to be checked
tokenIduint256TokenId of the position to be checked

Returns

NameTypeDescription
balanceuint128Number of contracts of tokenId owned by the user
poolUtilizationsuint128Utilizations of the collateral pools: utilization(token0) = uint64(poolUtilizations), utilization(token1) = uint64(poolUtilizations >> 64)

optionPositionCounter

function optionPositionCounter(
address user
) external view returns (uint128 n)

Returns the total number of positions owned by a user

Parameters

NameTypeDescription
useraddressAddress of the account to be checked

Returns

NameTypeDescription
nuint128Number of positions owned by user

Events

AccountLiquidated

event AccountLiquidated(
address liquidator,
address liquidatee,
int256 bonusAmounts
)

Emitted when an account is liquidated

Parameters

NameTypeDescription
liquidatoraddressundefined
liquidateeaddressundefined
bonusAmountsint256undefined

Deposited

event Deposited(
address user,
address tokenAddress,
uint128 assets,
uint256 shares
)

Emitted when any amount is deposited as collateral

Parameters

NameTypeDescription
useraddressundefined
tokenAddressaddressundefined
assetsuint128undefined
sharesuint256undefined

ForcedExercised

event ForcedExercised(
address exercisor,
address user,
uint256 tokenId,
uint256 costAmounts
)

Emitted when a position is forces exercised

Parameters

NameTypeDescription
exercisoraddressundefined
useraddressundefined
tokenIduint256undefined
costAmountsuint256undefined

OptionBurnt

event OptionBurnt(
address recipient,
uint128 numberOfContracts,
uint256 tokenId,
int256 premia,
uint128 positionCounter
)

Emitted when an option is burnt

Parameters

NameTypeDescription
recipientaddressundefined
numberOfContractsuint128undefined
tokenIduint256undefined
premiaint256undefined
positionCounteruint128undefined

OptionMinted

event OptionMinted(
address recipient,
uint128 numberOfContracts,
uint256 tokenId,
int256 commissionRates,
uint128 poolUtilizations,
uint256 positionCounter
)

Emitted when an option is minted

Parameters

NameTypeDescription
recipientaddressundefined
numberOfContractsuint128undefined
tokenIduint256undefined
commissionRatesint256undefined
poolUtilizationsuint128undefined
positionCounteruint256undefined

OwnershipTransferred

event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
)

Parameters

NameTypeDescription
previousOwner indexedaddressundefined
newOwner indexedaddressundefined

Withdrawn

event Withdrawn(
address user,
address tokenAddress,
uint128 assets,
uint256 shares
)

Emitted when any amount of collateral is withdrawn

Parameters

NameTypeDescription
useraddressundefined
tokenAddressaddressundefined
assetsuint128undefined
sharesuint256undefined

ABI

PanopticPool ABI
[
{
"inputs": [
{
"internalType": "address",
"name": "_sfpm",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "liquidator",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "liquidatee",
"type": "address"
},
{
"indexed": false,
"internalType": "int256",
"name": "bonusAmounts",
"type": "int256"
}
],
"name": "AccountLiquidated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "uint128",
"name": "assets",
"type": "uint128"
},
{
"indexed": false,
"internalType": "uint256",
"name": "shares",
"type": "uint256"
}
],
"name": "Deposited",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "exercisor",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "costAmounts",
"type": "uint256"
}
],
"name": "ForcedExercised",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"indexed": false,
"internalType": "uint128",
"name": "positionSize",
"type": "uint128"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "int256",
"name": "premia",
"type": "int256"
},
{
"indexed": false,
"internalType": "uint128",
"name": "positionCounter",
"type": "uint128"
}
],
"name": "OptionBurnt",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"indexed": false,
"internalType": "uint128",
"name": "positionSize",
"type": "uint128"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "int256",
"name": "commissionRates",
"type": "int256"
},
{
"indexed": false,
"internalType": "uint128",
"name": "poolUtilizations",
"type": "uint128"
},
{
"indexed": false,
"internalType": "uint256",
"name": "positionCounter",
"type": "uint256"
}
],
"name": "OptionMinted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"indexed": false,
"internalType": "uint128",
"name": "positionSize",
"type": "uint128"
},
{
"indexed": true,
"internalType": "uint256",
"name": "oldTokenId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "uint256",
"name": "newTokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "int256",
"name": "commissionRates",
"type": "int256"
},
{
"indexed": false,
"internalType": "uint128",
"name": "poolUtilizations",
"type": "uint128"
},
{
"indexed": false,
"internalType": "int256",
"name": "premia",
"type": "int256"
}
],
"name": "OptionRolled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "tokenAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "uint128",
"name": "assets",
"type": "uint128"
},
{
"indexed": false,
"internalType": "uint256",
"name": "shares",
"type": "uint256"
}
],
"name": "Withdrawn",
"type": "event"
},
{
"inputs": [],
"name": "DECIMALS",
"outputs": [
{
"internalType": "uint16",
"name": "",
"type": "uint16"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "burnOptions",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "int24",
"name": "tickLimitLow",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickLimitHigh",
"type": "int24"
}
],
"name": "burnOptionsITM",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "positionIdList",
"type": "uint256[]"
}
],
"name": "calculateAccumulatedFeesBatch",
"outputs": [
{
"internalType": "int128",
"name": "premium0",
"type": "int128"
},
{
"internalType": "int128",
"name": "premium1",
"type": "int128"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "int24",
"name": "atTick",
"type": "int24"
},
{
"internalType": "uint256[]",
"name": "positionIdList",
"type": "uint256[]"
}
],
"name": "checkCollateral",
"outputs": [
{
"internalType": "uint128",
"name": "",
"type": "uint128"
},
{
"internalType": "uint128",
"name": "",
"type": "uint128"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "collateralToken0",
"outputs": [
{
"internalType": "contract CollateralTracker",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "collateralToken1",
"outputs": [
{
"internalType": "contract CollateralTracker",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint128",
"name": "assets",
"type": "uint128"
},
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "deposit",
"outputs": [
{
"internalType": "uint256",
"name": "shares",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
},
{
"internalType": "int24",
"name": "tickLimitLow",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickLimitHigh",
"type": "int24"
},
{
"internalType": "uint256[]",
"name": "_positionIdList",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "_touchedId",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "_leftoverIds",
"type": "uint256[]"
}
],
"name": "forceExercise",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_account",
"type": "address"
},
{
"internalType": "int24",
"name": "tickLimitLow",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickLimitHigh",
"type": "int24"
},
{
"internalType": "uint256[]",
"name": "_positionIdList",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "emptyList",
"type": "uint256[]"
}
],
"name": "liquidateAccount",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "positionIdList",
"type": "uint256[]"
},
{
"internalType": "uint128",
"name": "positionSize",
"type": "uint128"
},
{
"internalType": "uint256",
"name": "effectiveLiquidityLimit",
"type": "uint256"
}
],
"name": "mintOptions",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "positionIdList",
"type": "uint256[]"
},
{
"internalType": "uint128",
"name": "positionSize",
"type": "uint128"
},
{
"internalType": "uint256",
"name": "effectiveLiquidityLimit",
"type": "uint256"
},
{
"internalType": "int24",
"name": "tickLimitLow",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickLimitHigh",
"type": "int24"
}
],
"name": "mintOptionsITM",
"outputs": [
{
"internalType": "bool",
"name": "success",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC1155BatchReceived",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC1155Received",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "optionPositionBalance",
"outputs": [
{
"internalType": "uint128",
"name": "balance",
"type": "uint128"
},
{
"internalType": "uint128",
"name": "poolUtilizations",
"type": "uint128"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "positionIdList",
"type": "uint256[]"
}
],
"name": "optionPositionBalanceBatch",
"outputs": [
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "optionPositionCounter",
"outputs": [
{
"internalType": "uint128",
"name": "n",
"type": "uint128"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "poolData",
"outputs": [
{
"internalType": "uint256",
"name": "panopticPoolBalance",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBalance",
"type": "uint256"
},
{
"internalType": "int128",
"name": "inAMM",
"type": "int128"
},
{
"internalType": "int128",
"name": "totalCollected",
"type": "int128"
},
{
"internalType": "int128",
"name": "currentPoolUtilization",
"type": "int128"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "poolId",
"outputs": [
{
"internalType": "uint80",
"name": "",
"type": "uint80"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "oldTokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newTokenId",
"type": "uint256"
},
{
"internalType": "uint256[]",
"name": "emptyList",
"type": "uint256[]"
},
{
"internalType": "uint256",
"name": "effectiveLiquidityLimit",
"type": "uint256"
},
{
"internalType": "int24",
"name": "tickLimitLow",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickLimitHigh",
"type": "int24"
}
],
"name": "rollOptions",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "s_options",
"outputs": [
{
"internalType": "int256",
"name": "",
"type": "int256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "sfpm",
"outputs": [
{
"internalType": "contract ISemiFungiblePositionManager",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_univ3pool",
"type": "address"
},
{
"internalType": "address",
"name": "_collateralReference",
"type": "address"
}
],
"name": "startPool",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tickSpacing",
"outputs": [
{
"internalType": "int24",
"name": "",
"type": "int24"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "token0",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "token1",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "univ3pool",
"outputs": [
{
"internalType": "contract IUniswapV3Pool",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "shares",
"type": "uint256"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "positionIdList",
"type": "uint256[]"
}
],
"name": "withdraw",
"outputs": [
{
"internalType": "uint128",
"name": "assets",
"type": "uint128"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]