tigerbeetle-node 0.16.78 → 0.17.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/README.md CHANGED
@@ -109,8 +109,8 @@ const account = {
109
109
  timestamp: 0n,
110
110
  };
111
111
 
112
- const account_errors = await client.createAccounts([account]);
113
- // Error handling omitted.
112
+ const account_results = await client.createAccounts([account]);
113
+ // Results handling omitted.
114
114
  ```
115
115
 
116
116
  See details for the recommended ID scheme in
@@ -167,21 +167,23 @@ const account1 = {
167
167
  flags: AccountFlags.history,
168
168
  };
169
169
 
170
- const account_errors = await client.createAccounts([account0, account1]);
171
- // Error handling omitted.
170
+ const account_results = await client.createAccounts([account0, account1]);
171
+ // Results handling omitted.
172
172
  ```
173
173
 
174
174
  ### Response and Errors
175
175
 
176
- The response is an empty array if all accounts were
177
- created successfully. If the response is non-empty, each
178
- object in the response array contains error information
179
- for an account that failed. The error object contains an
180
- error code and the index of the account in the request
181
- batch.
182
-
183
- See all error conditions in the [create_accounts
184
- reference](https://docs.tigerbeetle.com/reference/requests/create_accounts).
176
+ The response is an array containing the _status code_ and the _timestamp_ of
177
+ each account in the request batch:
178
+ - Successfully created accounts with the status
179
+ [`created`](https://docs.tigerbeetle.com/reference/requests/create_accounts#created)
180
+ return the timestamp assigned to the `Account` object.
181
+ - Already existing accounts with the result
182
+ [`exists`](https://docs.tigerbeetle.com/reference/requests/create_accounts#exists)
183
+ return the timestamp of the original existing object.
184
+ - Failed accounts return the status code along with the timestamp when the validation
185
+ occurred. See all error conditions in the
186
+ [create_accounts reference](https://docs.tigerbeetle.com/reference/requests/create_accounts#status).
185
187
 
186
188
  ```javascript
187
189
  const account0 = {
@@ -230,18 +232,18 @@ const account2 = {
230
232
  flags: 0,
231
233
  };
232
234
 
233
- const account_errors = await client.createAccounts([account0, account1, account2]);
234
- for (const error of account_errors) {
235
- switch (error.result) {
236
- case CreateAccountError.exists:
237
- console.error(`Batch account at ${error.index} already exists.`);
235
+ const account_results = await client.createAccounts([account0, account1, account2]);
236
+ for (let i = 0; i < account_results.length; i++) {
237
+ switch (account_results[i].status) {
238
+ case CreateAccountStatus.created:
239
+ console.error(`Batch account at ${i} successfully created with timestamp ${account_results[i].timestamp}.`);
240
+ break;
241
+ case CreateAccountStatus.exists:
242
+ console.error(`Batch account at ${i} already exists with timestamp ${account_results[i].timestamp}.`);
238
243
  break;
239
244
  default:
240
- console.error(
241
- `Batch account at ${error.index} failed to create: ${
242
- CreateAccountError[error.result]
243
- }.`,
244
- );
245
+ console.error(`Batch account at ${i} failed to create: ${account_results[i].status}`);
246
+ break;
245
247
  }
246
248
  }
247
249
  ```
@@ -290,8 +292,8 @@ const transfers = [{
290
292
  timestamp: 0n,
291
293
  }];
292
294
 
293
- const transfer_errors = await client.createTransfers(transfers);
294
- // Error handling omitted.
295
+ const transfers_results = await client.createTransfers(transfers);
296
+ // Results handling omitted.
295
297
  ```
296
298
 
297
299
  See details for the recommended ID scheme in
@@ -299,14 +301,17 @@ See details for the recommended ID scheme in
299
301
 
300
302
  ### Response and Errors
301
303
 
302
- The response is an empty array if all transfers were created
303
- successfully. If the response is non-empty, each object in the
304
- response array contains error information for a transfer that
305
- failed. The error object contains an error code and the index of the
306
- transfer in the request batch.
307
-
308
- See all error conditions in the [create_transfers
309
- reference](https://docs.tigerbeetle.com/reference/requests/create_transfers).
304
+ The response is an array containing the _status code_ and the _timestamp_ of
305
+ each transfer in the request batch:
306
+ - Successfully created transfers with the result
307
+ [`created`](https://docs.tigerbeetle.com/reference/requests/create_transfers#created)
308
+ return the timestamp assigned to the `Transfer` object.
309
+ - Already existing transfers with the result
310
+ [`exists`](https://docs.tigerbeetle.com/reference/requests/create_transfers#exists)
311
+ return the timestamp of the original existing object.
312
+ - Failed transfers return the status code along with the timestamp when the validation
313
+ occurred. See all error conditions in the
314
+ [create_transfers reference](https://docs.tigerbeetle.com/reference/requests/create_transfers#status).
310
315
 
311
316
  ```javascript
312
317
  const transfers = [{
@@ -355,18 +360,18 @@ const transfers = [{
355
360
  timestamp: 0n,
356
361
  }];
357
362
 
358
- const transfer_errors = await client.createTransfers(batch);
359
- for (const error of transfer_errors) {
360
- switch (error.result) {
361
- case CreateTransferError.exists:
362
- console.error(`Batch transfer at ${error.index} already exists.`);
363
+ const transfers_results = await client.createTransfers(batch);
364
+ for (let i = 0; i < transfers_results.length; i++) {
365
+ switch (transfers_results[i].status) {
366
+ case CreateTransferStatus.created:
367
+ console.error(`Batch transfer at ${i} successfully created with timestamp ${transfers_results[i].timestamp}.`);
368
+ break;
369
+ case CreateTransferStatus.exists:
370
+ console.error(`Batch transfer at ${i} already exists with timestamp ${transfers_results[i].timestamp}.`);
363
371
  break;
364
372
  default:
365
- console.error(
366
- `Batch transfer at ${error.index} failed to create: ${
367
- CreateTransferError[error.result]
368
- }.`,
369
- );
373
+ console.error(`Batch transfer at ${i} failed to create: ${transfers_results[i].status}`);
374
+ break;
370
375
  }
371
376
  }
372
377
  ```
@@ -380,32 +385,26 @@ the `CreateTransferError` object for a human-readable string.
380
385
 
381
386
  TigerBeetle performance is maximized when you batch
382
387
  API requests.
388
+
383
389
  A client instance shared across multiple threads/tasks can automatically
384
390
  batch concurrent requests, but the application must still send as many events
385
391
  as possible in a single call.
392
+
386
393
  For example, if you insert 1 million transfers sequentially, one at a time,
387
394
  the insert rate will be a *fraction* of the potential, because the client will
388
395
  wait for a reply between each one.
389
-
390
- ```javascript
391
- const batch = []; // Array of transfer to create.
392
- for (let i = 0; i < batch.len; i++) {
393
- const transfer_errors = await client.createTransfers(batch[i]);
394
- // Error handling omitted.
395
- }
396
- ```
397
-
398
396
  Instead, **always batch as much as you can**.
397
+
399
398
  The maximum batch size is set in the TigerBeetle server. The default is 8189.
400
399
 
401
400
  ```javascript
402
401
  const batch = []; // Array of transfer to create.
403
402
  const BATCH_SIZE = 8189;
404
403
  for (let i = 0; i < batch.length; i += BATCH_SIZE) {
405
- const transfer_errors = await client.createTransfers(
404
+ const transfers_results = await client.createTransfers(
406
405
  batch.slice(i, Math.min(batch.length, BATCH_SIZE)),
407
406
  );
408
- // Error handling omitted.
407
+ // Results handling omitted.
409
408
  }
410
409
  ```
411
410
 
@@ -467,8 +466,8 @@ const transfer1 = {
467
466
  };
468
467
 
469
468
  // Create the transfer
470
- const transfer_errors = await client.createTransfers([transfer0, transfer1]);
471
- // Error handling omitted.
469
+ const transfers_results = await client.createTransfers([transfer0, transfer1]);
470
+ // Results handling omitted.
472
471
  ```
473
472
 
474
473
  ### Two-Phase Transfers
@@ -504,8 +503,8 @@ const transfer0 = {
504
503
  timestamp: 0n,
505
504
  };
506
505
 
507
- let transfer_errors = await client.createTransfers([transfer0]);
508
- // Error handling omitted.
506
+ let transfers_results = await client.createTransfers([transfer0]);
507
+ // Results handling omitted.
509
508
 
510
509
  const transfer1 = {
511
510
  id: 7n,
@@ -524,8 +523,8 @@ const transfer1 = {
524
523
  timestamp: 0n,
525
524
  };
526
525
 
527
- transfer_errors = await client.createTransfers([transfer1]);
528
- // Error handling omitted.
526
+ transfers_results = await client.createTransfers([transfer1]);
527
+ // Results handling omitted.
529
528
  ```
530
529
 
531
530
  #### Void a Pending Transfer
@@ -553,8 +552,8 @@ const transfer0 = {
553
552
  timestamp: 0n,
554
553
  };
555
554
 
556
- let transfer_errors = await client.createTransfers([transfer0]);
557
- // Error handling omitted.
555
+ let transfers_results = await client.createTransfers([transfer0]);
556
+ // Results handling omitted.
558
557
 
559
558
  const transfer1 = {
560
559
  id: 9n,
@@ -572,8 +571,8 @@ const transfer1 = {
572
571
  timestamp: 0n,
573
572
  };
574
573
 
575
- transfer_errors = await client.createTransfers([transfer1]);
576
- // Error handling omitted.
574
+ transfers_results = await client.createTransfers([transfer1]);
575
+ // Results handling omitted.
577
576
  ```
578
577
 
579
578
  ## Transfer Lookup
@@ -752,8 +751,8 @@ batch.push({ id: 3n, /* ..., */ flags: 0 });
752
751
  batch.push({ id: 3n, /* ..., */ flags: linkedFlag });
753
752
  batch.push({ id: 4n, /* ..., */ flags: 0 });
754
753
 
755
- const transfer_errors = await client.createTransfers(batch);
756
- // Error handling omitted.
754
+ const transfers_results = await client.createTransfers(batch);
755
+ // Results handling omitted.
757
756
  ```
758
757
 
759
758
  ## Imported Events
@@ -794,8 +793,8 @@ for (let index = 0; i < historical_accounts.length; i++) {
794
793
  accounts.push(account);
795
794
  }
796
795
 
797
- const account_errors = await client.createAccounts(accounts);
798
- // Error handling omitted.
796
+ const account_results = await client.createAccounts(accounts);
797
+ // Results handling omitted.
799
798
 
800
799
  // Then, load and import all transfers with their timestamps from the historical source.
801
800
  const transfers = [];
@@ -815,8 +814,8 @@ for (let index = 0; i < historical_transfers.length; i++) {
815
814
  transfers.push(transfer);
816
815
  }
817
816
 
818
- const transfer_errors = await client.createTransfers(transfers);
819
- // Error handling omitted.
817
+ const transfers_results = await client.createTransfers(transfers);
818
+ // Results handling omitted.
820
819
 
821
820
  // Since it is a linked chain, in case of any error the entire batch is rolled back and can be retried
822
821
  // with the same historical timestamps without regressing the cluster timestamp.
package/dist/benchmark.js CHANGED
@@ -99,16 +99,16 @@ const runBenchmark = async () => {
99
99
  const start = Date.now();
100
100
  for (let i = 0; i < transfers.length; i++) {
101
101
  const ms1 = Date.now();
102
- const transferErrors = await client.createTransfers(transfers[i]);
103
- (0, assert_1.default)(transferErrors.length === 0);
102
+ const transferResults = await client.createTransfers(transfers[i]);
103
+ (0, assert_1.default)(transferResults.length === transfers[i].length);
104
104
  const ms2 = Date.now();
105
105
  const createTransferLatency = ms2 - ms1;
106
106
  if (createTransferLatency > maxCreateTransfersLatency) {
107
107
  maxCreateTransfersLatency = createTransferLatency;
108
108
  }
109
109
  if (IS_TWO_PHASE_TRANSFER) {
110
- const commitErrors = await client.createTransfers(posts[i]);
111
- (0, assert_1.default)(commitErrors.length === 0);
110
+ const postTransferResults = await client.createTransfers(posts[i]);
111
+ (0, assert_1.default)(postTransferResults.length === posts[i].length);
112
112
  const ms3 = Date.now();
113
113
  const commitTransferLatency = ms3 - ms2;
114
114
  if (commitTransferLatency > maxCommitTransfersLatency) {
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert'\nimport {\n Account,\n createClient,\n Transfer,\n TransferFlags,\n} from '.'\n\nconst MAX_TRANSFERS = 51200\n// CI runs benchmark.ts against a \"--development\" replica.\nconst MAX_REQUEST_BATCH_SIZE = 253\nconst IS_TWO_PHASE_TRANSFER = false\n\nconst client = createClient({\n cluster_id: 0n,\n replica_addresses: [process.env.TB_ADDRESS || '3000']\n})\n\nconst TRANSFER_SIZE = 128\nconst accountA: Account = {\n id: 137n,\n debits_pending: 0n,\n debits_posted: 0n,\n credits_pending: 0n,\n credits_posted: 0n,\n user_data_128: 0n,\n user_data_64: 0n,\n user_data_32: 0,\n reserved: 0,\n ledger: 1,\n code: 1,\n flags: 0,\n timestamp: 0n,\n}\n\nconst accountB: Account = {\n id: 138n,\n debits_pending: 0n,\n debits_posted: 0n,\n credits_pending: 0n,\n credits_posted: 0n,\n user_data_128: 0n,\n user_data_64: 0n,\n user_data_32: 0,\n reserved: 0,\n ledger: 1,\n code: 1,\n flags: 0,\n timestamp: 0n,\n}\n\nconst runBenchmark = async () => {\n console.log(`pre-allocating ${MAX_TRANSFERS} transfers and posts...`)\n const transfers: Transfer[][] = []\n const posts: Transfer[][] = []\n\n let count = 0\n while (count < MAX_TRANSFERS) {\n const pendingBatch: Transfer[] = []\n const postBatch: Transfer[] = []\n for (let i = 0; i < MAX_REQUEST_BATCH_SIZE; i++) {\n if (count === MAX_TRANSFERS) break\n\n count += 1\n pendingBatch.push({\n id: BigInt(count),\n debit_account_id: accountA.id,\n credit_account_id: accountB.id,\n amount: 1n,\n pending_id: 0n,\n user_data_128: 0n,\n user_data_64: 0n,\n user_data_32: 0,\n timeout: IS_TWO_PHASE_TRANSFER ? 2 : 0,\n code: 1,\n ledger: 1,\n flags: IS_TWO_PHASE_TRANSFER ? TransferFlags.pending : 0,\n timestamp: 0n,\n })\n\n if (IS_TWO_PHASE_TRANSFER) {\n postBatch.push({\n id: BigInt(MAX_TRANSFERS + count),\n debit_account_id: accountA.id,\n credit_account_id: accountB.id,\n amount: 1n,\n pending_id: BigInt(count),\n user_data_128: 0n,\n user_data_64: 0n,\n user_data_32: 0,\n timeout: 0,\n code: 1,\n ledger: 1,\n flags: IS_TWO_PHASE_TRANSFER ? TransferFlags.post_pending_transfer : 0,\n timestamp: 0n,\n })\n }\n }\n\n transfers.push(pendingBatch)\n if (IS_TWO_PHASE_TRANSFER) posts.push(postBatch)\n }\n assert(count === MAX_TRANSFERS)\n\n console.log(`starting benchmark. MAX_TRANSFERS=${MAX_TRANSFERS} REQUEST_BATCH_SIZE=${MAX_REQUEST_BATCH_SIZE} NUMBER_OF_BATCHES=${transfers.length}`)\n let maxCreateTransfersLatency = 0\n let maxCommitTransfersLatency = 0\n const start = Date.now()\n\n for (let i = 0; i < transfers.length; i++) {\n const ms1 = Date.now()\n\n const transferErrors = await client.createTransfers(transfers[i])\n assert(transferErrors.length === 0)\n\n const ms2 = Date.now()\n const createTransferLatency = ms2 - ms1\n if (createTransferLatency > maxCreateTransfersLatency) {\n maxCreateTransfersLatency = createTransferLatency\n }\n\n if (IS_TWO_PHASE_TRANSFER) {\n const commitErrors = await client.createTransfers(posts[i])\n assert(commitErrors.length === 0)\n\n const ms3 = Date.now()\n const commitTransferLatency = ms3 - ms2\n if (commitTransferLatency > maxCommitTransfersLatency) {\n maxCommitTransfersLatency = commitTransferLatency\n }\n }\n }\n\n const ms = Date.now() - start\n\n return {\n ms,\n maxCommitTransfersLatency,\n maxCreateTransfersLatency\n }\n}\n\nconst main = async () => {\n console.log(\"creating the accounts...\")\n await client.createAccounts([accountA, accountB])\n const accountResults = await client.lookupAccounts([accountA.id, accountB.id])\n assert(accountResults.length === 2)\n assert(accountResults[0].debits_posted === 0n)\n assert(accountResults[1].debits_posted === 0n)\n\n const benchmark = await runBenchmark()\n\n const accounts = await client.lookupAccounts([accountA.id, accountB.id])\n const result = Math.floor((1000 * MAX_TRANSFERS)/benchmark.ms)\n console.log(\"=============================\")\n console.log(`${IS_TWO_PHASE_TRANSFER ? 'two-phase ' : ''}transfers per second: ${result}`)\n console.log(`create transfers max p100 latency per 10 000 transfers = ${benchmark.maxCreateTransfersLatency}ms`)\n console.log(`commit transfers max p100 latency per 10 000 transfers = ${benchmark.maxCommitTransfersLatency}ms`)\n assert(accounts.length === 2)\n assert(accounts[0].debits_posted === BigInt(MAX_TRANSFERS))\n assert(accounts[1].credits_posted === BigInt(MAX_TRANSFERS))\n}\n\nmain().catch(error => {\n console.log(error)\n}).finally(async () => {\n await client.destroy()\n})\n"]}
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert'\nimport {\n Account,\n createClient,\n Transfer,\n TransferFlags,\n} from '.'\n\nconst MAX_TRANSFERS = 51200\n// CI runs benchmark.ts against a \"--development\" replica.\nconst MAX_REQUEST_BATCH_SIZE = 253\nconst IS_TWO_PHASE_TRANSFER = false\n\nconst client = createClient({\n cluster_id: 0n,\n replica_addresses: [process.env.TB_ADDRESS || '3000']\n})\n\nconst TRANSFER_SIZE = 128\nconst accountA: Account = {\n id: 137n,\n debits_pending: 0n,\n debits_posted: 0n,\n credits_pending: 0n,\n credits_posted: 0n,\n user_data_128: 0n,\n user_data_64: 0n,\n user_data_32: 0,\n reserved: 0,\n ledger: 1,\n code: 1,\n flags: 0,\n timestamp: 0n,\n}\n\nconst accountB: Account = {\n id: 138n,\n debits_pending: 0n,\n debits_posted: 0n,\n credits_pending: 0n,\n credits_posted: 0n,\n user_data_128: 0n,\n user_data_64: 0n,\n user_data_32: 0,\n reserved: 0,\n ledger: 1,\n code: 1,\n flags: 0,\n timestamp: 0n,\n}\n\nconst runBenchmark = async () => {\n console.log(`pre-allocating ${MAX_TRANSFERS} transfers and posts...`)\n const transfers: Transfer[][] = []\n const posts: Transfer[][] = []\n\n let count = 0\n while (count < MAX_TRANSFERS) {\n const pendingBatch: Transfer[] = []\n const postBatch: Transfer[] = []\n for (let i = 0; i < MAX_REQUEST_BATCH_SIZE; i++) {\n if (count === MAX_TRANSFERS) break\n\n count += 1\n pendingBatch.push({\n id: BigInt(count),\n debit_account_id: accountA.id,\n credit_account_id: accountB.id,\n amount: 1n,\n pending_id: 0n,\n user_data_128: 0n,\n user_data_64: 0n,\n user_data_32: 0,\n timeout: IS_TWO_PHASE_TRANSFER ? 2 : 0,\n code: 1,\n ledger: 1,\n flags: IS_TWO_PHASE_TRANSFER ? TransferFlags.pending : 0,\n timestamp: 0n,\n })\n\n if (IS_TWO_PHASE_TRANSFER) {\n postBatch.push({\n id: BigInt(MAX_TRANSFERS + count),\n debit_account_id: accountA.id,\n credit_account_id: accountB.id,\n amount: 1n,\n pending_id: BigInt(count),\n user_data_128: 0n,\n user_data_64: 0n,\n user_data_32: 0,\n timeout: 0,\n code: 1,\n ledger: 1,\n flags: IS_TWO_PHASE_TRANSFER ? TransferFlags.post_pending_transfer : 0,\n timestamp: 0n,\n })\n }\n }\n\n transfers.push(pendingBatch)\n if (IS_TWO_PHASE_TRANSFER) posts.push(postBatch)\n }\n assert(count === MAX_TRANSFERS)\n\n console.log(`starting benchmark. MAX_TRANSFERS=${MAX_TRANSFERS} REQUEST_BATCH_SIZE=${MAX_REQUEST_BATCH_SIZE} NUMBER_OF_BATCHES=${transfers.length}`)\n let maxCreateTransfersLatency = 0\n let maxCommitTransfersLatency = 0\n const start = Date.now()\n\n for (let i = 0; i < transfers.length; i++) {\n const ms1 = Date.now()\n\n const transferResults = await client.createTransfers(transfers[i])\n assert(transferResults.length === transfers[i].length)\n\n const ms2 = Date.now()\n const createTransferLatency = ms2 - ms1\n if (createTransferLatency > maxCreateTransfersLatency) {\n maxCreateTransfersLatency = createTransferLatency\n }\n\n if (IS_TWO_PHASE_TRANSFER) {\n const postTransferResults = await client.createTransfers(posts[i])\n assert(postTransferResults.length === posts[i].length)\n\n const ms3 = Date.now()\n const commitTransferLatency = ms3 - ms2\n if (commitTransferLatency > maxCommitTransfersLatency) {\n maxCommitTransfersLatency = commitTransferLatency\n }\n }\n }\n\n const ms = Date.now() - start\n\n return {\n ms,\n maxCommitTransfersLatency,\n maxCreateTransfersLatency\n }\n}\n\nconst main = async () => {\n console.log(\"creating the accounts...\")\n await client.createAccounts([accountA, accountB])\n const accountResults = await client.lookupAccounts([accountA.id, accountB.id])\n assert(accountResults.length === 2)\n assert(accountResults[0].debits_posted === 0n)\n assert(accountResults[1].debits_posted === 0n)\n\n const benchmark = await runBenchmark()\n\n const accounts = await client.lookupAccounts([accountA.id, accountB.id])\n const result = Math.floor((1000 * MAX_TRANSFERS)/benchmark.ms)\n console.log(\"=============================\")\n console.log(`${IS_TWO_PHASE_TRANSFER ? 'two-phase ' : ''}transfers per second: ${result}`)\n console.log(`create transfers max p100 latency per 10 000 transfers = ${benchmark.maxCreateTransfersLatency}ms`)\n console.log(`commit transfers max p100 latency per 10 000 transfers = ${benchmark.maxCommitTransfersLatency}ms`)\n assert(accounts.length === 2)\n assert(accounts[0].debits_posted === BigInt(MAX_TRANSFERS))\n assert(accounts[1].credits_posted === BigInt(MAX_TRANSFERS))\n}\n\nmain().catch(error => {\n console.log(error)\n}).finally(async () => {\n await client.destroy()\n})\n"]}
Binary file
Binary file
Binary file
@@ -59,8 +59,8 @@ export type Transfer = {
59
59
  flags: number;
60
60
  timestamp: bigint;
61
61
  };
62
- export declare enum CreateAccountError {
63
- ok = 0,
62
+ export declare enum CreateAccountStatus {
63
+ created = 4294967295,
64
64
  linked_event_failed = 1,
65
65
  linked_event_chain_open = 2,
66
66
  imported_event_expected = 22,
@@ -88,8 +88,8 @@ export declare enum CreateAccountError {
88
88
  code_must_not_be_zero = 14,
89
89
  imported_event_timestamp_must_not_regress = 26
90
90
  }
91
- export declare enum CreateTransferError {
92
- ok = 0,
91
+ export declare enum CreateTransferStatus {
92
+ created = 4294967295,
93
93
  linked_event_failed = 1,
94
94
  linked_event_chain_open = 2,
95
95
  imported_event_expected = 56,
@@ -158,13 +158,13 @@ export declare enum CreateTransferError {
158
158
  exceeds_credits = 54,
159
159
  exceeds_debits = 55
160
160
  }
161
- export type CreateAccountsError = {
162
- index: number;
163
- result: CreateAccountError;
161
+ export type CreateAccountResult = {
162
+ timestamp: bigint;
163
+ status: CreateAccountStatus;
164
164
  };
165
- export type CreateTransfersError = {
166
- index: number;
167
- result: CreateTransferError;
165
+ export type CreateTransferResult = {
166
+ timestamp: bigint;
167
+ status: CreateTransferStatus;
168
168
  };
169
169
  export type AccountFilter = {
170
170
  account_id: bigint;
@@ -198,12 +198,12 @@ export type AccountBalance = {
198
198
  export declare enum Operation {
199
199
  pulse = 128,
200
200
  get_change_events = 137,
201
- create_accounts = 138,
202
- create_transfers = 139,
203
201
  lookup_accounts = 140,
204
202
  lookup_transfers = 141,
205
203
  get_account_transfers = 142,
206
204
  get_account_balances = 143,
207
205
  query_accounts = 144,
208
- query_transfers = 145
206
+ query_transfers = 145,
207
+ create_accounts = 146,
208
+ create_transfers = 147
209
209
  }