tigerbeetle-node 0.11.8 → 0.11.10

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.
Files changed (85) hide show
  1. package/dist/.client.node.sha256 +1 -1
  2. package/package.json +4 -3
  3. package/scripts/build_lib.sh +41 -0
  4. package/src/node.zig +1 -1
  5. package/src/tigerbeetle/scripts/validate_docs.sh +7 -1
  6. package/src/tigerbeetle/src/benchmark.zig +3 -3
  7. package/src/tigerbeetle/src/config.zig +31 -16
  8. package/src/tigerbeetle/src/constants.zig +48 -9
  9. package/src/tigerbeetle/src/ewah.zig +5 -5
  10. package/src/tigerbeetle/src/ewah_fuzz.zig +1 -1
  11. package/src/tigerbeetle/src/lsm/binary_search.zig +1 -1
  12. package/src/tigerbeetle/src/lsm/bloom_filter.zig +1 -1
  13. package/src/tigerbeetle/src/lsm/compaction.zig +34 -21
  14. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +84 -104
  15. package/src/tigerbeetle/src/lsm/grid.zig +19 -13
  16. package/src/tigerbeetle/src/lsm/manifest_log.zig +8 -10
  17. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +18 -13
  18. package/src/tigerbeetle/src/lsm/merge_iterator.zig +1 -1
  19. package/src/tigerbeetle/src/lsm/segmented_array.zig +17 -17
  20. package/src/tigerbeetle/src/lsm/segmented_array_fuzz.zig +1 -1
  21. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +1 -1
  22. package/src/tigerbeetle/src/lsm/table.zig +8 -20
  23. package/src/tigerbeetle/src/lsm/table_immutable.zig +1 -1
  24. package/src/tigerbeetle/src/lsm/table_iterator.zig +3 -3
  25. package/src/tigerbeetle/src/lsm/table_mutable.zig +14 -2
  26. package/src/tigerbeetle/src/lsm/test.zig +5 -4
  27. package/src/tigerbeetle/src/lsm/tree.zig +1 -2
  28. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +85 -115
  29. package/src/tigerbeetle/src/message_bus.zig +4 -4
  30. package/src/tigerbeetle/src/message_pool.zig +7 -10
  31. package/src/tigerbeetle/src/ring_buffer.zig +22 -12
  32. package/src/tigerbeetle/src/simulator.zig +366 -239
  33. package/src/tigerbeetle/src/state_machine/auditor.zig +5 -5
  34. package/src/tigerbeetle/src/state_machine/workload.zig +3 -3
  35. package/src/tigerbeetle/src/state_machine.zig +190 -178
  36. package/src/tigerbeetle/src/{util.zig → stdx.zig} +2 -0
  37. package/src/tigerbeetle/src/storage.zig +13 -6
  38. package/src/tigerbeetle/src/{test → testing/cluster}/message_bus.zig +3 -3
  39. package/src/tigerbeetle/src/{test → testing/cluster}/network.zig +46 -22
  40. package/src/tigerbeetle/src/testing/cluster/state_checker.zig +169 -0
  41. package/src/tigerbeetle/src/testing/cluster/storage_checker.zig +202 -0
  42. package/src/tigerbeetle/src/testing/cluster.zig +443 -0
  43. package/src/tigerbeetle/src/{test → testing}/fuzz.zig +0 -0
  44. package/src/tigerbeetle/src/testing/hash_log.zig +66 -0
  45. package/src/tigerbeetle/src/{test → testing}/id.zig +0 -0
  46. package/src/tigerbeetle/src/testing/packet_simulator.zig +365 -0
  47. package/src/tigerbeetle/src/{test → testing}/priority_queue.zig +1 -1
  48. package/src/tigerbeetle/src/testing/reply_sequence.zig +139 -0
  49. package/src/tigerbeetle/src/{test → testing}/state_machine.zig +3 -1
  50. package/src/tigerbeetle/src/testing/storage.zig +757 -0
  51. package/src/tigerbeetle/src/{test → testing}/table.zig +21 -0
  52. package/src/tigerbeetle/src/{test → testing}/time.zig +0 -0
  53. package/src/tigerbeetle/src/tigerbeetle.zig +2 -0
  54. package/src/tigerbeetle/src/tracer.zig +3 -3
  55. package/src/tigerbeetle/src/unit_tests.zig +4 -4
  56. package/src/tigerbeetle/src/vopr.zig +2 -2
  57. package/src/tigerbeetle/src/vsr/client.zig +5 -2
  58. package/src/tigerbeetle/src/vsr/clock.zig +93 -53
  59. package/src/tigerbeetle/src/vsr/journal.zig +109 -98
  60. package/src/tigerbeetle/src/vsr/journal_format_fuzz.zig +2 -2
  61. package/src/tigerbeetle/src/vsr/replica.zig +1983 -1430
  62. package/src/tigerbeetle/src/vsr/replica_format.zig +13 -13
  63. package/src/tigerbeetle/src/vsr/superblock.zig +240 -142
  64. package/src/tigerbeetle/src/vsr/superblock_client_table.zig +7 -7
  65. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +1 -1
  66. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +1 -1
  67. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +49 -14
  68. package/src/tigerbeetle/src/vsr/superblock_manifest.zig +38 -19
  69. package/src/tigerbeetle/src/vsr/superblock_quorums.zig +48 -48
  70. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +51 -51
  71. package/src/tigerbeetle/src/vsr.zig +99 -33
  72. package/src/tigerbeetle/src/demo.zig +0 -132
  73. package/src/tigerbeetle/src/demo_01_create_accounts.zig +0 -35
  74. package/src/tigerbeetle/src/demo_02_lookup_accounts.zig +0 -7
  75. package/src/tigerbeetle/src/demo_03_create_transfers.zig +0 -37
  76. package/src/tigerbeetle/src/demo_04_create_pending_transfers.zig +0 -61
  77. package/src/tigerbeetle/src/demo_05_post_pending_transfers.zig +0 -37
  78. package/src/tigerbeetle/src/demo_06_void_pending_transfers.zig +0 -24
  79. package/src/tigerbeetle/src/demo_07_lookup_transfers.zig +0 -7
  80. package/src/tigerbeetle/src/test/cluster.zig +0 -352
  81. package/src/tigerbeetle/src/test/conductor.zig +0 -366
  82. package/src/tigerbeetle/src/test/packet_simulator.zig +0 -398
  83. package/src/tigerbeetle/src/test/state_checker.zig +0 -169
  84. package/src/tigerbeetle/src/test/storage.zig +0 -864
  85. package/src/tigerbeetle/src/test/storage_checker.zig +0 -204
@@ -71,6 +71,8 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
71
71
  };
72
72
 
73
73
  pub const constants = struct {
74
+ pub const message_body_size_max = constants_.message_body_size_max;
75
+
74
76
  /// The maximum number of objects within a batch, by operation.
75
77
  pub const batch_max = struct {
76
78
  pub const create_accounts = operation_batch_max(.create_accounts);
@@ -86,7 +88,7 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
86
88
  }
87
89
 
88
90
  fn operation_batch_max(comptime operation: Operation) usize {
89
- return @divFloor(constants_.message_body_size_max, std.math.max(
91
+ return @divFloor(message_body_size_max, std.math.max(
90
92
  @sizeOf(Event(operation)),
91
93
  @sizeOf(Result(operation)),
92
94
  ));
@@ -185,32 +187,14 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
185
187
  .reserved => unreachable,
186
188
  .root => unreachable,
187
189
  .register => {},
188
- .create_accounts => self.prepare_timestamps(.create_accounts, input),
189
- .create_transfers => self.prepare_timestamps(.create_transfers, input),
190
+ .create_accounts => self.prepare_timestamp += mem.bytesAsSlice(Account, input).len,
191
+ .create_transfers => self.prepare_timestamp += mem.bytesAsSlice(Transfer, input).len,
190
192
  .lookup_accounts => {},
191
193
  .lookup_transfers => {},
192
194
  }
193
195
  return self.prepare_timestamp;
194
196
  }
195
197
 
196
- fn prepare_timestamps(
197
- self: *StateMachine,
198
- comptime operation: Operation,
199
- input: []u8,
200
- ) void {
201
- var sum_reserved_timestamps: usize = 0;
202
- var events = mem.bytesAsSlice(Event(operation), input);
203
- for (events) |*event| {
204
- sum_reserved_timestamps += event.timestamp;
205
- self.prepare_timestamp += 1;
206
- event.timestamp = self.prepare_timestamp;
207
- }
208
- // The client is responsible for ensuring that timestamps are reserved:
209
- // Use a single branch condition to detect non-zero reserved timestamps.
210
- // Summing then branching once is faster than branching every iteration of the loop.
211
- assert(sum_reserved_timestamps == 0);
212
- }
213
-
214
198
  pub fn prefetch(
215
199
  self: *StateMachine,
216
200
  callback: fn (*StateMachine) void,
@@ -222,6 +206,8 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
222
206
  assert(self.prefetch_input == null);
223
207
  assert(self.prefetch_callback == null);
224
208
 
209
+ // NOTE: prefetch(.register)'s callback should end up calling commit()
210
+ // (which is always async) instead of recursing, so this inline callback is fine.
225
211
  if (operation == .register) {
226
212
  callback(self);
227
213
  return;
@@ -384,12 +370,14 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
384
370
  self: *StateMachine,
385
371
  client: u128,
386
372
  op: u64,
373
+ timestamp: u64,
387
374
  operation: Operation,
388
375
  input: []align(16) const u8,
389
- output: []align(16) u8,
376
+ output: *align(16) [constants.message_body_size_max]u8,
390
377
  ) usize {
391
378
  _ = client;
392
379
  assert(op != 0);
380
+ assert(timestamp > self.commit_timestamp);
393
381
 
394
382
  tracer.start(
395
383
  &self.tracer_slot,
@@ -401,8 +389,8 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
401
389
  const result = switch (operation) {
402
390
  .root => unreachable,
403
391
  .register => 0,
404
- .create_accounts => self.execute(.create_accounts, input, output),
405
- .create_transfers => self.execute(.create_transfers, input, output),
392
+ .create_accounts => self.execute(.create_accounts, timestamp, input, output),
393
+ .create_transfers => self.execute(.create_transfers, timestamp, input, output),
406
394
  .lookup_accounts => self.execute_lookup_accounts(input, output),
407
395
  .lookup_transfers => self.execute_lookup_transfers(input, output),
408
396
  else => unreachable,
@@ -464,8 +452,9 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
464
452
  fn execute(
465
453
  self: *StateMachine,
466
454
  comptime operation: Operation,
455
+ timestamp: u64,
467
456
  input: []align(16) const u8,
468
- output: []align(16) u8,
457
+ output: *align(16) [constants.message_body_size_max]u8,
469
458
  ) usize {
470
459
  comptime assert(operation != .lookup_accounts and operation != .lookup_transfers);
471
460
 
@@ -476,7 +465,9 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
476
465
  var chain: ?usize = null;
477
466
  var chain_broken = false;
478
467
 
479
- for (events) |*event, index| {
468
+ for (events) |*event_, index| {
469
+ var event = event_.*;
470
+
480
471
  const result = blk: {
481
472
  if (event.flags.linked) {
482
473
  if (chain == null) {
@@ -487,9 +478,14 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
487
478
  if (index == events.len - 1) break :blk .linked_event_chain_open;
488
479
  }
489
480
 
490
- break :blk if (chain_broken) .linked_event_failed else switch (operation) {
491
- .create_accounts => self.create_account(event),
492
- .create_transfers => self.create_transfer(event),
481
+ if (chain_broken) break :blk .linked_event_failed;
482
+ if (event.timestamp != 0) break :blk .timestamp_must_be_zero;
483
+
484
+ event.timestamp = timestamp - events.len + index + 1;
485
+
486
+ break :blk switch (operation) {
487
+ .create_accounts => self.create_account(&event),
488
+ .create_transfers => self.create_transfer(&event),
493
489
  else => unreachable,
494
490
  };
495
491
  };
@@ -571,7 +567,11 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
571
567
  }
572
568
 
573
569
  // Accounts that do not fit in the response are omitted.
574
- fn execute_lookup_accounts(self: *StateMachine, input: []const u8, output: []u8) usize {
570
+ fn execute_lookup_accounts(
571
+ self: *StateMachine,
572
+ input: []const u8,
573
+ output: *align(16) [constants.message_body_size_max]u8,
574
+ ) usize {
575
575
  const batch = mem.bytesAsSlice(u128, input);
576
576
  const output_len = @divFloor(output.len, @sizeOf(Account)) * @sizeOf(Account);
577
577
  const results = mem.bytesAsSlice(Account, output[0..output_len]);
@@ -586,7 +586,11 @@ pub fn StateMachineType(comptime Storage: type, comptime constants_: struct {
586
586
  }
587
587
 
588
588
  // Transfers that do not fit in the response are omitted.
589
- fn execute_lookup_transfers(self: *StateMachine, input: []const u8, output: []u8) usize {
589
+ fn execute_lookup_transfers(
590
+ self: *StateMachine,
591
+ input: []const u8,
592
+ output: *align(16) [constants.message_body_size_max]u8,
593
+ ) usize {
590
594
  const batch = mem.bytesAsSlice(u128, input);
591
595
  const output_len = @divFloor(output.len, @sizeOf(Transfer)) * @sizeOf(Transfer);
592
596
  const results = mem.bytesAsSlice(Transfer, output[0..output_len]);
@@ -1111,7 +1115,7 @@ test "sum_overflows" {
1111
1115
  }
1112
1116
 
1113
1117
  const TestContext = struct {
1114
- const Storage = @import("test/storage.zig").Storage;
1118
+ const Storage = @import("testing/storage.zig").Storage;
1115
1119
  const MessagePool = @import("message_pool.zig").MessagePool;
1116
1120
  const data_file_size_min = @import("vsr/superblock.zig").data_file_size_min;
1117
1121
  const SuperBlock = @import("vsr/superblock.zig").SuperBlockType(Storage);
@@ -1221,6 +1225,7 @@ const TestCreateAccount = struct {
1221
1225
  debits_posted: u64 = 0,
1222
1226
  credits_pending: u64 = 0,
1223
1227
  credits_posted: u64 = 0,
1228
+ timestamp: u64 = 0,
1224
1229
  result: CreateAccountResult,
1225
1230
 
1226
1231
  fn event(a: TestCreateAccount) Account {
@@ -1243,7 +1248,7 @@ const TestCreateAccount = struct {
1243
1248
  .debits_posted = a.debits_posted,
1244
1249
  .credits_pending = a.credits_pending,
1245
1250
  .credits_posted = a.credits_posted,
1246
- .timestamp = 0,
1251
+ .timestamp = a.timestamp,
1247
1252
  };
1248
1253
  }
1249
1254
  };
@@ -1264,6 +1269,7 @@ const TestCreateTransfer = struct {
1264
1269
  flags_void_pending_transfer: ?enum { VOI } = null,
1265
1270
  flags_padding: u12 = 0,
1266
1271
  amount: u64 = 0,
1272
+ timestamp: u64 = 0,
1267
1273
  result: CreateTransferResult,
1268
1274
 
1269
1275
  fn event(t: TestCreateTransfer) Transfer {
@@ -1285,7 +1291,7 @@ const TestCreateTransfer = struct {
1285
1291
  .padding = t.flags_padding,
1286
1292
  },
1287
1293
  .amount = t.amount,
1288
- .timestamp = 0,
1294
+ .timestamp = t.timestamp,
1289
1295
  };
1290
1296
  }
1291
1297
  };
@@ -1295,7 +1301,7 @@ fn check(comptime test_table: []const u8) !void {
1295
1301
  // `test_actions.constSlice()`. Most likely a comptime bug that will be resolved by 0.10.
1296
1302
  if (@import("builtin").os.tag == .macos) return;
1297
1303
 
1298
- const parse_table = @import("test/table.zig").parse;
1304
+ const parse_table = @import("testing/table.zig").parse;
1299
1305
  const allocator = std.testing.allocator;
1300
1306
 
1301
1307
  var context: TestContext = undefined;
@@ -1389,7 +1395,9 @@ fn check(comptime test_table: []const u8) !void {
1389
1395
 
1390
1396
  .commit => |commit_operation| {
1391
1397
  assert(operation == null or operation.? == commit_operation);
1392
- _ = context.state_machine.prepare(commit_operation, request.items);
1398
+
1399
+ context.state_machine.prepare_timestamp += 1;
1400
+ const timestamp = context.state_machine.prepare(commit_operation, request.items);
1393
1401
 
1394
1402
  const reply_actual_buffer = try allocator.alignedAlloc(u8, 16, 4096);
1395
1403
  defer allocator.free(reply_actual_buffer);
@@ -1397,9 +1405,10 @@ fn check(comptime test_table: []const u8) !void {
1397
1405
  const reply_actual_size = context.state_machine.commit(
1398
1406
  0,
1399
1407
  1,
1408
+ timestamp,
1400
1409
  commit_operation,
1401
1410
  request.items,
1402
- reply_actual_buffer,
1411
+ reply_actual_buffer[0..TestContext.message_body_size_max],
1403
1412
  );
1404
1413
  var reply_actual = reply_actual_buffer[0..reply_actual_size];
1405
1414
 
@@ -1454,24 +1463,25 @@ fn print_results(
1454
1463
 
1455
1464
  test "create_accounts" {
1456
1465
  try check(
1457
- \\ account A1 U2 _ L3 C4 _ _ _ _ 0 0 0 0 ok
1458
- \\ account A0 _ 1 L0 C0 _ D<C C<D 1 1 1 1 1 reserved_flag
1459
- \\ account A0 _ 1 L0 C0 _ D<C C<D _ 1 1 1 1 reserved_field
1460
- \\ account A0 _ _ L0 C0 _ D<C C<D _ 1 1 1 1 id_must_not_be_zero
1461
- \\ account -0 _ _ L0 C0 _ D<C C<D _ 1 1 1 1 id_must_not_be_int_max
1462
- \\ account A1 U1 _ L0 C0 _ D<C C<D _ 1 1 1 1 ledger_must_not_be_zero
1463
- \\ account A1 U1 _ L9 C0 _ D<C C<D _ 1 1 1 1 code_must_not_be_zero
1464
- \\ account A1 U1 _ L9 C9 _ D<C C<D _ -0 -0 -0 -0 mutually_exclusive_flags
1465
- \\ account A1 U1 _ L9 C9 _ D<C _ _ 1 1 1 1 debits_pending_must_be_zero
1466
- \\ account A1 U1 _ L9 C9 _ D<C _ _ 0 1 1 1 debits_posted_must_be_zero
1467
- \\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 1 1 credits_pending_must_be_zero
1468
- \\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 0 1 credits_posted_must_be_zero
1469
- \\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 0 0 exists_with_different_flags
1470
- \\ account A1 U1 _ L9 C9 _ _ C<D _ 0 0 0 0 exists_with_different_flags
1471
- \\ account A1 U1 _ L9 C9 _ _ _ _ 0 0 0 0 exists_with_different_user_data
1472
- \\ account A1 U2 _ L9 C9 _ _ _ _ 0 0 0 0 exists_with_different_ledger
1473
- \\ account A1 U2 _ L3 C9 _ _ _ _ 0 0 0 0 exists_with_different_code
1474
- \\ account A1 U2 _ L3 C4 _ _ _ _ 0 0 0 0 exists
1466
+ \\ account A1 U2 _ L3 C4 _ _ _ _ 0 0 0 0 _ ok
1467
+ \\ account A0 _ 1 L0 C0 _ D<C C<D 1 1 1 1 1 1 timestamp_must_be_zero
1468
+ \\ account A0 _ 1 L0 C0 _ D<C C<D 1 1 1 1 1 _ reserved_flag
1469
+ \\ account A0 _ 1 L0 C0 _ D<C C<D _ 1 1 1 1 _ reserved_field
1470
+ \\ account A0 _ _ L0 C0 _ D<C C<D _ 1 1 1 1 _ id_must_not_be_zero
1471
+ \\ account -0 _ _ L0 C0 _ D<C C<D _ 1 1 1 1 _ id_must_not_be_int_max
1472
+ \\ account A1 U1 _ L0 C0 _ D<C C<D _ 1 1 1 1 _ ledger_must_not_be_zero
1473
+ \\ account A1 U1 _ L9 C0 _ D<C C<D _ 1 1 1 1 _ code_must_not_be_zero
1474
+ \\ account A1 U1 _ L9 C9 _ D<C C<D _ -0 -0 -0 -0 _ mutually_exclusive_flags
1475
+ \\ account A1 U1 _ L9 C9 _ D<C _ _ 1 1 1 1 _ debits_pending_must_be_zero
1476
+ \\ account A1 U1 _ L9 C9 _ D<C _ _ 0 1 1 1 _ debits_posted_must_be_zero
1477
+ \\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 1 1 _ credits_pending_must_be_zero
1478
+ \\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 0 1 _ credits_posted_must_be_zero
1479
+ \\ account A1 U1 _ L9 C9 _ D<C _ _ 0 0 0 0 _ exists_with_different_flags
1480
+ \\ account A1 U1 _ L9 C9 _ _ C<D _ 0 0 0 0 _ exists_with_different_flags
1481
+ \\ account A1 U1 _ L9 C9 _ _ _ _ 0 0 0 0 _ exists_with_different_user_data
1482
+ \\ account A1 U2 _ L9 C9 _ _ _ _ 0 0 0 0 _ exists_with_different_ledger
1483
+ \\ account A1 U2 _ L3 C9 _ _ _ _ 0 0 0 0 _ exists_with_different_code
1484
+ \\ account A1 U2 _ L3 C4 _ _ _ _ 0 0 0 0 _ exists
1475
1485
  \\ commit create_accounts
1476
1486
  \\
1477
1487
  \\ lookup_account -0 _
@@ -1490,32 +1500,32 @@ test "create_accounts: empty" {
1490
1500
 
1491
1501
  test "linked accounts" {
1492
1502
  try check(
1493
- \\ account A7 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok // An individual event (successful):
1503
+ \\ account A7 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok // An individual event (successful):
1494
1504
 
1495
1505
  // A chain of 4 events (the last event in the chain closes the chain with linked=false):
1496
- \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed // Commit/rollback.
1497
- \\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed // Commit/rollback.
1498
- \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 exists // Fail with .exists.
1499
- \\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 linked_event_failed // Fail without committing.
1506
+ \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed // Commit/rollback.
1507
+ \\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed // Commit/rollback.
1508
+ \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ exists // Fail with .exists.
1509
+ \\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ linked_event_failed // Fail without committing.
1500
1510
 
1501
1511
  // An individual event (successful):
1502
1512
  // This does not see any effect from the failed chain above.
1503
- \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1513
+ \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1504
1514
 
1505
1515
  // A chain of 2 events (the first event fails the chain):
1506
- \\ account A1 _ _ L1 C2 LNK _ _ _ 0 0 0 0 exists_with_different_flags
1507
- \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 linked_event_failed
1516
+ \\ account A1 _ _ L1 C2 LNK _ _ _ 0 0 0 0 _ exists_with_different_flags
1517
+ \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ linked_event_failed
1508
1518
 
1509
1519
  // An individual event (successful):
1510
- \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1520
+ \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1511
1521
 
1512
1522
  // A chain of 2 events (the last event fails the chain):
1513
- \\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed
1514
- \\ account A1 _ _ L2 C1 _ _ _ _ 0 0 0 0 exists_with_different_ledger
1523
+ \\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed
1524
+ \\ account A1 _ _ L2 C1 _ _ _ _ 0 0 0 0 _ exists_with_different_ledger
1515
1525
 
1516
1526
  // A chain of 2 events (successful):
1517
- \\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 ok
1518
- \\ account A4 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1527
+ \\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ ok
1528
+ \\ account A4 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1519
1529
  \\ commit create_accounts
1520
1530
  \\
1521
1531
  \\ lookup_account A7 0 0 0 0
@@ -1527,13 +1537,13 @@ test "linked accounts" {
1527
1537
  );
1528
1538
 
1529
1539
  try check(
1530
- \\ account A7 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok // An individual event (successful):
1540
+ \\ account A7 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok // An individual event (successful):
1531
1541
 
1532
1542
  // A chain of 4 events:
1533
- \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed // Commit/rollback.
1534
- \\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed // Commit/rollback.
1535
- \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 exists // Fail with .exists.
1536
- \\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 linked_event_failed // Fail without committing.
1543
+ \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed // Commit/rollback.
1544
+ \\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed // Commit/rollback.
1545
+ \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ exists // Fail with .exists.
1546
+ \\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ linked_event_failed // Fail without committing.
1537
1547
  \\ commit create_accounts
1538
1548
  \\
1539
1549
  \\ lookup_account A7 0 0 0 0
@@ -1550,13 +1560,13 @@ test "linked accounts" {
1550
1560
  test "linked_event_chain_open" {
1551
1561
  try check(
1552
1562
  // A chain of 3 events (the last event in the chain closes the chain with linked=false):
1553
- \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 ok
1554
- \\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 ok
1555
- \\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1563
+ \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ ok
1564
+ \\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ ok
1565
+ \\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1556
1566
 
1557
1567
  // An open chain of 2 events:
1558
- \\ account A4 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed
1559
- \\ account A5 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_chain_open
1568
+ \\ account A4 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed
1569
+ \\ account A5 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_chain_open
1560
1570
  \\ commit create_accounts
1561
1571
  \\
1562
1572
  \\ lookup_account A1 0 0 0 0
@@ -1571,12 +1581,12 @@ test "linked_event_chain_open" {
1571
1581
  test "linked_event_chain_open for an already failed batch" {
1572
1582
  try check(
1573
1583
  // An individual event (successful):
1574
- \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1584
+ \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1575
1585
 
1576
1586
  // An open chain of 3 events (the second one fails):
1577
- \\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_failed
1578
- \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 exists_with_different_flags
1579
- \\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_chain_open
1587
+ \\ account A2 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_failed
1588
+ \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ exists_with_different_flags
1589
+ \\ account A3 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_chain_open
1580
1590
  \\ commit create_accounts
1581
1591
  \\
1582
1592
  \\ lookup_account A1 0 0 0 0
@@ -1588,7 +1598,7 @@ test "linked_event_chain_open for an already failed batch" {
1588
1598
 
1589
1599
  test "linked_event_chain_open for a batch of 1" {
1590
1600
  try check(
1591
- \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 linked_event_chain_open
1601
+ \\ account A1 _ _ L1 C1 LNK _ _ _ 0 0 0 0 _ linked_event_chain_open
1592
1602
  \\ commit create_accounts
1593
1603
  \\
1594
1604
  \\ lookup_account A1 _
@@ -1602,11 +1612,11 @@ test "linked_event_chain_open for a batch of 1" {
1602
1612
  // 3. state machine logic cannot be reordered in any way, breaking determinism.
1603
1613
  test "create_transfers/lookup_transfers" {
1604
1614
  try check(
1605
- \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1606
- \\ account A2 _ _ L2 C2 _ _ _ _ 0 0 0 0 ok
1607
- \\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1608
- \\ account A4 _ _ L1 C1 _ D<C _ _ 0 0 0 0 ok
1609
- \\ account A5 _ _ L1 C1 _ _ C<D _ 0 0 0 0 ok
1615
+ \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1616
+ \\ account A2 _ _ L2 C2 _ _ _ _ 0 0 0 0 _ ok
1617
+ \\ account A3 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1618
+ \\ account A4 _ _ L1 C1 _ D<C _ _ 0 0 0 0 _ ok
1619
+ \\ account A5 _ _ L1 C1 _ _ C<D _ 0 0 0 0 _ ok
1610
1620
  \\ commit create_accounts
1611
1621
 
1612
1622
  // Set up initial balances.
@@ -1617,47 +1627,48 @@ test "create_transfers/lookup_transfers" {
1617
1627
  \\ setup A5 0 -1000 10 -1100
1618
1628
 
1619
1629
  // Test errors by descending precedence.
1620
- \\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ P1 0 reserved_flag
1621
- \\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ _ 0 reserved_field
1622
- \\ transfer T0 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 id_must_not_be_zero
1623
- \\ transfer -0 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 id_must_not_be_int_max
1624
- \\ transfer T1 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 debit_account_id_must_not_be_zero
1625
- \\ transfer T1 -0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 debit_account_id_must_not_be_int_max
1626
- \\ transfer T1 A8 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 credit_account_id_must_not_be_zero
1627
- \\ transfer T1 A8 -0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 credit_account_id_must_not_be_int_max
1628
- \\ transfer T1 A8 A8 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 accounts_must_be_different
1629
- \\ transfer T1 A8 A9 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 pending_id_must_be_zero
1630
- \\ transfer T1 A8 A9 _ _ _ -0 L0 C0 _ _ _ _ _ 0 timeout_reserved_for_pending_transfer
1631
- \\ transfer T1 A8 A9 _ _ _ -0 L0 C0 _ PEN _ _ _ 0 ledger_must_not_be_zero
1632
- \\ transfer T1 A8 A9 _ _ _ -0 L9 C0 _ PEN _ _ _ 0 code_must_not_be_zero
1633
- \\ transfer T1 A8 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 0 amount_must_not_be_zero
1634
- \\ transfer T1 A8 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 9 debit_account_not_found
1635
- \\ transfer T1 A1 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 9 credit_account_not_found
1636
- \\ transfer T1 A1 A2 _ _ _ -0 L9 C1 _ PEN _ _ _ 1 accounts_must_have_the_same_ledger
1637
- \\ transfer T1 A1 A3 _ _ _ -0 L9 C1 _ PEN _ _ _ 1 transfer_must_have_the_same_ledger_as_accounts
1638
- \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -99 overflows_debits_pending // amount = max - A1.debits_pending + 1
1639
- \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -109 overflows_credits_pending // amount = max - A3.credits_pending + 1
1640
- \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -199 overflows_debits_posted // amount = max - A1.debits_posted + 1
1641
- \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -209 overflows_credits_posted // amount = max - A3.credits_posted + 1
1642
- \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -299 overflows_debits // amount = max - A1.debits_pending - A1.debits_posted + 1
1643
- \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -319 overflows_credits // amount = max - A3.credits_pending - A3.credits_posted + 1
1644
- \\ transfer T1 A4 A5 _ _ _ -0 L1 C1 _ PEN _ _ _ 199 overflows_timeout // amount = A4.credits_posted - A4.debits_pending - A4.debits_posted + 1
1645
- \\ transfer T1 A4 A5 _ _ _ _ L1 C1 _ _ _ _ _ 199 exceeds_credits // amount = A4.credits_posted - A4.debits_pending - A4.debits_posted + 1
1646
- \\ transfer T1 A4 A5 _ _ _ _ L1 C1 _ _ _ _ _ 91 exceeds_debits // amount = A5.debits_posted - A5.credits_pending - A5.credits_posted + 1
1647
- \\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ 123 ok
1630
+ \\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ P1 0 1 timestamp_must_be_zero
1631
+ \\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ P1 0 _ reserved_flag
1632
+ \\ transfer T0 A0 A0 _ R1 T1 _ L0 C0 _ PEN _ _ _ 0 _ reserved_field
1633
+ \\ transfer T0 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ id_must_not_be_zero
1634
+ \\ transfer -0 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ id_must_not_be_int_max
1635
+ \\ transfer T1 A0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ debit_account_id_must_not_be_zero
1636
+ \\ transfer T1 -0 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ debit_account_id_must_not_be_int_max
1637
+ \\ transfer T1 A8 A0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ credit_account_id_must_not_be_zero
1638
+ \\ transfer T1 A8 -0 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ credit_account_id_must_not_be_int_max
1639
+ \\ transfer T1 A8 A8 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ accounts_must_be_different
1640
+ \\ transfer T1 A8 A9 _ _ T1 _ L0 C0 _ PEN _ _ _ 0 _ pending_id_must_be_zero
1641
+ \\ transfer T1 A8 A9 _ _ _ -0 L0 C0 _ _ _ _ _ 0 _ timeout_reserved_for_pending_transfer
1642
+ \\ transfer T1 A8 A9 _ _ _ -0 L0 C0 _ PEN _ _ _ 0 _ ledger_must_not_be_zero
1643
+ \\ transfer T1 A8 A9 _ _ _ -0 L9 C0 _ PEN _ _ _ 0 _ code_must_not_be_zero
1644
+ \\ transfer T1 A8 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 0 _ amount_must_not_be_zero
1645
+ \\ transfer T1 A8 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 9 _ debit_account_not_found
1646
+ \\ transfer T1 A1 A9 _ _ _ -0 L9 C1 _ PEN _ _ _ 9 _ credit_account_not_found
1647
+ \\ transfer T1 A1 A2 _ _ _ -0 L9 C1 _ PEN _ _ _ 1 _ accounts_must_have_the_same_ledger
1648
+ \\ transfer T1 A1 A3 _ _ _ -0 L9 C1 _ PEN _ _ _ 1 _ transfer_must_have_the_same_ledger_as_accounts
1649
+ \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -99 _ overflows_debits_pending // amount = max - A1.debits_pending + 1
1650
+ \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -109 _ overflows_credits_pending // amount = max - A3.credits_pending + 1
1651
+ \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -199 _ overflows_debits_posted // amount = max - A1.debits_posted + 1
1652
+ \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -209 _ overflows_credits_posted // amount = max - A3.credits_posted + 1
1653
+ \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -299 _ overflows_debits // amount = max - A1.debits_pending - A1.debits_posted + 1
1654
+ \\ transfer T1 A1 A3 _ _ _ -0 L1 C1 _ PEN _ _ _ -319 _ overflows_credits // amount = max - A3.credits_pending - A3.credits_posted + 1
1655
+ \\ transfer T1 A4 A5 _ _ _ -0 L1 C1 _ PEN _ _ _ 199 _ overflows_timeout // amount = A4.credits_posted - A4.debits_pending - A4.debits_posted + 1
1656
+ \\ transfer T1 A4 A5 _ _ _ _ L1 C1 _ _ _ _ _ 199 _ exceeds_credits // amount = A4.credits_posted - A4.debits_pending - A4.debits_posted + 1
1657
+ \\ transfer T1 A4 A5 _ _ _ _ L1 C1 _ _ _ _ _ 91 _ exceeds_debits // amount = A5.debits_posted - A5.credits_pending - A5.credits_posted + 1
1658
+ \\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ 123 _ ok
1648
1659
 
1649
1660
  // Ensure that idempotence is only checked after validation.
1650
- \\ transfer T1 A1 A3 _ _ _ 999 L2 C1 _ PEN _ _ _ 123 transfer_must_have_the_same_ledger_as_accounts
1651
- \\ transfer T1 A1 A3 U1 _ _ _ L1 C2 _ _ _ _ _ -0 exists_with_different_flags
1652
- \\ transfer T1 A3 A1 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 exists_with_different_debit_account_id
1653
- \\ transfer T1 A1 A4 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 exists_with_different_credit_account_id
1654
- \\ transfer T1 A1 A3 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 exists_with_different_user_data
1655
- \\ transfer T1 A1 A3 _ _ _ 998 L1 C2 _ PEN _ _ _ -0 exists_with_different_timeout
1656
- \\ transfer T1 A1 A3 _ _ _ 999 L1 C2 _ PEN _ _ _ -0 exists_with_different_code
1657
- \\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ -0 exists_with_different_amount
1658
- \\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ 123 exists
1659
- \\ transfer T2 A3 A1 _ _ _ _ L1 C2 _ _ _ _ _ 7 ok
1660
- \\ transfer T3 A1 A3 _ _ _ _ L1 C2 _ _ _ _ _ 3 ok
1661
+ \\ transfer T1 A1 A3 _ _ _ 999 L2 C1 _ PEN _ _ _ 123 _ transfer_must_have_the_same_ledger_as_accounts
1662
+ \\ transfer T1 A1 A3 U1 _ _ _ L1 C2 _ _ _ _ _ -0 _ exists_with_different_flags
1663
+ \\ transfer T1 A3 A1 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_debit_account_id
1664
+ \\ transfer T1 A1 A4 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_credit_account_id
1665
+ \\ transfer T1 A1 A3 U1 _ _ 999 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_user_data
1666
+ \\ transfer T1 A1 A3 _ _ _ 998 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_timeout
1667
+ \\ transfer T1 A1 A3 _ _ _ 999 L1 C2 _ PEN _ _ _ -0 _ exists_with_different_code
1668
+ \\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ -0 _ exists_with_different_amount
1669
+ \\ transfer T1 A1 A3 _ _ _ 999 L1 C1 _ PEN _ _ _ 123 _ exists
1670
+ \\ transfer T2 A3 A1 _ _ _ _ L1 C2 _ _ _ _ _ 7 _ ok
1671
+ \\ transfer T3 A1 A3 _ _ _ _ L1 C2 _ _ _ _ _ 3 _ ok
1661
1672
  \\ commit create_transfers
1662
1673
  \\
1663
1674
  \\ lookup_account A1 223 203 0 7
@@ -1674,17 +1685,17 @@ test "create_transfers/lookup_transfers" {
1674
1685
 
1675
1686
  test "create/lookup 2-phase transfers" {
1676
1687
  try check(
1677
- \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1678
- \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1688
+ \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1689
+ \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1679
1690
  \\ commit create_accounts
1680
1691
 
1681
1692
  // First phase.
1682
- \\ transfer T1 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 ok // Not pending!
1683
- \\ transfer T2 A1 A2 _ _ _ 1000 L1 C1 _ PEN _ _ _ 15 ok
1684
- \\ transfer T3 A1 A2 _ _ _ 50 L1 C1 _ PEN _ _ _ 15 ok
1685
- \\ transfer T4 A1 A2 _ _ _ 1 L1 C1 _ PEN _ _ _ 15 ok
1686
- \\ transfer T5 A1 A2 U9 _ _ 50 L1 C1 _ PEN _ _ _ 7 ok
1687
- \\ transfer T6 A1 A2 _ _ _ 0 L1 C1 _ PEN _ _ _ 1 ok
1693
+ \\ transfer T1 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 _ ok // Not pending!
1694
+ \\ transfer T2 A1 A2 _ _ _ 1000 L1 C1 _ PEN _ _ _ 15 _ ok
1695
+ \\ transfer T3 A1 A2 _ _ _ 50 L1 C1 _ PEN _ _ _ 15 _ ok
1696
+ \\ transfer T4 A1 A2 _ _ _ 1 L1 C1 _ PEN _ _ _ 15 _ ok
1697
+ \\ transfer T5 A1 A2 U9 _ _ 50 L1 C1 _ PEN _ _ _ 7 _ ok
1698
+ \\ transfer T6 A1 A2 _ _ _ 0 L1 C1 _ PEN _ _ _ 1 _ ok
1688
1699
  \\ commit create_transfers
1689
1700
 
1690
1701
  // Check balances before resolving.
@@ -1693,34 +1704,35 @@ test "create/lookup 2-phase transfers" {
1693
1704
  \\ commit lookup_accounts
1694
1705
 
1695
1706
  // Second phase.
1696
- \\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 ok
1697
- \\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN POS VOI _ 16 cannot_post_and_void_pending_transfer
1698
- \\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN _ VOI _ 16 pending_transfer_cannot_post_or_void_another
1699
- \\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ _ _ VOI _ 16 timeout_reserved_for_pending_transfer
1700
- \\ transfer T101 A8 A9 U2 _ T0 _ L6 C7 _ _ _ VOI _ 16 pending_id_must_not_be_zero
1701
- \\ transfer T101 A8 A9 U2 _ -0 _ L6 C7 _ _ _ VOI _ 16 pending_id_must_not_be_int_max
1702
- \\ transfer T101 A8 A9 U2 _ 101 _ L6 C7 _ _ _ VOI _ 16 pending_id_must_be_different
1703
- \\ transfer T101 A8 A9 U2 _ 102 _ L6 C7 _ _ _ VOI _ 16 pending_transfer_not_found
1704
- \\ transfer T101 A8 A9 U2 _ T1 _ L6 C7 _ _ _ VOI _ 16 pending_transfer_not_pending
1705
- \\ transfer T101 A8 A9 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 pending_transfer_has_different_debit_account_id
1706
- \\ transfer T101 A1 A9 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 pending_transfer_has_different_credit_account_id
1707
- \\ transfer T101 A1 A2 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 pending_transfer_has_different_ledger
1708
- \\ transfer T101 A1 A2 U2 _ T2 _ L1 C7 _ _ _ VOI _ 16 pending_transfer_has_different_code
1709
- \\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 16 exceeds_pending_transfer_amount
1710
- \\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 14 pending_transfer_has_different_amount
1711
- \\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 15 exists_with_different_flags
1712
- \\ transfer T101 A1 A2 U2 _ T3 _ L1 C1 _ _ POS _ _ 14 exists_with_different_pending_id
1713
- \\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ POS _ _ 14 exists_with_different_user_data
1714
- \\ transfer T101 A1 A2 U0 _ T2 _ L1 C1 _ _ POS _ _ 14 exists_with_different_user_data
1715
- \\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 14 exists_with_different_amount
1716
- \\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ _ exists_with_different_amount
1717
- \\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 exists
1718
- \\ transfer T102 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 pending_transfer_already_posted
1719
- \\ transfer T103 A1 A2 U1 _ T3 _ L1 C1 _ _ _ VOI _ 15 ok
1720
- \\ transfer T102 A1 A2 U1 _ T3 _ L1 C1 _ _ POS _ _ 13 pending_transfer_already_voided
1721
- \\ transfer T102 A1 A2 U1 _ T4 _ L1 C1 _ _ _ VOI _ 15 pending_transfer_expired
1722
- \\ transfer T105 A0 A0 U0 _ T5 _ L0 C0 _ _ POS _ _ _ ok
1723
- \\ transfer T106 A0 A0 U0 _ T6 _ L1 C1 _ _ POS _ _ 0 ok
1707
+ \\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 _ ok
1708
+ \\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN POS VOI _ 16 1 timestamp_must_be_zero
1709
+ \\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN POS VOI _ 16 _ cannot_post_and_void_pending_transfer
1710
+ \\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ PEN _ VOI _ 16 _ pending_transfer_cannot_post_or_void_another
1711
+ \\ transfer T101 A8 A9 U2 _ T0 50 L6 C7 _ _ _ VOI _ 16 _ timeout_reserved_for_pending_transfer
1712
+ \\ transfer T101 A8 A9 U2 _ T0 _ L6 C7 _ _ _ VOI _ 16 _ pending_id_must_not_be_zero
1713
+ \\ transfer T101 A8 A9 U2 _ -0 _ L6 C7 _ _ _ VOI _ 16 _ pending_id_must_not_be_int_max
1714
+ \\ transfer T101 A8 A9 U2 _ 101 _ L6 C7 _ _ _ VOI _ 16 _ pending_id_must_be_different
1715
+ \\ transfer T101 A8 A9 U2 _ 102 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_not_found
1716
+ \\ transfer T101 A8 A9 U2 _ T1 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_not_pending
1717
+ \\ transfer T101 A8 A9 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_has_different_debit_account_id
1718
+ \\ transfer T101 A1 A9 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_has_different_credit_account_id
1719
+ \\ transfer T101 A1 A2 U2 _ T2 _ L6 C7 _ _ _ VOI _ 16 _ pending_transfer_has_different_ledger
1720
+ \\ transfer T101 A1 A2 U2 _ T2 _ L1 C7 _ _ _ VOI _ 16 _ pending_transfer_has_different_code
1721
+ \\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 16 _ exceeds_pending_transfer_amount
1722
+ \\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 14 _ pending_transfer_has_different_amount
1723
+ \\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ _ VOI _ 15 _ exists_with_different_flags
1724
+ \\ transfer T101 A1 A2 U2 _ T3 _ L1 C1 _ _ POS _ _ 14 _ exists_with_different_pending_id
1725
+ \\ transfer T101 A1 A2 U2 _ T2 _ L1 C1 _ _ POS _ _ 14 _ exists_with_different_user_data
1726
+ \\ transfer T101 A1 A2 U0 _ T2 _ L1 C1 _ _ POS _ _ 14 _ exists_with_different_user_data
1727
+ \\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 14 _ exists_with_different_amount
1728
+ \\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ _ _ exists_with_different_amount
1729
+ \\ transfer T101 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 _ exists
1730
+ \\ transfer T102 A1 A2 U1 _ T2 _ L1 C1 _ _ POS _ _ 13 _ pending_transfer_already_posted
1731
+ \\ transfer T103 A1 A2 U1 _ T3 _ L1 C1 _ _ _ VOI _ 15 _ ok
1732
+ \\ transfer T102 A1 A2 U1 _ T3 _ L1 C1 _ _ POS _ _ 13 _ pending_transfer_already_voided
1733
+ \\ transfer T102 A1 A2 U1 _ T4 _ L1 C1 _ _ _ VOI _ 15 _ pending_transfer_expired
1734
+ \\ transfer T105 A0 A0 U0 _ T5 _ L0 C0 _ _ POS _ _ _ _ ok
1735
+ \\ transfer T106 A0 A0 U0 _ T6 _ L1 C1 _ _ POS _ _ 0 _ ok
1724
1736
  \\ commit create_transfers
1725
1737
 
1726
1738
  // Check balances after resolving.
@@ -1738,12 +1750,12 @@ test "create_transfers: empty" {
1738
1750
 
1739
1751
  test "create_transfers/lookup_transfers: failed transfer does not exist" {
1740
1752
  try check(
1741
- \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1742
- \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1753
+ \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1754
+ \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1743
1755
  \\ commit create_accounts
1744
1756
  \\
1745
- \\ transfer T1 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 ok
1746
- \\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 ledger_must_not_be_zero
1757
+ \\ transfer T1 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 _ ok
1758
+ \\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 _ ledger_must_not_be_zero
1747
1759
  \\ commit create_transfers
1748
1760
  \\
1749
1761
  \\ lookup_account A1 0 15 0 0
@@ -1758,16 +1770,16 @@ test "create_transfers/lookup_transfers: failed transfer does not exist" {
1758
1770
 
1759
1771
  test "create_transfers: failed linked-chains are undone" {
1760
1772
  try check(
1761
- \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1762
- \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1773
+ \\ account A1 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1774
+ \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1763
1775
  \\ commit create_accounts
1764
1776
  \\
1765
- \\ transfer T1 A1 A2 _ _ _ _ L1 C1 LNK _ _ _ _ 15 linked_event_failed
1766
- \\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 ledger_must_not_be_zero
1777
+ \\ transfer T1 A1 A2 _ _ _ _ L1 C1 LNK _ _ _ _ 15 _ linked_event_failed
1778
+ \\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 _ ledger_must_not_be_zero
1767
1779
  \\ commit create_transfers
1768
1780
  \\
1769
- \\ transfer T3 A1 A2 _ _ _ 1 L1 C1 LNK PEN _ _ _ 15 linked_event_failed
1770
- \\ transfer T4 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 ledger_must_not_be_zero
1781
+ \\ transfer T3 A1 A2 _ _ _ 1 L1 C1 LNK PEN _ _ _ 15 _ linked_event_failed
1782
+ \\ transfer T4 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 15 _ ledger_must_not_be_zero
1771
1783
  \\ commit create_transfers
1772
1784
  \\
1773
1785
  \\ lookup_account A1 0 0 0 0
@@ -1784,15 +1796,15 @@ test "create_transfers: failed linked-chains are undone" {
1784
1796
 
1785
1797
  test "create_transfers: failed linked-chains are undone within a commit" {
1786
1798
  try check(
1787
- \\ account A1 _ _ L1 C1 _ D<C _ _ 0 0 0 0 ok
1788
- \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 ok
1799
+ \\ account A1 _ _ L1 C1 _ D<C _ _ 0 0 0 0 _ ok
1800
+ \\ account A2 _ _ L1 C1 _ _ _ _ 0 0 0 0 _ ok
1789
1801
  \\ commit create_accounts
1790
1802
  \\
1791
1803
  \\ setup A1 0 0 0 20
1792
1804
  \\
1793
- \\ transfer T1 A1 A2 _ _ _ _ L1 C1 LNK _ _ _ _ 15 linked_event_failed
1794
- \\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 5 ledger_must_not_be_zero
1795
- \\ transfer T3 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 ok
1805
+ \\ transfer T1 A1 A2 _ _ _ _ L1 C1 LNK _ _ _ _ 15 _ linked_event_failed
1806
+ \\ transfer T2 A1 A2 _ _ _ _ L0 C1 _ _ _ _ _ 5 _ ledger_must_not_be_zero
1807
+ \\ transfer T3 A1 A2 _ _ _ _ L1 C1 _ _ _ _ _ 15 _ ok
1796
1808
  \\ commit create_transfers
1797
1809
  \\
1798
1810
  \\ lookup_account A1 0 15 0 20