@aztec/aztec.js 0.1.0-alpha29 → 0.1.0-alpha30

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.
@@ -2,10 +2,15 @@ import { FieldsOf } from '@aztec/circuits.js';
2
2
  import { AztecRPC, TxHash, TxReceipt } from '@aztec/types';
3
3
  /** Options related to waiting for a tx. */
4
4
  export type WaitOpts = {
5
- /** The maximum time (in seconds) to wait for the transaction to be mined. */
5
+ /** The maximum time (in seconds) to wait for the transaction to be mined. Defaults to 60. */
6
6
  timeout?: number;
7
- /** The time interval (in seconds) between retries to fetch the transaction receipt. */
7
+ /** The time interval (in seconds) between retries to fetch the transaction receipt. Defaults to 1. */
8
8
  interval?: number;
9
+ /**
10
+ * Whether to wait for the RPC server to sync all notes up to the block in which this tx was mined.
11
+ * If false, then any queries that depend on state set by this transaction may return stale data. Defaults to true.
12
+ **/
13
+ waitForNotesSync?: boolean;
9
14
  };
10
15
  /**
11
16
  * The SentTx class represents a sent transaction through the AztecRPCClient, providing methods to fetch
@@ -1 +1 @@
1
- {"version":3,"file":"sent_tx.d.ts","sourceRoot":"","sources":["../../src/contract/sent_tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAY,MAAM,cAAc,CAAC;AAErE,2CAA2C;AAC3C,MAAM,MAAM,QAAQ,GAAG;IACrB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAOF;;;GAGG;AACH,qBAAa,MAAM;IACL,SAAS,CAAC,GAAG,EAAE,QAAQ;IAAE,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC;gBAAvD,GAAG,EAAE,QAAQ,EAAY,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC;IAE7E;;;;;OAKG;IACU,SAAS;IAItB;;;;;;OAMG;IACU,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAK7C;;;;OAIG;IACU,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAOhE;;;;;;;OAOG;IACU,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;cAKvC,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;CAYpE"}
1
+ {"version":3,"file":"sent_tx.d.ts","sourceRoot":"","sources":["../../src/contract/sent_tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAY,MAAM,cAAc,CAAC;AAIrE,2CAA2C;AAC3C,MAAM,MAAM,QAAQ,GAAG;IACrB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sGAAsG;IACtG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;QAGI;IACJ,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAQF;;;GAGG;AACH,qBAAa,MAAM;IACL,SAAS,CAAC,GAAG,EAAE,QAAQ;IAAE,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC;gBAAvD,GAAG,EAAE,QAAQ,EAAY,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC;IAE7E;;;;;OAKG;IACU,SAAS;IAItB;;;;;;OAMG;IACU,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAK7C;;;;OAIG;IACU,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAOhE;;;;;;;OAOG;IACU,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;cAKvC,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;CAuBpE"}
@@ -1,8 +1,10 @@
1
1
  import { retryUntil } from '@aztec/foundation/retry';
2
2
  import { TxStatus } from '@aztec/types';
3
+ import every from 'lodash.every';
3
4
  const DefaultWaitOpts = {
4
- timeout: 0,
5
+ timeout: 60,
5
6
  interval: 1,
7
+ waitForNotesSync: true,
6
8
  };
7
9
  /**
8
10
  * The SentTx class represents a sent transaction through the AztecRPCClient, providing methods to fetch
@@ -60,8 +62,22 @@ export class SentTx {
60
62
  const txHash = await this.getTxHash();
61
63
  return await retryUntil(async () => {
62
64
  const txReceipt = await this.arc.getTxReceipt(txHash);
63
- return txReceipt.status != TxStatus.PENDING ? txReceipt : undefined;
65
+ // If receipt is not yet available, try again
66
+ if (txReceipt.status === TxStatus.PENDING)
67
+ return undefined;
68
+ // If the tx was dropped, return it
69
+ if (txReceipt.status === TxStatus.DROPPED)
70
+ return txReceipt;
71
+ // If we don't care about waiting for notes to be synced, return the receipt
72
+ const waitForNotesSync = opts?.waitForNotesSync ?? DefaultWaitOpts.waitForNotesSync;
73
+ if (!waitForNotesSync)
74
+ return txReceipt;
75
+ // Check if all sync blocks on the rpc server are greater or equal than the block in which the tx was mined
76
+ const { blocks, notes } = await this.arc.getSyncStatus();
77
+ const targetBlock = txReceipt.blockNumber;
78
+ const areNotesSynced = blocks >= targetBlock && every(notes, block => block >= targetBlock);
79
+ return areNotesSynced ? txReceipt : undefined;
64
80
  }, 'isMined', opts?.timeout ?? DefaultWaitOpts.timeout, opts?.interval ?? DefaultWaitOpts.interval);
65
81
  }
66
82
  }
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudF90eC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdC9zZW50X3R4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQStCLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVVyRSxNQUFNLGVBQWUsR0FBYTtJQUNoQyxPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxDQUFDO0NBQ1osQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sT0FBTyxNQUFNO0lBQ2pCLFlBQXNCLEdBQWEsRUFBWSxhQUE4QjtRQUF2RCxRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQVksa0JBQWEsR0FBYixhQUFhLENBQWlCO0lBQUcsQ0FBQztJQUVqRjs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxPQUFPLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQWU7UUFDL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDakYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQWU7UUFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELE9BQU8sT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFUyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQWU7UUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsT0FBTyxNQUFNLFVBQVUsQ0FDckIsS0FBSyxJQUFJLEVBQUU7WUFDVCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELE9BQU8sU0FBUyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN0RSxDQUFDLEVBQ0QsU0FBUyxFQUNULElBQUksRUFBRSxPQUFPLElBQUksZUFBZSxDQUFDLE9BQU8sRUFDeEMsSUFBSSxFQUFFLFFBQVEsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUMzQyxDQUFDO0lBQ0osQ0FBQztDQUNGIn0=
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudF90eC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdC9zZW50X3R4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQStCLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFlakMsTUFBTSxlQUFlLEdBQWE7SUFDaEMsT0FBTyxFQUFFLEVBQUU7SUFDWCxRQUFRLEVBQUUsQ0FBQztJQUNYLGdCQUFnQixFQUFFLElBQUk7Q0FDdkIsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sT0FBTyxNQUFNO0lBQ2pCLFlBQXNCLEdBQWEsRUFBWSxhQUE4QjtRQUF2RCxRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQVksa0JBQWEsR0FBYixhQUFhLENBQWlCO0lBQUcsQ0FBQztJQUVqRjs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxPQUFPLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQWU7UUFDL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDakYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQWU7UUFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELE9BQU8sT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFUyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQWU7UUFDNUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdEMsT0FBTyxNQUFNLFVBQVUsQ0FDckIsS0FBSyxJQUFJLEVBQUU7WUFDVCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELDZDQUE2QztZQUM3QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDNUQsbUNBQW1DO1lBQ25DLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsT0FBTztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM1RCw0RUFBNEU7WUFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEVBQUUsZ0JBQWdCLElBQUksZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQ3BGLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDeEMsMkdBQTJHO1lBQzNHLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFZLENBQUM7WUFDM0MsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLFdBQVcsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFDO1lBQzVGLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDLEVBQ0QsU0FBUyxFQUNULElBQUksRUFBRSxPQUFPLElBQUksZUFBZSxDQUFDLE9BQU8sRUFDeEMsSUFBSSxFQUFFLFFBQVEsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUMzQyxDQUFDO0lBQ0osQ0FBQztDQUNGIn0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sent_tx.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sent_tx.test.d.ts","sourceRoot":"","sources":["../../src/contract/sent_tx.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ import { TxHash, TxStatus } from '@aztec/types';
2
+ import { mock } from 'jest-mock-extended';
3
+ import { SentTx } from './sent_tx.js';
4
+ describe('SentTx', () => {
5
+ let rpc;
6
+ let txHashPromise;
7
+ let sentTx;
8
+ beforeEach(() => {
9
+ rpc = mock();
10
+ txHashPromise = Promise.resolve(TxHash.fromBigInt(1n));
11
+ sentTx = new SentTx(rpc, txHashPromise);
12
+ });
13
+ describe('wait', () => {
14
+ let txReceipt;
15
+ beforeEach(() => {
16
+ txReceipt = { status: TxStatus.MINED, blockNumber: 20 };
17
+ rpc.getTxReceipt.mockResolvedValue(txReceipt);
18
+ });
19
+ it('waits for all notes accounts to be synced', async () => {
20
+ rpc.getSyncStatus
21
+ .mockResolvedValueOnce({ blocks: 25, notes: { '0x1': 19, '0x2': 20 } })
22
+ .mockResolvedValueOnce({ blocks: 25, notes: { '0x1': 20, '0x2': 20 } });
23
+ const actual = await sentTx.wait({ timeout: 1, interval: 0.4 });
24
+ expect(actual).toEqual(txReceipt);
25
+ });
26
+ it('fails if an account is not synced', async () => {
27
+ rpc.getSyncStatus.mockResolvedValue({ blocks: 25, notes: { '0x1': 19, '0x2': 20 } });
28
+ await expect(sentTx.wait({ timeout: 1, interval: 0.4 })).rejects.toThrowError(/timeout/i);
29
+ });
30
+ it('does not wait for notes sync', async () => {
31
+ rpc.getSyncStatus.mockResolvedValue({ blocks: 19, notes: { '0x1': 19, '0x2': 19 } });
32
+ const actual = await sentTx.wait({ timeout: 1, interval: 0.4, waitForNotesSync: false });
33
+ expect(actual).toEqual(txReceipt);
34
+ });
35
+ it('throws if tx is dropped', async () => {
36
+ rpc.getTxReceipt.mockResolvedValue({ ...txReceipt, status: TxStatus.DROPPED });
37
+ rpc.getSyncStatus.mockResolvedValue({ blocks: 19, notes: { '0x1': 19, '0x2': 19 } });
38
+ await expect(sentTx.wait({ timeout: 1, interval: 0.4 })).rejects.toThrowError(/dropped/);
39
+ });
40
+ });
41
+ });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudF90eC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyYWN0L3NlbnRfdHgudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksTUFBTSxFQUFhLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRSxPQUFPLEVBQWEsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV0QyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtJQUN0QixJQUFJLEdBQXdCLENBQUM7SUFDN0IsSUFBSSxhQUE4QixDQUFDO0lBRW5DLElBQUksTUFBYyxDQUFDO0lBRW5CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDYixhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ3BCLElBQUksU0FBb0IsQ0FBQztRQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsU0FBUyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBZSxDQUFDO1lBQ3JFLEdBQUcsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDekQsR0FBRyxDQUFDLGFBQWE7aUJBQ2QscUJBQXFCLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFB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