-
Notifications
You must be signed in to change notification settings - Fork 112
Expand file tree
/
Copy pathdelta.ts
More file actions
196 lines (164 loc) · 5.96 KB
/
Copy pathdelta.ts
File metadata and controls
196 lines (164 loc) · 5.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/* 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);
}