@polkadot-apps/tx 0.2.0
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/dist/dev-signers.d.ts +34 -0
- package/dist/dev-signers.d.ts.map +1 -0
- package/dist/dev-signers.js +85 -0
- package/dist/dev-signers.js.map +1 -0
- package/dist/dry-run.d.ts +73 -0
- package/dist/dry-run.d.ts.map +1 -0
- package/dist/dry-run.js +242 -0
- package/dist/dry-run.js.map +1 -0
- package/dist/errors.d.ts +109 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +408 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/retry.d.ts +30 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +157 -0
- package/dist/retry.js.map +1 -0
- package/dist/submit.d.ts +19 -0
- package/dist/submit.d.ts.map +1 -0
- package/dist/submit.js +413 -0
- package/dist/submit.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
package/dist/submit.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PolkadotSigner } from "polkadot-api";
|
|
2
|
+
import type { SubmitOptions, SubmittableTransaction, TxResult } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Submit a transaction and watch its lifecycle through signing, broadcasting,
|
|
5
|
+
* block inclusion, and (optionally) finalization.
|
|
6
|
+
*
|
|
7
|
+
* @param tx - A transaction object with `signSubmitAndWatch`. Works with raw PAPI
|
|
8
|
+
* transactions and Ink SDK `AsyncTransaction` wrappers (resolved automatically).
|
|
9
|
+
* @param signer - The signer to use. Can come from a wallet extension, Host API
|
|
10
|
+
* (`getProductAccountSigner`), or {@link createDevSigner}.
|
|
11
|
+
* @param options - Submission options (waitFor, timeout, mortality, status callback).
|
|
12
|
+
* @returns The transaction result once included/finalized.
|
|
13
|
+
*
|
|
14
|
+
* @throws {TxTimeoutError} If the transaction does not reach the target state within `timeoutMs`.
|
|
15
|
+
* @throws {TxDispatchError} If the on-chain dispatch fails (e.g., insufficient balance, contract revert).
|
|
16
|
+
* @throws {TxSigningRejectedError} If the user rejects signing in their wallet.
|
|
17
|
+
*/
|
|
18
|
+
export declare function submitAndWatch(tx: SubmittableTransaction, signer: PolkadotSigner, options?: SubmitOptions): Promise<TxResult>;
|
|
19
|
+
//# sourceMappingURL=submit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../src/submit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAUnD,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAW,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiC3F;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,CAChC,EAAE,EAAE,sBAAsB,EAC1B,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,QAAQ,CAAC,CA4JnB"}
|
package/dist/submit.js
ADDED
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import { createLogger } from "@polkadot-apps/logger";
|
|
2
|
+
import { TxDispatchError, TxSigningRejectedError, TxTimeoutError, formatDispatchError, isSigningRejection, } from "./errors.js";
|
|
3
|
+
const DEFAULT_TIMEOUT_MS = 300_000;
|
|
4
|
+
const DEFAULT_MORTALITY_PERIOD = 256;
|
|
5
|
+
const log = createLogger("tx");
|
|
6
|
+
/**
|
|
7
|
+
* Resolve Ink SDK AsyncTransaction wrappers.
|
|
8
|
+
*
|
|
9
|
+
* Ink SDK's `contract.send()` returns an object with a `.waited` Promise that
|
|
10
|
+
* resolves to the actual transaction. This handles that transparently.
|
|
11
|
+
*/
|
|
12
|
+
async function resolveTransaction(tx) {
|
|
13
|
+
if (tx.waited && typeof tx.waited.then === "function") {
|
|
14
|
+
log.debug("Resolving Ink SDK AsyncTransaction");
|
|
15
|
+
return tx.waited;
|
|
16
|
+
}
|
|
17
|
+
return tx;
|
|
18
|
+
}
|
|
19
|
+
function buildTxResult(event) {
|
|
20
|
+
return {
|
|
21
|
+
txHash: event.txHash,
|
|
22
|
+
ok: event.ok,
|
|
23
|
+
block: event.block,
|
|
24
|
+
events: event.events,
|
|
25
|
+
dispatchError: "dispatchError" in event ? event.dispatchError : undefined,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Submit a transaction and watch its lifecycle through signing, broadcasting,
|
|
30
|
+
* block inclusion, and (optionally) finalization.
|
|
31
|
+
*
|
|
32
|
+
* @param tx - A transaction object with `signSubmitAndWatch`. Works with raw PAPI
|
|
33
|
+
* transactions and Ink SDK `AsyncTransaction` wrappers (resolved automatically).
|
|
34
|
+
* @param signer - The signer to use. Can come from a wallet extension, Host API
|
|
35
|
+
* (`getProductAccountSigner`), or {@link createDevSigner}.
|
|
36
|
+
* @param options - Submission options (waitFor, timeout, mortality, status callback).
|
|
37
|
+
* @returns The transaction result once included/finalized.
|
|
38
|
+
*
|
|
39
|
+
* @throws {TxTimeoutError} If the transaction does not reach the target state within `timeoutMs`.
|
|
40
|
+
* @throws {TxDispatchError} If the on-chain dispatch fails (e.g., insufficient balance, contract revert).
|
|
41
|
+
* @throws {TxSigningRejectedError} If the user rejects signing in their wallet.
|
|
42
|
+
*/
|
|
43
|
+
export async function submitAndWatch(tx, signer, options) {
|
|
44
|
+
const waitFor = options?.waitFor ?? "best-block";
|
|
45
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
46
|
+
const mortalityPeriod = options?.mortalityPeriod ?? DEFAULT_MORTALITY_PERIOD;
|
|
47
|
+
const onStatus = options?.onStatus;
|
|
48
|
+
const resolvedTx = await resolveTransaction(tx);
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
let settled = false;
|
|
51
|
+
let subscription = null;
|
|
52
|
+
const timer = setTimeout(() => {
|
|
53
|
+
subscription?.unsubscribe();
|
|
54
|
+
if (!settled) {
|
|
55
|
+
settled = true;
|
|
56
|
+
onStatus?.("error");
|
|
57
|
+
reject(new TxTimeoutError(timeoutMs));
|
|
58
|
+
}
|
|
59
|
+
}, timeoutMs);
|
|
60
|
+
function teardown() {
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
subscription?.unsubscribe();
|
|
63
|
+
}
|
|
64
|
+
function settleReject(error) {
|
|
65
|
+
if (settled)
|
|
66
|
+
return;
|
|
67
|
+
settled = true;
|
|
68
|
+
teardown();
|
|
69
|
+
onStatus?.("error");
|
|
70
|
+
reject(error);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const observable = resolvedTx.signSubmitAndWatch(signer, {
|
|
74
|
+
mortality: { mortal: true, period: mortalityPeriod },
|
|
75
|
+
});
|
|
76
|
+
subscription = observable.subscribe({
|
|
77
|
+
next: (event) => {
|
|
78
|
+
switch (event.type) {
|
|
79
|
+
case "signed": {
|
|
80
|
+
log.info("Transaction signed", { txHash: event.txHash });
|
|
81
|
+
onStatus?.("signing");
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case "broadcasted": {
|
|
85
|
+
log.info("Transaction broadcasted", { txHash: event.txHash });
|
|
86
|
+
onStatus?.("broadcasting");
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case "txBestBlocksState": {
|
|
90
|
+
if (!event.found)
|
|
91
|
+
break;
|
|
92
|
+
if (event.ok === false) {
|
|
93
|
+
const formatted = formatDispatchError({
|
|
94
|
+
ok: false,
|
|
95
|
+
dispatchError: event.dispatchError,
|
|
96
|
+
});
|
|
97
|
+
log.error("Transaction failed in best block", {
|
|
98
|
+
formatted,
|
|
99
|
+
block: event.block,
|
|
100
|
+
});
|
|
101
|
+
settleReject(new TxDispatchError(event.dispatchError, formatted));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
log.info("Transaction in best block", { block: event.block });
|
|
105
|
+
onStatus?.("in-block");
|
|
106
|
+
if (waitFor === "best-block" &&
|
|
107
|
+
event.ok === true &&
|
|
108
|
+
event.block &&
|
|
109
|
+
event.events) {
|
|
110
|
+
// Resolve the Promise but keep the subscription alive so we can
|
|
111
|
+
// detect reorgs (finalized event with ok=false after best-block ok=true).
|
|
112
|
+
// Only clear the timer since the consumer has their result.
|
|
113
|
+
settled = true;
|
|
114
|
+
clearTimeout(timer);
|
|
115
|
+
resolve(buildTxResult(event));
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case "finalized": {
|
|
120
|
+
log.info("Transaction finalized", { ok: event.ok, block: event.block });
|
|
121
|
+
if (!event.ok) {
|
|
122
|
+
const formatted = formatDispatchError({
|
|
123
|
+
ok: false,
|
|
124
|
+
dispatchError: event.dispatchError,
|
|
125
|
+
});
|
|
126
|
+
if (settled) {
|
|
127
|
+
// Already resolved at best-block but finalized shows failure
|
|
128
|
+
// due to a chain reorganization. We can only log since the
|
|
129
|
+
// Promise is already resolved.
|
|
130
|
+
log.warn("Transaction failed after being in best block (reorg). " +
|
|
131
|
+
"The consumer received a success result that is no longer valid.", { formatted, block: event.block });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
settleReject(new TxDispatchError(event.dispatchError, formatted));
|
|
135
|
+
}
|
|
136
|
+
subscription?.unsubscribe();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
onStatus?.("finalized");
|
|
140
|
+
if (!settled) {
|
|
141
|
+
settled = true;
|
|
142
|
+
teardown();
|
|
143
|
+
resolve(buildTxResult(event));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Already resolved at best-block, finalization confirmed success.
|
|
147
|
+
subscription?.unsubscribe();
|
|
148
|
+
}
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
error: (err) => {
|
|
154
|
+
log.error("Transaction subscription error", { error: err.message });
|
|
155
|
+
if (isSigningRejection(err)) {
|
|
156
|
+
settleReject(new TxSigningRejectedError());
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
settleReject(err);
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
log.error("Failed to start transaction", { error: err.message });
|
|
166
|
+
teardown();
|
|
167
|
+
if (isSigningRejection(err)) {
|
|
168
|
+
settleReject(new TxSigningRejectedError());
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
settleReject(err);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
if (import.meta.vitest) {
|
|
177
|
+
const { describe, test, expect, vi, beforeEach } = import.meta.vitest;
|
|
178
|
+
const { configure } = await import("@polkadot-apps/logger");
|
|
179
|
+
// Silence logger during tests
|
|
180
|
+
beforeEach(() => {
|
|
181
|
+
configure({ handler: () => { } });
|
|
182
|
+
});
|
|
183
|
+
function createMockTx(emitFn) {
|
|
184
|
+
return {
|
|
185
|
+
signSubmitAndWatch: (_signer, _options) => ({
|
|
186
|
+
subscribe: (handlers) => {
|
|
187
|
+
const unsub = vi.fn();
|
|
188
|
+
// Emit events asynchronously so the subscription is returned first
|
|
189
|
+
queueMicrotask(() => emitFn(handlers));
|
|
190
|
+
return { unsubscribe: unsub };
|
|
191
|
+
},
|
|
192
|
+
}),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const mockSigner = {};
|
|
196
|
+
const signedEvent = { type: "signed", txHash: "0xabc" };
|
|
197
|
+
const broadcastedEvent = { type: "broadcasted", txHash: "0xabc" };
|
|
198
|
+
const bestBlockOk = {
|
|
199
|
+
type: "txBestBlocksState",
|
|
200
|
+
txHash: "0xabc",
|
|
201
|
+
found: true,
|
|
202
|
+
ok: true,
|
|
203
|
+
events: [{ id: 1 }],
|
|
204
|
+
block: { hash: "0xblock1", number: 100, index: 0 },
|
|
205
|
+
};
|
|
206
|
+
const bestBlockFail = {
|
|
207
|
+
type: "txBestBlocksState",
|
|
208
|
+
txHash: "0xabc",
|
|
209
|
+
found: true,
|
|
210
|
+
ok: false,
|
|
211
|
+
events: [],
|
|
212
|
+
block: { hash: "0xblock1", number: 100, index: 0 },
|
|
213
|
+
dispatchError: {
|
|
214
|
+
type: "Module",
|
|
215
|
+
value: { type: "Balances", value: { type: "InsufficientBalance" } },
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
const finalizedOk = {
|
|
219
|
+
type: "finalized",
|
|
220
|
+
txHash: "0xabc",
|
|
221
|
+
ok: true,
|
|
222
|
+
events: [{ id: 1 }],
|
|
223
|
+
block: { hash: "0xblock2", number: 101, index: 0 },
|
|
224
|
+
};
|
|
225
|
+
const finalizedFail = {
|
|
226
|
+
type: "finalized",
|
|
227
|
+
txHash: "0xabc",
|
|
228
|
+
ok: false,
|
|
229
|
+
events: [],
|
|
230
|
+
block: { hash: "0xblock2", number: 101, index: 0 },
|
|
231
|
+
dispatchError: { type: "BadOrigin" },
|
|
232
|
+
};
|
|
233
|
+
describe("submitAndWatch", () => {
|
|
234
|
+
test("resolves at best-block by default", async () => {
|
|
235
|
+
const tx = createMockTx((h) => {
|
|
236
|
+
h.next(signedEvent);
|
|
237
|
+
h.next(broadcastedEvent);
|
|
238
|
+
h.next(bestBlockOk);
|
|
239
|
+
h.next(finalizedOk);
|
|
240
|
+
});
|
|
241
|
+
const result = await submitAndWatch(tx, mockSigner);
|
|
242
|
+
expect(result.ok).toBe(true);
|
|
243
|
+
expect(result.block.number).toBe(100);
|
|
244
|
+
});
|
|
245
|
+
test("resolves at finalized when configured", async () => {
|
|
246
|
+
const tx = createMockTx((h) => {
|
|
247
|
+
h.next(signedEvent);
|
|
248
|
+
h.next(bestBlockOk);
|
|
249
|
+
h.next(finalizedOk);
|
|
250
|
+
});
|
|
251
|
+
const result = await submitAndWatch(tx, mockSigner, { waitFor: "finalized" });
|
|
252
|
+
expect(result.ok).toBe(true);
|
|
253
|
+
expect(result.block.number).toBe(101);
|
|
254
|
+
});
|
|
255
|
+
test("rejects with TxDispatchError on best-block failure", async () => {
|
|
256
|
+
const tx = createMockTx((h) => {
|
|
257
|
+
h.next(signedEvent);
|
|
258
|
+
h.next(bestBlockFail);
|
|
259
|
+
});
|
|
260
|
+
await expect(submitAndWatch(tx, mockSigner)).rejects.toThrow(TxDispatchError);
|
|
261
|
+
});
|
|
262
|
+
test("rejects with TxDispatchError on finalized failure", async () => {
|
|
263
|
+
const tx = createMockTx((h) => {
|
|
264
|
+
h.next(signedEvent);
|
|
265
|
+
h.next(finalizedFail);
|
|
266
|
+
});
|
|
267
|
+
await expect(submitAndWatch(tx, mockSigner, { waitFor: "finalized" })).rejects.toThrow(TxDispatchError);
|
|
268
|
+
});
|
|
269
|
+
test("rejects with TxTimeoutError after timeout", async () => {
|
|
270
|
+
const tx = createMockTx(() => {
|
|
271
|
+
// Never emits any events - tx hangs forever
|
|
272
|
+
});
|
|
273
|
+
const error = await submitAndWatch(tx, mockSigner, { timeoutMs: 50 }).catch((e) => e);
|
|
274
|
+
expect(error).toBeInstanceOf(TxTimeoutError);
|
|
275
|
+
expect(error.timeoutMs).toBe(50);
|
|
276
|
+
});
|
|
277
|
+
test("calls onStatus callbacks in order", async () => {
|
|
278
|
+
const statuses = [];
|
|
279
|
+
const tx = createMockTx((h) => {
|
|
280
|
+
h.next(signedEvent);
|
|
281
|
+
h.next(broadcastedEvent);
|
|
282
|
+
h.next(bestBlockOk);
|
|
283
|
+
});
|
|
284
|
+
await submitAndWatch(tx, mockSigner, {
|
|
285
|
+
onStatus: (s) => statuses.push(s),
|
|
286
|
+
});
|
|
287
|
+
expect(statuses).toEqual(["signing", "broadcasting", "in-block"]);
|
|
288
|
+
});
|
|
289
|
+
test("resolves Ink SDK AsyncTransaction", async () => {
|
|
290
|
+
const innerTx = createMockTx((h) => {
|
|
291
|
+
h.next(signedEvent);
|
|
292
|
+
h.next(bestBlockOk);
|
|
293
|
+
});
|
|
294
|
+
const wrappedTx = {
|
|
295
|
+
signSubmitAndWatch: () => {
|
|
296
|
+
throw new Error("Should not be called on outer tx");
|
|
297
|
+
},
|
|
298
|
+
waited: Promise.resolve(innerTx),
|
|
299
|
+
};
|
|
300
|
+
const result = await submitAndWatch(wrappedTx, mockSigner);
|
|
301
|
+
expect(result.ok).toBe(true);
|
|
302
|
+
});
|
|
303
|
+
test("passes mortality options", async () => {
|
|
304
|
+
let capturedOptions;
|
|
305
|
+
const tx = {
|
|
306
|
+
signSubmitAndWatch: (_signer, options) => {
|
|
307
|
+
capturedOptions = options;
|
|
308
|
+
return {
|
|
309
|
+
subscribe: (handlers) => {
|
|
310
|
+
queueMicrotask(() => {
|
|
311
|
+
handlers.next(signedEvent);
|
|
312
|
+
handlers.next(bestBlockOk);
|
|
313
|
+
});
|
|
314
|
+
return { unsubscribe: vi.fn() };
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
await submitAndWatch(tx, mockSigner, { mortalityPeriod: 512 });
|
|
320
|
+
expect(capturedOptions).toEqual({ mortality: { mortal: true, period: 512 } });
|
|
321
|
+
});
|
|
322
|
+
test("wraps signing rejection in TxSigningRejectedError", async () => {
|
|
323
|
+
const tx = createMockTx((h) => {
|
|
324
|
+
h.error(new Error("User rejected the request"));
|
|
325
|
+
});
|
|
326
|
+
await expect(submitAndWatch(tx, mockSigner)).rejects.toThrow(TxSigningRejectedError);
|
|
327
|
+
});
|
|
328
|
+
test("skips txBestBlocksState with found=false", async () => {
|
|
329
|
+
const tx = createMockTx((h) => {
|
|
330
|
+
h.next(signedEvent);
|
|
331
|
+
h.next({
|
|
332
|
+
type: "txBestBlocksState",
|
|
333
|
+
txHash: "0xabc",
|
|
334
|
+
found: false,
|
|
335
|
+
});
|
|
336
|
+
h.next(bestBlockOk);
|
|
337
|
+
});
|
|
338
|
+
const result = await submitAndWatch(tx, mockSigner);
|
|
339
|
+
expect(result.ok).toBe(true);
|
|
340
|
+
});
|
|
341
|
+
test("rejects with original error for non-rejection Observable errors", async () => {
|
|
342
|
+
const tx = createMockTx((h) => {
|
|
343
|
+
h.error(new Error("WebSocket disconnected"));
|
|
344
|
+
});
|
|
345
|
+
const err = await submitAndWatch(tx, mockSigner).catch((e) => e);
|
|
346
|
+
expect(err.message).toBe("WebSocket disconnected");
|
|
347
|
+
expect(err).not.toBeInstanceOf(TxSigningRejectedError);
|
|
348
|
+
});
|
|
349
|
+
test("handles synchronous throw from signSubmitAndWatch", async () => {
|
|
350
|
+
const tx = {
|
|
351
|
+
signSubmitAndWatch: () => {
|
|
352
|
+
throw new Error("Signer not available");
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
await expect(submitAndWatch(tx, mockSigner)).rejects.toThrow("Signer not available");
|
|
356
|
+
});
|
|
357
|
+
test("calls onStatus error on dispatch failure", async () => {
|
|
358
|
+
const statuses = [];
|
|
359
|
+
const tx = createMockTx((h) => {
|
|
360
|
+
h.next(bestBlockFail);
|
|
361
|
+
});
|
|
362
|
+
await submitAndWatch(tx, mockSigner, {
|
|
363
|
+
onStatus: (s) => statuses.push(s),
|
|
364
|
+
}).catch(() => { });
|
|
365
|
+
expect(statuses).toContain("error");
|
|
366
|
+
});
|
|
367
|
+
test("logs warning on reorg (best-block ok, finalized fail)", async () => {
|
|
368
|
+
const warnings = [];
|
|
369
|
+
const { configure: configureLogs } = await import("@polkadot-apps/logger");
|
|
370
|
+
configureLogs({
|
|
371
|
+
level: "debug",
|
|
372
|
+
handler: (entry) => {
|
|
373
|
+
if (entry.level === "warn")
|
|
374
|
+
warnings.push(entry.message);
|
|
375
|
+
},
|
|
376
|
+
});
|
|
377
|
+
const tx = createMockTx((h) => {
|
|
378
|
+
h.next(signedEvent);
|
|
379
|
+
h.next(bestBlockOk);
|
|
380
|
+
// Finalized says the tx actually failed (reorg)
|
|
381
|
+
h.next(finalizedFail);
|
|
382
|
+
});
|
|
383
|
+
// Should resolve at best-block (success)
|
|
384
|
+
const result = await submitAndWatch(tx, mockSigner);
|
|
385
|
+
expect(result.ok).toBe(true);
|
|
386
|
+
// Give the finalized event time to fire and log
|
|
387
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
388
|
+
expect(warnings.some((w) => typeof w === "string" && w.includes("reorg"))).toBe(true);
|
|
389
|
+
// Restore silent handler
|
|
390
|
+
configureLogs({ handler: () => { } });
|
|
391
|
+
});
|
|
392
|
+
test("does not resolve when txBestBlocksState ok is undefined", async () => {
|
|
393
|
+
const tx = createMockTx((h) => {
|
|
394
|
+
h.next(signedEvent);
|
|
395
|
+
// ok is undefined (not explicitly true or false)
|
|
396
|
+
h.next({
|
|
397
|
+
type: "txBestBlocksState",
|
|
398
|
+
txHash: "0xabc",
|
|
399
|
+
found: true,
|
|
400
|
+
events: [{ id: 1 }],
|
|
401
|
+
block: { hash: "0xblock1", number: 100, index: 0 },
|
|
402
|
+
// ok intentionally omitted
|
|
403
|
+
});
|
|
404
|
+
// Should only resolve when finalized
|
|
405
|
+
h.next(finalizedOk);
|
|
406
|
+
});
|
|
407
|
+
const result = await submitAndWatch(tx, mockSigner);
|
|
408
|
+
// Should resolve from finalized, not best-block (since ok was undefined)
|
|
409
|
+
expect(result.block.number).toBe(101);
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
//# sourceMappingURL=submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../src/submit.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { PolkadotSigner } from "polkadot-api";
|
|
2
|
+
/** Transaction lifecycle status for UI callbacks. */
|
|
3
|
+
export type TxStatus = "signing" | "broadcasting" | "in-block" | "finalized" | "error";
|
|
4
|
+
/** When to resolve the submission promise. */
|
|
5
|
+
export type WaitFor = "best-block" | "finalized";
|
|
6
|
+
/** Successful transaction result. */
|
|
7
|
+
export interface TxResult {
|
|
8
|
+
/** Transaction hash. */
|
|
9
|
+
txHash: string;
|
|
10
|
+
/** Whether the on-chain dispatch succeeded. */
|
|
11
|
+
ok: boolean;
|
|
12
|
+
/** Block where the transaction was included. */
|
|
13
|
+
block: {
|
|
14
|
+
hash: string;
|
|
15
|
+
number: number;
|
|
16
|
+
index: number;
|
|
17
|
+
};
|
|
18
|
+
/** Raw events emitted by the transaction. */
|
|
19
|
+
events: unknown[];
|
|
20
|
+
/** Dispatch error details when ok is false. */
|
|
21
|
+
dispatchError?: unknown;
|
|
22
|
+
}
|
|
23
|
+
/** Options for {@link submitAndWatch}. */
|
|
24
|
+
export interface SubmitOptions {
|
|
25
|
+
/** When to resolve the promise. Default: `"best-block"`. */
|
|
26
|
+
waitFor?: WaitFor;
|
|
27
|
+
/** Timeout in milliseconds. Default: `300_000` (5 minutes). */
|
|
28
|
+
timeoutMs?: number;
|
|
29
|
+
/** Mortality period in blocks. Default: `256` (~43 minutes on Polkadot). */
|
|
30
|
+
mortalityPeriod?: number;
|
|
31
|
+
/** Called on each lifecycle transition for UI progress indicators. */
|
|
32
|
+
onStatus?: (status: TxStatus) => void;
|
|
33
|
+
}
|
|
34
|
+
/** Options for {@link withRetry}. */
|
|
35
|
+
export interface RetryOptions {
|
|
36
|
+
/** Total attempts including the first. Default: `3`. */
|
|
37
|
+
maxAttempts?: number;
|
|
38
|
+
/** Base delay in ms for exponential backoff. Default: `1_000`. */
|
|
39
|
+
baseDelayMs?: number;
|
|
40
|
+
/** Maximum delay in ms. Default: `15_000`. */
|
|
41
|
+
maxDelayMs?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Substrate weight representing computational and storage resources.
|
|
45
|
+
*
|
|
46
|
+
* Matches the shape returned by `ReviveApi.call` and `ReviveApi.eth_transact`
|
|
47
|
+
* dry-run results in the `weight_required` field.
|
|
48
|
+
*/
|
|
49
|
+
export interface Weight {
|
|
50
|
+
/** Reference time component in picoseconds. */
|
|
51
|
+
ref_time: bigint;
|
|
52
|
+
/** Proof size component in bytes. */
|
|
53
|
+
proof_size: bigint;
|
|
54
|
+
}
|
|
55
|
+
/** Standard Substrate dev account names. */
|
|
56
|
+
export type DevAccountName = "Alice" | "Bob" | "Charlie" | "Dave" | "Eve" | "Ferdie";
|
|
57
|
+
/**
|
|
58
|
+
* Structural type for any transaction object that supports Observable-based
|
|
59
|
+
* sign-submit-and-watch. Works with raw PAPI transactions and Ink SDK
|
|
60
|
+
* resolved transactions.
|
|
61
|
+
*/
|
|
62
|
+
export interface SubmittableTransaction {
|
|
63
|
+
signSubmitAndWatch: (signer: PolkadotSigner, options?: {
|
|
64
|
+
mortality?: {
|
|
65
|
+
mortal: boolean;
|
|
66
|
+
period: number;
|
|
67
|
+
};
|
|
68
|
+
}) => {
|
|
69
|
+
subscribe: (handlers: {
|
|
70
|
+
next: (event: TxEvent) => void;
|
|
71
|
+
error: (error: Error) => void;
|
|
72
|
+
}) => {
|
|
73
|
+
unsubscribe: () => void;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
/** Present on Ink SDK AsyncTransaction wrappers. */
|
|
77
|
+
waited?: Promise<SubmittableTransaction>;
|
|
78
|
+
}
|
|
79
|
+
/** PAPI transaction event (discriminated union). */
|
|
80
|
+
export type TxEvent = {
|
|
81
|
+
type: "signed";
|
|
82
|
+
txHash: string;
|
|
83
|
+
} | {
|
|
84
|
+
type: "broadcasted";
|
|
85
|
+
txHash: string;
|
|
86
|
+
} | {
|
|
87
|
+
type: "txBestBlocksState";
|
|
88
|
+
txHash: string;
|
|
89
|
+
found: boolean;
|
|
90
|
+
ok?: boolean;
|
|
91
|
+
events?: unknown[];
|
|
92
|
+
block?: {
|
|
93
|
+
hash: string;
|
|
94
|
+
number: number;
|
|
95
|
+
index: number;
|
|
96
|
+
};
|
|
97
|
+
dispatchError?: unknown;
|
|
98
|
+
} | {
|
|
99
|
+
type: "finalized";
|
|
100
|
+
txHash: string;
|
|
101
|
+
ok: boolean;
|
|
102
|
+
events: unknown[];
|
|
103
|
+
block: {
|
|
104
|
+
hash: string;
|
|
105
|
+
number: number;
|
|
106
|
+
index: number;
|
|
107
|
+
};
|
|
108
|
+
dispatchError?: unknown;
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@polkadot-apps/tx",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"polkadot-api": "^1.23.3",
|
|
21
|
+
"@polkadot-labs/hdkd-helpers": "^0.0.27",
|
|
22
|
+
"@polkadot-apps/keys": "0.2.0",
|
|
23
|
+
"@polkadot-apps/logger": "0.1.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"typescript": "^5.9.3"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -p tsconfig.json",
|
|
30
|
+
"clean": "rm -rf dist"
|
|
31
|
+
}
|
|
32
|
+
}
|