API
A state transition on a Derion pool is done by calling the swap function on the pool contract. The same function can also be statically called to perform input and output estimation.
function swap(
Param memory param,
Payment memory payment
) returns (uint256 amountIn, uint256 amountOut, uint256 price)
struct Param {
uint256 sideIn;
uint256 sideOut;
address helper;
bytes payload;
}
struct Payment {
address utr;
bytes payer;
address recipient;
}Sides
There are 3 sides in a pool:
SIDE_LONG = 0x10
SIDE_SHORT = 0x20
SIDE_LP = 0x30
sideIn and sideOut represent the state transistion types:
opening Long/Short/LP position will have
sideIn= 0closing Long/Short/LP position will have
sideOut= 0
Helper
helper: Helper contract address
payload: data will be passed to
Helper.swapToStatecontract call internally by theswapfunction.amountIn: is the maximum amount of sideIn token that will be spent in the swap transaction
// encode payload
bytes memory payload = abi.encode(sideIn, sideOut, amountIn);
// decode payload
(sideIn, sideOut, amountIn) = abi.decode(payload, (uint256, uint256, uint256));Note: sideIn and sideOut must be passed twice: first in the Param, and another time packed in Helper's payload.
Payment
recipient is the target account that the token output will be transfered to.
See Derivative Tokens for ERC-1155 position token and id specification.
There are 2 methods of payments:
Direct Token Approval
If payer is an empty bytes, the utr param will be ignored, and swap require a direct approval from msg.sender to transfer the sideIn token in. This mode is recommended for inter-contract interaction only.
ERC-6120
If payer is the 20 bytes address of the paying account, the swap call is expected to be invoked over an ERC-6120's execution by that payer account.
The utr is the address of the ERC-6120 contract that invoke this call.
utr.exec([
// amountOutMin can be configured here
], [{
inputs: [{
mode: PAYMENT,
eip: 20,
token: tokenIn,
id: 0,
amountIn: amountInMax,
recipient: pool.address,
}],
code: pool.address,
data: (await pool.populateTransaction.swap({
sideIn: 0,
sideOut: SIDE_LONG, // open Long
helper: helper.address,
payload: abiCoder.encode(
["uint", "uint", "uint"],
[0, SIDE_LONG, amountIn],
),
}, {
utr: utr.address,
payer: signer.address,
recipient: recipient,
})).data,
}])Last updated
Was this helpful?