@velora-dex/sdk
Version:
197 lines (164 loc) • 6.11 kB
text/typescript
/* eslint-disable @typescript-eslint/no-unused-vars */
import axios from 'axios';
import { ethers, Wallet } from 'ethersV5';
import {
constructPartialSDK,
constructEthersContractCaller,
constructAxiosFetcher,
constructAllDeltaOrdersHandlers,
} from '..';
import { startStatusCheck } from './helpers/delta';
const fetcher = constructAxiosFetcher(axios);
const provider = ethers.getDefaultProvider(1);
const signer = Wallet.createRandom().connect(provider);
const account = signer.address;
const contractCaller = constructEthersContractCaller(
{
ethersProviderOrSigner: provider,
EthersContract: ethers.Contract,
},
account
);
const deltaSDK = constructPartialSDK(
{
chainId: 1,
fetcher,
contractCaller,
},
constructAllDeltaOrdersHandlers
);
const DAI_TOKEN = '0x6b175474e89094c44da98b954eedeac495271d0f';
const USDC_TOKEN = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48';
async function simpleDeltaFlow() {
const amount = '1000000000000'; // wei
const deltaPrice = await deltaSDK.getDeltaPrice({
srcToken: DAI_TOKEN,
destToken: USDC_TOKEN,
amount,
userAddress: account,
srcDecimals: 18,
destDecimals: 6,
// partner: "..." // if available
});
const DeltaContract = await deltaSDK.getDeltaContract();
// or sign a Permit1 or Permit2 TransferFrom for DeltaContract
const tx = await deltaSDK.approveTokenForDelta(amount, DAI_TOKEN);
await tx.wait();
const deltaAuction = await deltaSDK.submitDeltaOrder({
route: deltaPrice.route, // or pick from deltaPrice.alternatives
side: deltaPrice.side,
owner: account,
// beneficiary: anotherAccount, // if need to send destToken to another account
// permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract
slippage: 50, // 50 bps = 0.5% slippage
});
// poll if necessary
startStatusCheck(() => deltaSDK.getDeltaOrderById(deltaAuction.id));
}
async function manualDeltaFlow() {
const amount = '1000000000000'; // wei
const deltaPrice = await deltaSDK.getDeltaPrice({
srcToken: DAI_TOKEN,
destToken: USDC_TOKEN,
amount,
userAddress: account,
srcDecimals: 18,
destDecimals: 6,
// partner: "..." // if available
});
const DeltaContract = await deltaSDK.getDeltaContract();
// or sign a Permit1 or Permit2 TransferFrom for DeltaContract
const tx = await deltaSDK.approveTokenForDelta(amount, DAI_TOKEN);
await tx.wait();
// server-side build (returns EIP-712 typed data + orderHash)
const builtOrder = await deltaSDK.buildDeltaOrder({
route: deltaPrice.route, // or pick from deltaPrice.alternatives
side: deltaPrice.side,
owner: account,
// beneficiary: anotherAccount, // if need to send destToken to another account
// permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract
slippage: 50, // 50 bps = 0.5% slippage
});
// one signer for every v2 order type (Order / ExternalOrder / TWAPOrder / TWAPBuyOrder)
const signature = await deltaSDK.signDeltaOrder(builtOrder);
const deltaAuction = await deltaSDK.postDeltaOrder({
// partner: "..." // if available
order: builtOrder.toSign.value,
signature,
});
// poll if necessary
startStatusCheck(() => deltaSDK.getDeltaOrderById(deltaAuction.id));
}
// External orders forward execution to an integrator-provided handler contract.
// Same build/sign/post shape as standard orders, plus { handler, data }.
// See docs/EXTERNAL_ORDERS.md for handler-specific details (Aave collateral swap, etc.).
async function externalDeltaFlow() {
const amount = ethers.utils.parseUnits('1', 6).toString(); // 1 USDC
const deltaPrice = await deltaSDK.getDeltaPrice({
srcToken: USDC_TOKEN,
destToken: DAI_TOKEN,
amount,
userAddress: account,
srcDecimals: 6,
destDecimals: 18,
});
const HANDLER = '0xb4a2c36668cf8b19fe08f263e3685a5e16e82912'; // handler contract
const HANDLER_DATA =
'0x0000000000000000000000000000000000000000000000000000000000000000'; // handler-specific encoded bytes
const builtOrder = await deltaSDK.buildExternalDeltaOrder({
route: deltaPrice.route,
side: deltaPrice.side,
owner: account,
handler: HANDLER,
data: HANDLER_DATA,
slippage: 50,
});
const signature = await deltaSDK.signDeltaOrder(builtOrder);
const deltaAuction = await deltaSDK.postExternalDeltaOrder({
order: builtOrder.toSign.value,
signature,
});
startStatusCheck(() => deltaSDK.getDeltaOrderById(deltaAuction.id));
}
// TWAP sell splits a total srcAmount into N equal slices executed `interval` seconds apart.
// The price quote is fetched for a single slice; the server multiplies amounts by numSlices.
async function twapSellDeltaFlow() {
const numSlices = 4;
const totalSrcAmount = ethers.utils.parseUnits('100', 18).toString(); // 100 DAI total
const perSliceAmount = (
BigInt(totalSrcAmount) / BigInt(numSlices)
).toString();
// quote a single slice — route amounts must match floor(totalSrcAmount / numSlices)
const deltaPrice = await deltaSDK.getDeltaPrice({
srcToken: DAI_TOKEN,
destToken: USDC_TOKEN,
amount: perSliceAmount,
userAddress: account,
srcDecimals: 18,
destDecimals: 6,
});
const tx = await deltaSDK.approveTokenForDelta(totalSrcAmount, DAI_TOKEN);
await tx.wait();
const deltaAuction = await deltaSDK.submitTWAPDeltaOrder({
onChainOrderType: 'TWAPOrder',
route: deltaPrice.route,
owner: account,
totalSrcAmount,
numSlices,
interval: 300, // 5 minutes between slices (min 60)
slippage: 50,
});
startStatusCheck(() => deltaSDK.getDeltaOrderById(deltaAuction.id));
}
// Paginated list of a user's orders (returns a { data, total, page, limit, hasMore } envelope).
async function listUserOrders() {
const page1 = await deltaSDK.getDeltaOrders({
userAddress: account,
page: 1,
limit: 50,
// status: ['ACTIVE', 'BRIDGING'],
// type: 'MARKET',
});
console.log('orders:', page1.data);
console.log('total:', page1.total, 'hasMore:', page1.hasMore);
}