hodl-wallet 2.0.4 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -2
- package/dist/agent-cli.js +75 -0
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-errors.d.ts +1 -1
- package/dist/agent-errors.js.map +1 -1
- package/dist/index.js +148 -82
- package/dist/index.js.map +1 -1
- package/dist/network/arb.d.ts +1 -0
- package/dist/network/arb.js +2 -1
- package/dist/network/arb.js.map +1 -1
- package/dist/network/avax.d.ts +1 -0
- package/dist/network/avax.js +2 -1
- package/dist/network/avax.js.map +1 -1
- package/dist/network/bsc.d.ts +1 -0
- package/dist/network/bsc.js +2 -1
- package/dist/network/bsc.js.map +1 -1
- package/dist/network/eth.d.ts +1 -0
- package/dist/network/eth.js +2 -1
- package/dist/network/eth.js.map +1 -1
- package/dist/network/ftm.d.ts +1 -0
- package/dist/network/ftm.js +2 -1
- package/dist/network/ftm.js.map +1 -1
- package/dist/network/hyperliquid.d.ts +1 -0
- package/dist/network/hyperliquid.js +2 -1
- package/dist/network/hyperliquid.js.map +1 -1
- package/dist/network/lib/BitcoinNetwork.d.ts +2 -0
- package/dist/network/lib/BitcoinNetwork.js +23 -15
- package/dist/network/lib/BitcoinNetwork.js.map +1 -1
- package/dist/network/lib/Web3Network.js +14 -2
- package/dist/network/lib/Web3Network.js.map +1 -1
- package/dist/network/op.d.ts +1 -0
- package/dist/network/op.js +2 -1
- package/dist/network/op.js.map +1 -1
- package/dist/network/pol.d.ts +1 -0
- package/dist/network/pol.js +2 -1
- package/dist/network/pol.js.map +1 -1
- package/dist/network/types.d.ts +1 -0
- package/dist/network-registry.d.ts +1 -0
- package/dist/network-registry.js +3 -0
- package/dist/network-registry.js.map +1 -1
- package/dist/persist.d.ts +2 -0
- package/dist/persist.js +21 -0
- package/dist/persist.js.map +1 -1
- package/dist/profile-lock.d.ts +4 -0
- package/dist/profile-lock.js +9 -1
- package/dist/profile-lock.js.map +1 -1
- package/dist/swap/bitcoin.d.ts +34 -0
- package/dist/swap/bitcoin.js +179 -0
- package/dist/swap/bitcoin.js.map +1 -0
- package/dist/swap/chain.d.ts +49 -0
- package/dist/swap/chain.js +255 -0
- package/dist/swap/chain.js.map +1 -0
- package/dist/swap/config.d.ts +68 -0
- package/dist/swap/config.js +46 -0
- package/dist/swap/config.js.map +1 -0
- package/dist/swap/http.d.ts +14 -0
- package/dist/swap/http.js +70 -0
- package/dist/swap/http.js.map +1 -0
- package/dist/swap/providers.d.ts +24 -0
- package/dist/swap/providers.js +424 -0
- package/dist/swap/providers.js.map +1 -0
- package/dist/swap/routes.d.ts +145 -0
- package/dist/swap/routes.js +48 -0
- package/dist/swap/routes.js.map +1 -0
- package/dist/swap/service.d.ts +104 -0
- package/dist/swap/service.js +512 -0
- package/dist/swap/service.js.map +1 -0
- package/dist/swap/storage.d.ts +3 -0
- package/dist/swap/storage.js +28 -0
- package/dist/swap/storage.js.map +1 -0
- package/dist/swap/types.d.ts +140 -0
- package/dist/swap/types.js +2 -0
- package/dist/swap/types.js.map +1 -0
- package/dist/swap/ui.d.ts +3 -0
- package/dist/swap/ui.js +257 -0
- package/dist/swap/ui.js.map +1 -0
- package/dist/transfer-service.d.ts +38 -0
- package/dist/transfer-service.js +181 -0
- package/dist/transfer-service.js.map +1 -0
- package/dist/wallet-service.d.ts +22 -6
- package/dist/wallet-service.js +36 -171
- package/dist/wallet-service.js.map +1 -1
- package/package.json +99 -92
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import { AgentError } from '../agent-errors.js';
|
|
3
|
+
import { formatUnits, normalizeDecimal, parseDecimalToUnits } from '../amounts.js';
|
|
4
|
+
import Persist from '../persist.js';
|
|
5
|
+
import { BitcoinSwapChain } from './bitcoin.js';
|
|
6
|
+
import { assetAddress, sameAssetAddress, swapRoute } from './routes.js';
|
|
7
|
+
import { readSwapOperation, readSwapQuote } from './storage.js';
|
|
8
|
+
import { BscSwapChain } from './chain.js';
|
|
9
|
+
import { swapConfig as config } from './config.js';
|
|
10
|
+
import { ceilDiv, integer, record, swapJson } from './http.js';
|
|
11
|
+
import { createSwapProviders } from './providers.js';
|
|
12
|
+
import { terminalSwapStates } from './types.js';
|
|
13
|
+
async function loadPrices() {
|
|
14
|
+
const response = record(await swapJson(config.pricesUrl));
|
|
15
|
+
const prices = {};
|
|
16
|
+
let updatedAt = Date.now();
|
|
17
|
+
for (const [id, key] of [['bitcoin', 'btc'], ['binancecoin', 'bnb'], ['tether', 'usdt']]) {
|
|
18
|
+
const entry = record(response[id]);
|
|
19
|
+
if (typeof entry.usd !== 'number' || !Number.isFinite(entry.usd) || entry.usd <= 0)
|
|
20
|
+
throw new Error('Invalid reference price.');
|
|
21
|
+
prices[key] = parseDecimalToUnits(entry.usd.toFixed(8), 8).toString();
|
|
22
|
+
const at = integer(entry.last_updated_at) * 1_000;
|
|
23
|
+
if (Date.now() - at > config.referenceMaxAgeMs || at - Date.now() > config.clockSkewMs)
|
|
24
|
+
throw new Error('Reference prices are stale.');
|
|
25
|
+
updatedAt = Math.min(updatedAt, at);
|
|
26
|
+
}
|
|
27
|
+
return { btc: prices.btc, bnb: prices.bnb, usdt: prices.usdt, updatedAt };
|
|
28
|
+
}
|
|
29
|
+
export async function assertNoActiveSwap(db) {
|
|
30
|
+
const operations = await db.entries('swapOperation') || [];
|
|
31
|
+
try {
|
|
32
|
+
const active = operations.find(([, operation]) => !terminalSwapStates.includes(operation.state));
|
|
33
|
+
if (active)
|
|
34
|
+
throw new AgentError('SWAP_IN_PROGRESS', 'Finish or inspect the existing swap before another transfer.', 3, { requestId: active[0] });
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
operations.forEach(([, operation]) => Persist.clearSensitiveData(operation));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class SwapService {
|
|
41
|
+
db;
|
|
42
|
+
options;
|
|
43
|
+
route;
|
|
44
|
+
prices;
|
|
45
|
+
constructor(db, options = {}) {
|
|
46
|
+
this.db = db;
|
|
47
|
+
this.options = options;
|
|
48
|
+
this.route = swapRoute(options.routeId || 'bsc-btc');
|
|
49
|
+
this.prices = options.prices || loadPrices;
|
|
50
|
+
}
|
|
51
|
+
chain(routeId) {
|
|
52
|
+
if (this.options.chain && routeId === this.route.id)
|
|
53
|
+
return this.options.chain;
|
|
54
|
+
return routeId === 'bsc-btc' ? new BscSwapChain() : new BitcoinSwapChain();
|
|
55
|
+
}
|
|
56
|
+
providers(routeId) {
|
|
57
|
+
return this.options.providers || createSwapProviders(swapRoute(routeId));
|
|
58
|
+
}
|
|
59
|
+
async destination() {
|
|
60
|
+
const account = await this.db.get('account', this.route.destination.network.NetworkClass.name);
|
|
61
|
+
try {
|
|
62
|
+
return account?.address || null;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
Persist.clearSensitiveData(account);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async availableBalance() {
|
|
69
|
+
const account = await this.source(this.route);
|
|
70
|
+
const address = account.address;
|
|
71
|
+
Persist.clearSensitiveData(account);
|
|
72
|
+
return this.chain(this.route.id).availableBalance(address);
|
|
73
|
+
}
|
|
74
|
+
async quote(amount, destination) {
|
|
75
|
+
const account = await this.source(this.route);
|
|
76
|
+
const from = account.address;
|
|
77
|
+
Persist.clearSensitiveData(account);
|
|
78
|
+
const to = destination || await this.destination();
|
|
79
|
+
if (!to)
|
|
80
|
+
throw new AgentError('ACCOUNT_NOT_FOUND', `No ${this.route.destination.label} account configured; provide a ${this.route.destination.network.id === 'btc' ? 'Bitcoin' : 'BSC'} destination address.`, 3);
|
|
81
|
+
try {
|
|
82
|
+
assetAddress(this.route.destination, to);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
throw new AgentError('INVALID_ARGUMENT', `Invalid ${this.route.destination.network.id === 'btc' ? 'Bitcoin mainnet' : 'BSC'} destination.`, 2);
|
|
86
|
+
}
|
|
87
|
+
let normalized;
|
|
88
|
+
let baseUnits;
|
|
89
|
+
try {
|
|
90
|
+
normalized = normalizeDecimal(amount);
|
|
91
|
+
baseUnits = parseDecimalToUnits(normalized, this.route.source.decimals);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
throw new AgentError('INVALID_ARGUMENT', error.message, 2);
|
|
95
|
+
}
|
|
96
|
+
const input = { routeId: this.route.id, from, to, amount: normalized, amountBaseUnits: baseUnits.toString() };
|
|
97
|
+
const reference = await this.prices();
|
|
98
|
+
const chain = this.chain(this.route.id);
|
|
99
|
+
const providers = this.providers(this.route.id);
|
|
100
|
+
const results = await Promise.allSettled(providers.map(provider => provider.quote(input)));
|
|
101
|
+
const quotes = [];
|
|
102
|
+
const unavailable = [];
|
|
103
|
+
for (let i = 0; i < results.length; i++) {
|
|
104
|
+
const result = results[i];
|
|
105
|
+
if (result.status === 'rejected') {
|
|
106
|
+
unavailable.push({ provider: providers[i].id, reason: safeMessage(result.reason) });
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const offer = result.value;
|
|
111
|
+
const funding = await chain.estimate(input, offer);
|
|
112
|
+
const { source, destination } = this.route;
|
|
113
|
+
const fee = BigInt(funding.budgetBaseUnits);
|
|
114
|
+
const feeUsd = ceilDiv(fee * BigInt(reference[funding.price]), 10n ** BigInt(funding.decimals));
|
|
115
|
+
const feeOutput = ceilDiv(feeUsd * 10n ** BigInt(destination.decimals), BigInt(reference[destination.price]));
|
|
116
|
+
const inputUsd = baseUnits * BigInt(reference[source.price]) / 10n ** BigInt(source.decimals);
|
|
117
|
+
const outputUsd = BigInt(offer.expectedBaseUnits) * BigInt(reference[destination.price]) / 10n ** BigInt(destination.decimals);
|
|
118
|
+
if (inputUsd === 0n)
|
|
119
|
+
throw new Error('Swap amount is below reference-price precision.');
|
|
120
|
+
const cost = inputUsd + feeUsd - outputUsd;
|
|
121
|
+
const quote = {
|
|
122
|
+
...input, ...offer, id: crypto.randomUUID(), createdAt: Date.now(), funding,
|
|
123
|
+
netOutputBaseUnits: (BigInt(offer.expectedBaseUnits) - feeOutput).toString(),
|
|
124
|
+
costBps: Number(cost * 10000n / inputUsd), costUsd: formatUnits(cost, 8), reference
|
|
125
|
+
};
|
|
126
|
+
await this.db.set('swapQuote', quote.id, quote);
|
|
127
|
+
quotes.push(quote);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
unavailable.push({ provider: providers[i].id, reason: safeMessage(error) });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
quotes.sort((a, b) => BigInt(a.netOutputBaseUnits) > BigInt(b.netOutputBaseUnits) ? -1 : 1);
|
|
134
|
+
await this.db.flush();
|
|
135
|
+
return {
|
|
136
|
+
quotes: await Promise.all(quotes.map(async (quote) => {
|
|
137
|
+
const balance = await chain.balance(input, quote.funding);
|
|
138
|
+
return { ...this.quoteView(quote), ...balance,
|
|
139
|
+
...(this.route.id === 'bsc-btc' ? { sufficientUsdt: balance.sufficientAsset, sufficientBnb: balance.sufficientFee } : {}) };
|
|
140
|
+
})),
|
|
141
|
+
unavailable,
|
|
142
|
+
recommendedQuoteId: quotes[0]?.id || null
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async execute(quoteId, requestId) {
|
|
146
|
+
validateId(requestId);
|
|
147
|
+
validateId(quoteId);
|
|
148
|
+
const previous = await this.db.get('swapOperation', requestId);
|
|
149
|
+
if (previous) {
|
|
150
|
+
const previousQuoteId = previous.quote.id;
|
|
151
|
+
Persist.clearSensitiveData(previous);
|
|
152
|
+
if (previousQuoteId !== quoteId)
|
|
153
|
+
throw new AgentError('IDEMPOTENCY_CONFLICT', 'Request ID is bound to another swap quote.', 3);
|
|
154
|
+
return this.resume(requestId);
|
|
155
|
+
}
|
|
156
|
+
await assertNoActiveSwap(this.db);
|
|
157
|
+
const storedQuote = await this.db.get('swapQuote', quoteId);
|
|
158
|
+
if (!storedQuote)
|
|
159
|
+
throw new AgentError('INVALID_ARGUMENT', 'Swap quote not found.', 2);
|
|
160
|
+
const quote = readSwapQuote(storedQuote);
|
|
161
|
+
const route = swapRoute(quote.routeId);
|
|
162
|
+
const chain = this.chain(route.id);
|
|
163
|
+
this.assertFresh(quote);
|
|
164
|
+
const operations = await this.db.entries('swapOperation') || [];
|
|
165
|
+
const used = operations.some(([, operation]) => operation.quote.id === quoteId);
|
|
166
|
+
operations.forEach(([, operation]) => Persist.clearSensitiveData(operation));
|
|
167
|
+
if (used) {
|
|
168
|
+
throw new AgentError('IDEMPOTENCY_CONFLICT', 'This quote was already used. Resume its existing request ID.', 3);
|
|
169
|
+
}
|
|
170
|
+
await this.assertNoPendingSend(route);
|
|
171
|
+
const account = await this.source(route);
|
|
172
|
+
try {
|
|
173
|
+
if (!sameAssetAddress(route.source, account.address, quote.from))
|
|
174
|
+
throw new Error('Source wallet changed since quotation.');
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
Persist.clearSensitiveData(account);
|
|
178
|
+
}
|
|
179
|
+
await chain.checkFunding(quote, []);
|
|
180
|
+
await chain.assertAvailable(quote.from);
|
|
181
|
+
const now = Date.now();
|
|
182
|
+
const operation = {
|
|
183
|
+
id: requestId, quote, state: 'preparing', createdAt: now, updatedAt: now,
|
|
184
|
+
steps: [], history: [{ state: 'preparing', at: now }]
|
|
185
|
+
};
|
|
186
|
+
await this.save(operation);
|
|
187
|
+
return this.resume(requestId);
|
|
188
|
+
}
|
|
189
|
+
async resume(requestId) {
|
|
190
|
+
const operation = await this.get(requestId);
|
|
191
|
+
const route = swapRoute(operation.quote.routeId);
|
|
192
|
+
const chain = this.chain(route.id);
|
|
193
|
+
try {
|
|
194
|
+
if (terminalSwapStates.includes(operation.state))
|
|
195
|
+
return this.view(operation);
|
|
196
|
+
await this.refresh(operation);
|
|
197
|
+
if (terminalSwapStates.includes(operation.state))
|
|
198
|
+
return this.view(operation);
|
|
199
|
+
const deposit = operation.steps.find(step => step.kind === 'deposit');
|
|
200
|
+
if (deposit?.confirmed)
|
|
201
|
+
return this.view(operation);
|
|
202
|
+
const provider = this.provider(operation.quote.provider, operation.quote.routeId);
|
|
203
|
+
const pending = operation.steps.find(step => !step.confirmed);
|
|
204
|
+
if (pending?.broadcastAttempted) {
|
|
205
|
+
const receipt = await chain.receipt(pending.hash);
|
|
206
|
+
if (receipt.state !== 'not_found')
|
|
207
|
+
return this.view(operation);
|
|
208
|
+
this.assertFresh(operation.quote);
|
|
209
|
+
if (pending.kind === 'deposit') {
|
|
210
|
+
await provider.validate(operation.quote, operation.plan);
|
|
211
|
+
await this.checkChannelBlock(operation);
|
|
212
|
+
}
|
|
213
|
+
await this.broadcast(operation, pending);
|
|
214
|
+
return this.view(operation);
|
|
215
|
+
}
|
|
216
|
+
this.assertFresh(operation.quote);
|
|
217
|
+
if (!operation.plan) {
|
|
218
|
+
if (operation.openingChannel) {
|
|
219
|
+
this.transition(operation, 'failed', 'Deposit channel creation was interrupted. No deposit was sent; obtain a new quote.');
|
|
220
|
+
await this.save(operation);
|
|
221
|
+
return this.view(operation);
|
|
222
|
+
}
|
|
223
|
+
operation.openingChannel = true;
|
|
224
|
+
await this.save(operation);
|
|
225
|
+
operation.plan = await provider.prepare(operation.quote);
|
|
226
|
+
operation.openingChannel = false;
|
|
227
|
+
await this.save(operation);
|
|
228
|
+
}
|
|
229
|
+
await provider.validate(operation.quote, operation.plan);
|
|
230
|
+
await this.checkChannelBlock(operation);
|
|
231
|
+
await chain.checkFunding(operation.quote, operation.steps);
|
|
232
|
+
if (pending) {
|
|
233
|
+
await this.broadcast(operation, pending);
|
|
234
|
+
return this.view(operation);
|
|
235
|
+
}
|
|
236
|
+
const kind = await chain.nextStep(operation.quote, operation.plan, operation.steps);
|
|
237
|
+
if (operation.steps.some(step => step.kind === kind))
|
|
238
|
+
throw new Error('Unexpected repeated funding step; inspect the source account.');
|
|
239
|
+
const account = await this.source(route);
|
|
240
|
+
let step;
|
|
241
|
+
try {
|
|
242
|
+
step = await chain.sign(operation.quote, operation.plan, kind, account);
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
Persist.clearSensitiveData(account);
|
|
246
|
+
}
|
|
247
|
+
operation.steps.push(step);
|
|
248
|
+
await this.save(operation);
|
|
249
|
+
await this.broadcast(operation, step);
|
|
250
|
+
return this.view(operation);
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
operation.updateError = safeMessage(error);
|
|
254
|
+
if (!operation.steps.some(step => step.kind === 'deposit' && step.broadcastAttempted)) {
|
|
255
|
+
this.transition(operation, 'failed', 'No deposit was sent. Obtain a new quote; any paid network fees are not refundable.');
|
|
256
|
+
}
|
|
257
|
+
await this.save(operation);
|
|
258
|
+
return this.view(operation);
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
Persist.clearSensitiveData(operation);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async status(requestId) {
|
|
265
|
+
const operation = await this.get(requestId);
|
|
266
|
+
try {
|
|
267
|
+
if (operation.state !== 'failed')
|
|
268
|
+
await this.refresh(operation);
|
|
269
|
+
return this.view(operation);
|
|
270
|
+
}
|
|
271
|
+
finally {
|
|
272
|
+
Persist.clearSensitiveData(operation);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
async list() {
|
|
276
|
+
const entries = await this.db.entries('swapOperation') || [];
|
|
277
|
+
try {
|
|
278
|
+
return entries.map(([, operation]) => this.view(readSwapOperation(operation))).sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
279
|
+
}
|
|
280
|
+
finally {
|
|
281
|
+
entries.forEach(([, operation]) => Persist.clearSensitiveData(operation));
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async refresh(operation) {
|
|
285
|
+
const route = swapRoute(operation.quote.routeId);
|
|
286
|
+
const chain = this.chain(route.id);
|
|
287
|
+
try {
|
|
288
|
+
delete operation.updateError;
|
|
289
|
+
const trackEarly = operation.quote.provider === 'thorchain' && operation.quote.details.streaming === true;
|
|
290
|
+
const pending = operation.steps.find(step => !step.confirmed);
|
|
291
|
+
if (pending) {
|
|
292
|
+
const receipt = await chain.receipt(pending.hash);
|
|
293
|
+
if (receipt.state === 'reverted') {
|
|
294
|
+
this.transition(operation, 'failed', 'The funding transaction reverted. The deposit was not transferred; paid fees are not refundable.');
|
|
295
|
+
await this.save(operation);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (receipt.state !== 'confirmed' && (pending.kind !== 'deposit' || !trackEarly)) {
|
|
299
|
+
operation.lastCheckedAt = Date.now();
|
|
300
|
+
await this.save(operation);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (receipt.state === 'confirmed') {
|
|
304
|
+
pending.confirmed = true;
|
|
305
|
+
this.transition(operation, pending.kind === 'deposit' ? 'deposit_confirmed' : 'preparing');
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const deposit = operation.steps.find(step => step.kind === 'deposit' && (step.confirmed || (step.broadcastAttempted && trackEarly)));
|
|
309
|
+
if (deposit) {
|
|
310
|
+
const progress = await this.provider(operation.quote.provider, operation.quote.routeId).status(operation);
|
|
311
|
+
if (progress.payoutHash) {
|
|
312
|
+
operation.payoutHash = progress.payoutHash;
|
|
313
|
+
operation.payoutBaseUnits = progress.payoutBaseUnits;
|
|
314
|
+
}
|
|
315
|
+
if (progress.refundHash) {
|
|
316
|
+
operation.refundHash = progress.refundHash;
|
|
317
|
+
operation.refundBaseUnits = progress.refundBaseUnits;
|
|
318
|
+
}
|
|
319
|
+
if (!operation.payoutHash && !operation.refundHash)
|
|
320
|
+
this.transition(operation, progress.state, progress.message);
|
|
321
|
+
if (operation.quote.provider === 'thorchain' && operation.quote.details.streaming === true) {
|
|
322
|
+
await this.verifyStreamingResult(operation, deposit.confirmed ? progress : { ...progress, settlementComplete: false });
|
|
323
|
+
}
|
|
324
|
+
else if (operation.payoutHash && operation.refundHash) {
|
|
325
|
+
this.transition(operation, 'needs_attention', 'Unexpected partial result: payout and refund both exist. Inspect both transactions.');
|
|
326
|
+
}
|
|
327
|
+
else if (operation.payoutHash) {
|
|
328
|
+
const payment = await chain.payoutPayment(operation.payoutHash, operation.quote.to);
|
|
329
|
+
operation.confirmations = payment.confirmations;
|
|
330
|
+
if (payment.amount === 0n && payment.confirmations === 0) {
|
|
331
|
+
this.transition(operation, route.destination.pendingState);
|
|
332
|
+
}
|
|
333
|
+
else if (!operation.payoutBaseUnits || payment.amount !== BigInt(operation.payoutBaseUnits) || payment.amount < BigInt(operation.quote.minimumBaseUnits)) {
|
|
334
|
+
this.transition(operation, 'needs_attention', 'Destination payout amount or destination does not match the accepted swap.');
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
this.transition(operation, payment.confirmations >= route.destination.confirmations ? 'completed' : payment.confirmations ? route.destination.confirmingState : route.destination.pendingState);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else if (operation.refundHash) {
|
|
341
|
+
const refund = await chain.refundPayment(operation.refundHash, operation.quote.from);
|
|
342
|
+
operation.refundConfirmations = refund.confirmations;
|
|
343
|
+
if (refund.confirmations >= route.source.confirmations &&
|
|
344
|
+
(!operation.refundBaseUnits || refund.amount !== BigInt(operation.refundBaseUnits) || refund.amount <= 0n || refund.amount > BigInt(operation.quote.amountBaseUnits))) {
|
|
345
|
+
this.transition(operation, 'needs_attention', 'Source refund amount or destination does not match the provider result.');
|
|
346
|
+
}
|
|
347
|
+
else if (refund.amount > 0n && refund.confirmations >= route.source.confirmations) {
|
|
348
|
+
this.transition(operation, 'refunded', `${route.source.label} refund verified. Network and provider fees may have been deducted.`);
|
|
349
|
+
}
|
|
350
|
+
else
|
|
351
|
+
this.transition(operation, 'refund_pending');
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
operation.lastCheckedAt = Date.now();
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
operation.updateError = safeMessage(error);
|
|
358
|
+
}
|
|
359
|
+
await this.save(operation);
|
|
360
|
+
}
|
|
361
|
+
async verifyStreamingResult(operation, progress) {
|
|
362
|
+
const route = swapRoute(operation.quote.routeId);
|
|
363
|
+
const chain = this.chain(route.id);
|
|
364
|
+
const partial = !!operation.payoutHash && !!operation.refundHash;
|
|
365
|
+
let payoutConfirmed = false;
|
|
366
|
+
let refundConfirmed = false;
|
|
367
|
+
if (operation.payoutHash) {
|
|
368
|
+
const payment = await chain.payoutPayment(operation.payoutHash, operation.quote.to);
|
|
369
|
+
operation.confirmations = payment.confirmations;
|
|
370
|
+
if ((payment.amount > 0n || payment.confirmations >= route.destination.confirmations) &&
|
|
371
|
+
(!operation.payoutBaseUnits || payment.amount !== BigInt(operation.payoutBaseUnits) || payment.amount <= 0n)) {
|
|
372
|
+
this.transition(operation, 'needs_attention', 'Destination payout amount or destination does not match the provider result.');
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
payoutConfirmed = payment.confirmations >= route.destination.confirmations;
|
|
376
|
+
}
|
|
377
|
+
if (operation.refundHash) {
|
|
378
|
+
const refund = await chain.refundPayment(operation.refundHash, operation.quote.from);
|
|
379
|
+
operation.refundConfirmations = refund.confirmations;
|
|
380
|
+
refundConfirmed = refund.confirmations >= route.source.confirmations;
|
|
381
|
+
if (refundConfirmed && (!operation.refundBaseUnits || refund.amount !== BigInt(operation.refundBaseUnits) ||
|
|
382
|
+
refund.amount <= 0n || refund.amount > BigInt(operation.quote.amountBaseUnits) ||
|
|
383
|
+
(partial && refund.amount === BigInt(operation.quote.amountBaseUnits)))) {
|
|
384
|
+
this.transition(operation, 'needs_attention', 'Source refund amount or destination does not match the provider result.');
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (progress.settlementComplete !== true) {
|
|
389
|
+
this.transition(operation, partial ? 'partial_pending' : progress.state, progress.message || 'Waiting for THORChain to finish the stream and report all payouts.');
|
|
390
|
+
}
|
|
391
|
+
else if (partial) {
|
|
392
|
+
this.transition(operation, payoutConfirmed && refundConfirmed ? 'partial_completed' : 'partial_pending', [progress.message, `Partial swap: ${route.destination.label} for the exchanged portion and ${route.source.label} returned for the remainder, minus applicable fees.`].filter(Boolean).join(' '));
|
|
393
|
+
}
|
|
394
|
+
else if (operation.payoutHash) {
|
|
395
|
+
if (BigInt(operation.payoutBaseUnits) < BigInt(operation.quote.minimumBaseUnits)) {
|
|
396
|
+
this.transition(operation, 'needs_attention', 'Destination payout is below the accepted minimum without a source refund.');
|
|
397
|
+
}
|
|
398
|
+
else
|
|
399
|
+
this.transition(operation, payoutConfirmed ? 'completed' : operation.confirmations ? route.destination.confirmingState : route.destination.pendingState);
|
|
400
|
+
}
|
|
401
|
+
else if (operation.refundHash) {
|
|
402
|
+
this.transition(operation, refundConfirmed ? 'refunded' : 'refund_pending', [progress.message, `${route.source.label} returned, minus applicable fees.`].filter(Boolean).join(' '));
|
|
403
|
+
}
|
|
404
|
+
else
|
|
405
|
+
this.transition(operation, 'needs_attention', 'THORChain finished without a verifiable payout or refund.');
|
|
406
|
+
}
|
|
407
|
+
async broadcast(operation, step) {
|
|
408
|
+
this.assertFresh(operation.quote);
|
|
409
|
+
await this.provider(operation.quote.provider, operation.quote.routeId).validate(operation.quote, operation.plan);
|
|
410
|
+
await this.checkChannelBlock(operation);
|
|
411
|
+
step.broadcastAttempted = true;
|
|
412
|
+
this.transition(operation, step.kind === 'deposit' ? 'deposit_pending' : 'approval_pending');
|
|
413
|
+
await this.save(operation);
|
|
414
|
+
try {
|
|
415
|
+
await this.chain(operation.quote.routeId).broadcast(step);
|
|
416
|
+
delete operation.updateError;
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
operation.updateError = 'Broadcast result is uncertain. Track the stored transaction; do not create another swap.';
|
|
420
|
+
}
|
|
421
|
+
await this.save(operation);
|
|
422
|
+
}
|
|
423
|
+
async checkChannelBlock(operation) {
|
|
424
|
+
if (operation.plan?.channelExpiryBlock && await this.chain(operation.quote.routeId).blockNumber() >= BigInt(operation.plan.channelExpiryBlock)) {
|
|
425
|
+
throw new Error('Chainflip deposit channel expired; do not send the deposit.');
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
assertFresh(quote) {
|
|
429
|
+
if (quote.expiresAt <= Date.now() + config.fundingMarginMs)
|
|
430
|
+
throw new AgentError('SWAP_QUOTE_EXPIRED', 'Quote expired. Obtain and confirm a new quote.', 3);
|
|
431
|
+
}
|
|
432
|
+
async assertNoPendingSend(route) {
|
|
433
|
+
const sends = await this.db.entries('sendRequest') || [];
|
|
434
|
+
if (sends.some(([, send]) => send.network === route.source.network.id && !['confirmed', 'failed'].includes(send.state))) {
|
|
435
|
+
throw new AgentError('BROADCAST_UNKNOWN', `Resolve the existing ${route.source.network.id.toUpperCase()} transfer before starting a swap.`, 3);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
async source(route) {
|
|
439
|
+
const account = await this.db.get('account', route.source.network.NetworkClass.name);
|
|
440
|
+
if (!account)
|
|
441
|
+
throw new AgentError('ACCOUNT_NOT_FOUND', `Wallet has no ${route.source.label} account for the deposit.`, 3);
|
|
442
|
+
return account;
|
|
443
|
+
}
|
|
444
|
+
provider(id, routeId) {
|
|
445
|
+
const provider = this.providers(routeId).find(item => item.id === id);
|
|
446
|
+
if (!provider)
|
|
447
|
+
throw new Error('Swap provider is not configured.');
|
|
448
|
+
return provider;
|
|
449
|
+
}
|
|
450
|
+
async get(requestId) {
|
|
451
|
+
validateId(requestId);
|
|
452
|
+
const operation = await this.db.get('swapOperation', requestId);
|
|
453
|
+
if (!operation)
|
|
454
|
+
throw new AgentError('INVALID_ARGUMENT', 'Swap not found.', 2);
|
|
455
|
+
return readSwapOperation(operation);
|
|
456
|
+
}
|
|
457
|
+
transition(operation, state, message) {
|
|
458
|
+
if (operation.state !== state)
|
|
459
|
+
operation.history.push({ state, at: Date.now() });
|
|
460
|
+
operation.state = state;
|
|
461
|
+
operation.message = message;
|
|
462
|
+
}
|
|
463
|
+
async save(operation) {
|
|
464
|
+
operation.updatedAt = Date.now();
|
|
465
|
+
await this.db.set('swapOperation', operation.id, operation);
|
|
466
|
+
await this.db.flush();
|
|
467
|
+
}
|
|
468
|
+
quoteView(quote) {
|
|
469
|
+
const route = swapRoute(quote.routeId);
|
|
470
|
+
const funding = quote.funding;
|
|
471
|
+
return {
|
|
472
|
+
quoteId: quote.id, routeId: route.id, provider: quote.provider, from: quote.from, to: quote.to,
|
|
473
|
+
source: { network: route.source.network.id, asset: route.source.asset, amount: quote.amount },
|
|
474
|
+
destination: { network: route.destination.network.id, asset: route.destination.asset, estimated: formatUnits(quote.expectedBaseUnits, route.destination.decimals), minimum: formatUnits(quote.minimumBaseUnits, route.destination.decimals), confirmations: route.destination.confirmations },
|
|
475
|
+
funding: { asset: funding.asset, budget: formatUnits(funding.budgetBaseUnits, funding.decimals), rate: funding.rate, rateUnit: funding.asset === 'BNB' ? 'wei/gas' : 'sat/vB' },
|
|
476
|
+
...(route.id === 'bsc-btc' ? { gas: { asset: 'BNB', budget: formatUnits(funding.budgetBaseUnits, funding.decimals), gasPriceWei: funding.rate, maximumGasUnits: funding.units }, netAfterGasBtcEquivalent: formatUnits(quote.netOutputBaseUnits, 8) } : {}),
|
|
477
|
+
includedFees: quote.fees.map(fee => ({ label: fee.label, asset: fee.asset, amount: formatUnits(fee.amountBaseUnits, fee.decimals) })),
|
|
478
|
+
estimatedTotalCost: { usd: quote.costUsd, percent: formatUnits(BigInt(quote.costBps), 2), referenceUpdatedAt: new Date(quote.reference.updatedAt).toISOString() },
|
|
479
|
+
netOutputEquivalent: formatUnits(quote.netOutputBaseUnits, route.destination.decimals),
|
|
480
|
+
slippagePercent: config.slippageBps / 100,
|
|
481
|
+
estimatedSeconds: quote.estimatedSeconds,
|
|
482
|
+
execution: quote.details.streaming === true ? 'streaming' : 'single',
|
|
483
|
+
expiresAt: new Date(quote.expiresAt).toISOString(),
|
|
484
|
+
refund: { asset: route.source.asset, network: route.source.network.id, address: quote.from, feesMayBeDeducted: true, partialResultPossible: quote.details.streaming === true }
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
view(operation) {
|
|
488
|
+
const route = swapRoute(operation.quote.routeId);
|
|
489
|
+
return {
|
|
490
|
+
requestId: operation.id, state: operation.state, quote: this.quoteView(operation.quote),
|
|
491
|
+
createdAt: new Date(operation.createdAt).toISOString(), updatedAt: new Date(operation.updatedAt).toISOString(),
|
|
492
|
+
lastCheckedAt: operation.lastCheckedAt ? new Date(operation.lastCheckedAt).toISOString() : null,
|
|
493
|
+
message: operation.message || null, updateError: operation.updateError || null,
|
|
494
|
+
delayed: !terminalSwapStates.includes(operation.state) && Date.now() - operation.createdAt > config.attentionAfterMs,
|
|
495
|
+
confirmations: operation.confirmations || 0, requiredConfirmations: route.destination.confirmations,
|
|
496
|
+
refundConfirmations: operation.refundConfirmations || 0, requiredRefundConfirmations: route.source.confirmations,
|
|
497
|
+
providerId: operation.plan?.providerId || null,
|
|
498
|
+
transactions: operation.steps.map(step => ({ kind: step.kind, hash: step.hash, confirmed: step.confirmed, explorer: `${route.source.network.explorer}${step.hash}` })),
|
|
499
|
+
payout: operation.payoutHash ? { hash: operation.payoutHash, amount: operation.payoutBaseUnits ? formatUnits(operation.payoutBaseUnits, route.destination.decimals) : null, explorer: `${route.destination.network.explorer}${operation.payoutHash}` } : null,
|
|
500
|
+
refund: operation.refundHash ? { hash: operation.refundHash, amount: operation.refundBaseUnits ? formatUnits(operation.refundBaseUnits, route.source.decimals) : null, explorer: `${route.source.network.explorer}${operation.refundHash}` } : null,
|
|
501
|
+
history: operation.history.map(entry => ({ state: entry.state, at: new Date(entry.at).toISOString() }))
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
function validateId(id) {
|
|
506
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(id))
|
|
507
|
+
throw new AgentError('INVALID_ARGUMENT', 'Invalid swap request or quote ID.', 2);
|
|
508
|
+
}
|
|
509
|
+
function safeMessage(error) {
|
|
510
|
+
return error instanceof Error ? error.message.replace(/[\x00-\x1f\x7f]/g, ' ').slice(0, 240) : 'Swap provider is unavailable.';
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../swap/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { integer, record, textField } from './http.js';
|
|
2
|
+
import { swapRoute } from './routes.js';
|
|
3
|
+
export function readSwapQuote(value) {
|
|
4
|
+
const stored = record(value);
|
|
5
|
+
if (stored.routeId !== undefined) {
|
|
6
|
+
swapRoute(textField(stored.routeId));
|
|
7
|
+
return stored;
|
|
8
|
+
}
|
|
9
|
+
const { expectedSats, minimumSats, gasPrice, gasUnits, gasBudgetWei, netAfterGasSats, ...quote } = stored;
|
|
10
|
+
return {
|
|
11
|
+
...quote, routeId: 'bsc-btc',
|
|
12
|
+
expectedBaseUnits: textField(expectedSats), minimumBaseUnits: textField(minimumSats),
|
|
13
|
+
netOutputBaseUnits: textField(netAfterGasSats),
|
|
14
|
+
funding: {
|
|
15
|
+
asset: 'BNB', decimals: 18, price: 'bnb', rate: textField(gasPrice),
|
|
16
|
+
units: integer(gasUnits), budgetBaseUnits: textField(gasBudgetWei)
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function readSwapOperation(value) {
|
|
21
|
+
const { payoutSats, ...stored } = record(value);
|
|
22
|
+
const quote = readSwapQuote(stored.quote);
|
|
23
|
+
return {
|
|
24
|
+
...stored, quote,
|
|
25
|
+
...(payoutSats === undefined ? {} : { payoutBaseUnits: textField(payoutSats) })
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../swap/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,UAAU,aAAa,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,OAAO,MAAmB,CAAC;IAC/B,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IAC1G,OAAO;QACH,GAAG,KAAK,EAAE,OAAO,EAAE,SAAS;QAC5B,iBAAiB,EAAE,SAAS,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,WAAW,CAAC;QACpF,kBAAkB,EAAE,SAAS,CAAC,eAAe,CAAC;QAC9C,OAAO,EAAE;YACL,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;YACnE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,SAAS,CAAC,YAAY,CAAC;SACrE;KACS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC5C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO;QACH,GAAG,MAAM,EAAE,KAAK;QAChB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;KACjE,CAAC;AACvB,CAAC"}
|