Contracts
Last updated
Last updated
Derivio uses EIP-2535 Diamonds for a modular contract architecture.
Manager Diamond
0x240D5645bFFAF6f8Bc3586e459A4155F270BCb3b
Pool Diamond Beacon
0x104ACF59009759296CD7127B52cFC671d7954222
Staking Diamond Beacon
0x878779D32D3FCac4543c5f1EdE6b94b061933c77
DLPM
0xfc00dAC251711508D4dD7b0C310e913575988838
sDLPM
0x142cF97Ac1a40dFEBCCa488607Ea99D0eABDfe8c
WETH
0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91
interface IStakingRewardsToken {
struct StakingRewardsConfigPrimitives {
address assetToken;
address rewardToken;
uint256 rewardPeriod;
}
struct StakingRewardsStatePrimitives {
uint256
Orders are created by the user (TX 1), then executed by keeper bot (TX 2).
To create an order (TX 1), the user needs to transfer tokens to the contract, then immediately call the create order function. WARNING: Transferring the tokens & order creation must be done in the same TX atomically, otherwise the tokens may be taken by someone else.
To do so, use the multi-delegatecall interface included in the manager diamond:
/// @notice Receives and executes a batch of function calls on this contract.
function multicall(
bytes[] calldata data
) external payable returns (bytes[] memory results);
/// @notice Send ERC20 tokens to the contract. Intended to be used with multicall.
function sendERC20(address token, uint256 amount) external payable;
Creating an order requires execution fee in ETH. To get the current minimum execution fee:
function getMinExecutionFee() external view returns (uint256);
See below for specific order types and examples.
struct CreatePoolSwapOrder {
uint256 executionFee;
// ---------- DEPOSIT ----------
address inToken;
// ---------- SWAP: asset->outToken
/// Empty = no swap
address[] swapPoolPath;
/// Intermediate tokens, length must be 1 less than swapPoolPath
address[] swapTokenPath;
/// Min accepted after swap
uint256 minSwapOut;
// ---------- WITHDRAW ----------
address outToken;
address recipient;
}
/// @notice Create a pool swap order. Assumes tokens already transferred.
function createPoolSwapOrder(
CreatePoolSwapOrder memory params
) external payable returns (bytes32);
Note: If inToken is WETH, directly send raw ETH to the contract. If outToken is WETH, it will be unwrapped and sent to recipient as ETH.
Example usage:
const executionFee = ManagerDiamond.read.getMinExecutionFee();
const pool = '0xfc00dAC251711508D4dD7b0C310e913575988838';
// Swap ERC20 example
const inToken = '0x....';
const inTokenAmount = 100n;
const outToken = '0x....';
ManagerDiamond.write.multicall([
[
encodeFunctionData({
functionName: 'sendERC20',
args: [inToken, inTokenAmount],
}),
encodeFunctionData({
functionName: 'createPoolSwapOrder',
args: [{
executionFee,
inToken,
swapPoolPath: [pool],
swapTokenPath: [],
minSwapOut: 0n,
outToken,
recipient: '0x....',
}]
})
]
], { value: executionFee });
// Swap ETH example
const inToken = '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91'; // WETH
const inTokenAmount = 100n;
const outToken = '0x....';
ManagerDiamond.write.multicall([
[
encodeFunctionData({
functionName: 'createPoolSwapOrder',
args: [{
executionFee,
inToken,
swapPoolPath: [pool],
swapTokenPath: [],
minSwapOut: 0n,
outToken,
recipient: '0x....',
}]
})
]
], { value: inTokenAmount + executionFee });
event OrderExecuted(bytes32 indexed key, address indexed owner);
event OrderCancelled(bytes32 indexed key, address indexed owner, bytes reason);
event OrderNotExecuted(bytes32 indexed key, address indexed owner, bytes reason);