@magicblock-labs/ephemeral-rollups-kit 0.8.5 → 0.10.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.
Files changed (33) hide show
  1. package/README.md +7 -6
  2. package/lib/__test__/access-control.test.js +37 -0
  3. package/lib/__test__/access-control.test.js.map +1 -1
  4. package/lib/__test__/instructions.test.js +379 -0
  5. package/lib/__test__/instructions.test.js.map +1 -1
  6. package/lib/access-control/verify.d.ts +1 -0
  7. package/lib/access-control/verify.d.ts.map +1 -1
  8. package/lib/access-control/verify.js +94 -7
  9. package/lib/access-control/verify.js.map +1 -1
  10. package/lib/constants.d.ts +1 -0
  11. package/lib/constants.d.ts.map +1 -1
  12. package/lib/constants.js +2 -1
  13. package/lib/constants.js.map +1 -1
  14. package/lib/instructions/delegation-program/delegate.d.ts.map +1 -1
  15. package/lib/instructions/delegation-program/delegate.js +5 -2
  16. package/lib/instructions/delegation-program/delegate.js.map +1 -1
  17. package/lib/instructions/ephemeral-spl-token-program/ephemeralAta.d.ts +85 -0
  18. package/lib/instructions/ephemeral-spl-token-program/ephemeralAta.d.ts.map +1 -0
  19. package/lib/instructions/ephemeral-spl-token-program/ephemeralAta.js +896 -0
  20. package/lib/instructions/ephemeral-spl-token-program/ephemeralAta.js.map +1 -0
  21. package/lib/instructions/ephemeral-spl-token-program/index.d.ts +3 -0
  22. package/lib/instructions/ephemeral-spl-token-program/index.d.ts.map +1 -0
  23. package/lib/instructions/ephemeral-spl-token-program/index.js +19 -0
  24. package/lib/instructions/ephemeral-spl-token-program/index.js.map +1 -0
  25. package/lib/instructions/ephemeral-spl-token-program/transferQueue.d.ts +7 -0
  26. package/lib/instructions/ephemeral-spl-token-program/transferQueue.d.ts.map +1 -0
  27. package/lib/instructions/ephemeral-spl-token-program/transferQueue.js +126 -0
  28. package/lib/instructions/ephemeral-spl-token-program/transferQueue.js.map +1 -0
  29. package/lib/instructions/index.d.ts +1 -0
  30. package/lib/instructions/index.d.ts.map +1 -1
  31. package/lib/instructions/index.js +1 -0
  32. package/lib/instructions/index.js.map +1 -1
  33. package/package.json +3 -2
package/README.md CHANGED
@@ -1,20 +1,21 @@
1
1
  # @magicblock-labs/ephemeral-rollups-kit
2
2
 
3
- TypeScript helpers for preparing and routing transactions to Ephemeral Rollups on Solana with @solana/kit.
3
+ TypeScript helpers for preparing and routing transactions to Ephemeral Rollups on Solana with `@solana/kit`.
4
4
 
5
5
  Quickstart and integration guide:
6
6
  https://docs.magicblock.gg
7
7
 
8
8
  ## Install
9
-
9
+ ```bash
10
10
  npm install @magicblock-labs/ephemeral-rollups-kit
11
-
11
+ ```
12
12
  # or
13
-
13
+ ```bash
14
14
  yarn add @magicblock-labs/ephemeral-rollups-kit
15
-
15
+ ```
16
16
  ## Usage (basic)
17
17
 
18
- import { MagicRouter } from "@magicblock-labs/ephemeral-rollups-kit";
18
+ import { Connection } from "@magicblock-labs/ephemeral-rollups-kit";
19
19
 
20
20
  // See full examples and docs in the Quickstart link above.
21
+ ```
@@ -3,9 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const vitest_1 = require("vitest");
4
4
  const kit_1 = require("@solana/kit");
5
5
  const auth_1 = require("../access-control/auth");
6
+ const verify_1 = require("../access-control/verify");
6
7
  (0, vitest_1.describe)("Access Control (@solana/kit)", () => {
7
8
  const mockRpcUrl = "http://localhost:8899";
8
9
  const mockAddress = (0, kit_1.address)("11111111111111111111111111111111");
10
+ let originalFetch;
11
+ (0, vitest_1.beforeAll)(() => {
12
+ originalFetch = global.fetch;
13
+ });
9
14
  (0, vitest_1.beforeEach)(() => {
10
15
  vitest_1.vi.clearAllMocks();
11
16
  });
@@ -144,5 +149,37 @@ const auth_1 = require("../access-control/auth");
144
149
  (0, vitest_1.expect)(body.challenge).toBe(mockChallenge);
145
150
  });
146
151
  });
152
+ (0, vitest_1.describe)("verifyTeeIntegrity", () => {
153
+ (0, vitest_1.beforeEach)(() => {
154
+ vitest_1.vi.clearAllMocks();
155
+ global.fetch = originalFetch;
156
+ });
157
+ (0, vitest_1.it)("should return true if the quote is valid (warns only if fails)", async () => {
158
+ const rpcUrl = "https://tee.magicblock.app";
159
+ try {
160
+ const result = await (0, verify_1.verifyTeeIntegrity)(rpcUrl);
161
+ (0, vitest_1.expect)(result).toBe(true);
162
+ }
163
+ catch (err) {
164
+ console.warn(`[WARN] verifyTeeIntegrity test could not be completed due to external factors:`, err instanceof Error ? err.message : err);
165
+ }
166
+ }, 15000);
167
+ });
168
+ (0, vitest_1.describe)("verifyTeeRpcIntegrity", () => {
169
+ (0, vitest_1.beforeEach)(() => {
170
+ vitest_1.vi.clearAllMocks();
171
+ global.fetch = originalFetch;
172
+ });
173
+ (0, vitest_1.it)("should return true if the quote is valid (warns only if fails)", async () => {
174
+ const rpcUrl = "https://tee.magicblock.app";
175
+ try {
176
+ const result = await (0, verify_1.verifyTeeRpcIntegrity)(rpcUrl);
177
+ (0, vitest_1.expect)(result).toBe(true);
178
+ }
179
+ catch (err) {
180
+ console.warn(`[WARN] verifyTeeRpcIntegrity test could not be completed due to external factors:`, err instanceof Error ? err.message : err);
181
+ }
182
+ }, 15000);
183
+ });
147
184
  });
148
185
  //# sourceMappingURL=access-control.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"access-control.test.js","sourceRoot":"","sources":["../../src/__test__/access-control.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"access-control.test.js","sourceRoot":"","sources":["../../src/__test__/access-control.test.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,13 @@ const vitest_1 = require("vitest");
4
4
  const instructions_1 = require("@solana/instructions");
5
5
  const delegation_program_1 = require("../instructions/delegation-program");
6
6
  const magic_program_1 = require("../instructions/magic-program");
7
+ const kit_1 = require("@solana/kit");
8
+ const ephemeral_spl_token_program_1 = require("../instructions/ephemeral-spl-token-program");
7
9
  const constants_1 = require("../constants");
8
10
  (0, vitest_1.describe)("Exposed Instructions (@solana/kit)", () => {
9
11
  const mockAddress = "11111111111111111111111111111111";
10
12
  const differentAddress = "11111111111111111111111111111112";
13
+ const addressEncoder = (0, kit_1.getAddressEncoder)();
11
14
  (0, vitest_1.describe)("delegate instruction", () => {
12
15
  (0, vitest_1.it)("should create a delegate instruction with correct parameters", async () => {
13
16
  const args = {
@@ -177,6 +180,23 @@ const constants_1 = require("../constants");
177
180
  (0, vitest_1.expect)(view.getUint32(0, true)).toBe(2);
178
181
  });
179
182
  });
183
+ (0, vitest_1.describe)("initRentPdaIx (Ephemeral SPL Token Program)", () => {
184
+ (0, vitest_1.it)("should derive and initialize the global rent PDA", async () => {
185
+ const [rentPda] = await (0, ephemeral_spl_token_program_1.deriveRentPda)();
186
+ const instruction = (0, ephemeral_spl_token_program_1.initRentPdaIx)(mockAddress, rentPda);
187
+ (0, vitest_1.expect)(instruction.programAddress).toBe(constants_1.EPHEMERAL_SPL_TOKEN_PROGRAM_ID);
188
+ (0, vitest_1.expect)(instruction.accounts).toHaveLength(3);
189
+ (0, vitest_1.expect)(instruction.accounts?.[0]).toEqual({
190
+ address: mockAddress,
191
+ role: instructions_1.AccountRole.WRITABLE_SIGNER,
192
+ });
193
+ (0, vitest_1.expect)(instruction.accounts?.[1]).toEqual({
194
+ address: rentPda,
195
+ role: instructions_1.AccountRole.WRITABLE,
196
+ });
197
+ (0, vitest_1.expect)(instruction.data).toEqual(new Uint8Array([23]));
198
+ });
199
+ });
180
200
  (0, vitest_1.describe)("topUpEscrow instruction", () => {
181
201
  (0, vitest_1.it)("should create a topUpEscrow instruction with all parameters", () => {
182
202
  const instruction = (0, delegation_program_1.createTopUpEscrowInstruction)(mockAddress, mockAddress, mockAddress, 1000000, 255);
@@ -420,5 +440,364 @@ const constants_1 = require("../constants");
420
440
  });
421
441
  });
422
442
  });
443
+ (0, vitest_1.describe)("delegateSpl (Ephemeral SPL Token Program)", () => {
444
+ const owner = (0, kit_1.address)("11111111111111111111111111111113");
445
+ const mint = (0, kit_1.address)("11111111111111111111111111111114");
446
+ const validator = (0, kit_1.address)("11111111111111111111111111111115");
447
+ (0, vitest_1.it)("should delegate the vault eata when initializing the vault in legacy flow", async () => {
448
+ const [vault] = await (0, ephemeral_spl_token_program_1.deriveVault)(mint);
449
+ const [vaultEphemeralAta, vaultEataBump] = await (0, ephemeral_spl_token_program_1.deriveEphemeralAta)(vault, mint);
450
+ const instructions = await (0, ephemeral_spl_token_program_1.delegateSpl)(owner, mint, 1n, {
451
+ validator,
452
+ initIfMissing: true,
453
+ initVaultIfMissing: true,
454
+ idempotent: false,
455
+ });
456
+ (0, vitest_1.expect)(instructions[3].accounts?.[1].address).toBe(vaultEphemeralAta);
457
+ (0, vitest_1.expect)(instructions[3].data?.[0]).toBe(4);
458
+ (0, vitest_1.expect)(instructions[3].data?.[1]).toBe(vaultEataBump);
459
+ (0, vitest_1.expect)(Array.from(instructions[3].data?.subarray(2) ?? [])).toEqual(Array.from(addressEncoder.encode(validator)));
460
+ });
461
+ (0, vitest_1.it)("should delegate the vault eata when initializing the vault in idempotent flow", async () => {
462
+ const [vault] = await (0, ephemeral_spl_token_program_1.deriveVault)(mint);
463
+ const [vaultEphemeralAta, vaultEataBump] = await (0, ephemeral_spl_token_program_1.deriveEphemeralAta)(vault, mint);
464
+ const instructions = await (0, ephemeral_spl_token_program_1.delegateSpl)(owner, mint, 1n, {
465
+ validator,
466
+ initVaultIfMissing: true,
467
+ shuttleId: 7,
468
+ });
469
+ (0, vitest_1.expect)(instructions[2].accounts?.[1].address).toBe(vaultEphemeralAta);
470
+ (0, vitest_1.expect)(instructions[2].data?.[0]).toBe(4);
471
+ (0, vitest_1.expect)(instructions[2].data?.[1]).toBe(vaultEataBump);
472
+ (0, vitest_1.expect)(Array.from(instructions[2].data?.subarray(2) ?? [])).toEqual(Array.from(addressEncoder.encode(validator)));
473
+ });
474
+ (0, vitest_1.it)("should use setup_and_delegate_shuttle_with_merge across the idempotent shuttle flow", async () => {
475
+ const instructions = await (0, ephemeral_spl_token_program_1.delegateSpl)(owner, mint, 1n, {
476
+ validator,
477
+ shuttleId: 7,
478
+ });
479
+ const setupAndDelegateInstruction = instructions.find((ix) => ix.data?.[0] === 24);
480
+ (0, vitest_1.expect)(setupAndDelegateInstruction).toBeDefined();
481
+ (0, vitest_1.expect)(setupAndDelegateInstruction?.accounts).toHaveLength(19);
482
+ (0, vitest_1.expect)(instructions.find((ix) => ix.data?.[0] === 11)).toBeUndefined();
483
+ const setupAndDelegateData = setupAndDelegateInstruction?.data;
484
+ (0, vitest_1.expect)(setupAndDelegateData).toBeDefined();
485
+ if (setupAndDelegateData === undefined) {
486
+ throw new Error("Expected setup-and-delegate instruction data");
487
+ }
488
+ (0, vitest_1.expect)(new DataView(setupAndDelegateData.buffer, setupAndDelegateData.byteOffset, setupAndDelegateData.byteLength).getBigUint64(6, true)).toBe(1n);
489
+ (0, vitest_1.expect)(Array.from(setupAndDelegateData.subarray(14))).toEqual(Array.from(addressEncoder.encode(validator)));
490
+ });
491
+ (0, vitest_1.it)("should skip ephemeral ATA init in idempotent flow when initIfMissing is false", async () => {
492
+ const [ephemeralAta] = await (0, ephemeral_spl_token_program_1.deriveEphemeralAta)(owner, mint);
493
+ const instructions = await (0, ephemeral_spl_token_program_1.delegateSpl)(owner, mint, 1n, {
494
+ validator,
495
+ shuttleId: 7,
496
+ initIfMissing: false,
497
+ });
498
+ const initInstruction = instructions.find((ix) => ix.data?.[0] === 0 && ix.accounts?.[0].address === ephemeralAta);
499
+ const delegateInstruction = instructions.find((ix) => ix.data?.[0] === 4 && ix.accounts?.[1].address === ephemeralAta);
500
+ (0, vitest_1.expect)(initInstruction).toBeUndefined();
501
+ (0, vitest_1.expect)(delegateInstruction).toBeDefined();
502
+ });
503
+ });
504
+ (0, vitest_1.describe)("delegateSplWithPrivateTransfer (Ephemeral SPL Token Program)", () => {
505
+ const owner = (0, kit_1.address)("11111111111111111111111111111113");
506
+ const mint = (0, kit_1.address)("11111111111111111111111111111114");
507
+ const validator = (0, kit_1.address)("11111111111111111111111111111115");
508
+ (0, vitest_1.it)("should use the private transfer shuttle flow", async () => {
509
+ const instructions = await (0, ephemeral_spl_token_program_1.delegateSplWithPrivateTransfer)(owner, mint, 1n, {
510
+ validator,
511
+ shuttleId: 7,
512
+ initTransferQueueIfMissing: true,
513
+ minDelayMs: 100n,
514
+ maxDelayMs: 300n,
515
+ split: 4,
516
+ });
517
+ const privateTransferInstruction = instructions.find((ix) => ix.data?.[0] === 25);
518
+ (0, vitest_1.expect)(instructions.find((ix) => ix.data?.[0] === 12)).toBeDefined();
519
+ (0, vitest_1.expect)(privateTransferInstruction).toBeDefined();
520
+ (0, vitest_1.expect)(privateTransferInstruction?.accounts).toHaveLength(20);
521
+ const privateTransferData = privateTransferInstruction?.data;
522
+ (0, vitest_1.expect)(privateTransferData).toBeDefined();
523
+ if (privateTransferData === undefined) {
524
+ throw new Error("Expected private transfer instruction data");
525
+ }
526
+ const dataView = new DataView(privateTransferData.buffer, privateTransferData.byteOffset, privateTransferData.byteLength);
527
+ (0, vitest_1.expect)(dataView.getBigUint64(6, true)).toBe(1n);
528
+ (0, vitest_1.expect)(dataView.getBigUint64(14, true)).toBe(100n);
529
+ (0, vitest_1.expect)(dataView.getBigUint64(22, true)).toBe(300n);
530
+ (0, vitest_1.expect)(dataView.getUint32(30, true)).toBe(4);
531
+ });
532
+ });
533
+ (0, vitest_1.describe)("withdrawSpl (Ephemeral SPL Token Program)", () => {
534
+ const owner = (0, kit_1.address)("11111111111111111111111111111113");
535
+ const mint = (0, kit_1.address)("11111111111111111111111111111114");
536
+ const validator = (0, kit_1.address)("11111111111111111111111111111115");
537
+ (0, vitest_1.it)("should use the delegated shuttle withdrawal flow when idempotent", async () => {
538
+ const instructions = await (0, ephemeral_spl_token_program_1.withdrawSpl)(owner, mint, 1n, {
539
+ validator,
540
+ shuttleId: 7,
541
+ });
542
+ const withdrawInstruction = instructions.find((ix) => ix.data?.[0] === 26);
543
+ (0, vitest_1.expect)(withdrawInstruction).toBeDefined();
544
+ (0, vitest_1.expect)(withdrawInstruction?.accounts).toHaveLength(16);
545
+ (0, vitest_1.expect)(instructions.find((ix) => ix.data?.[0] === 3)).toBeUndefined();
546
+ });
547
+ (0, vitest_1.it)("should fall back to the legacy withdraw instruction when idempotent is false", async () => {
548
+ const instructions = await (0, ephemeral_spl_token_program_1.withdrawSpl)(owner, mint, 1n, {
549
+ idempotent: false,
550
+ });
551
+ (0, vitest_1.expect)(instructions).toHaveLength(1);
552
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(3);
553
+ });
554
+ });
555
+ (0, vitest_1.describe)("transferSpl (Ephemeral SPL Token Program)", () => {
556
+ const from = (0, kit_1.address)("11111111111111111111111111111113");
557
+ const to = (0, kit_1.address)("11111111111111111111111111111114");
558
+ const mint = (0, kit_1.address)("11111111111111111111111111111115");
559
+ const validator = (0, kit_1.address)("11111111111111111111111111111116");
560
+ (0, vitest_1.it)("should use the shuttle private transfer instruction for private base-to-base transfers", async () => {
561
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
562
+ visibility: "private",
563
+ fromBalance: "base",
564
+ toBalance: "base",
565
+ validator,
566
+ shuttleId: 7,
567
+ privateTransfer: {
568
+ minDelayMs: 100n,
569
+ maxDelayMs: 300n,
570
+ split: 4,
571
+ },
572
+ });
573
+ (0, vitest_1.expect)(instructions).toHaveLength(1);
574
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(25);
575
+ (0, vitest_1.expect)(instructions[0].accounts).toHaveLength(20);
576
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(6)).toBe(25n);
577
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(14)).toBe(100n);
578
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(22)).toBe(300n);
579
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readUInt32LE(30)).toBe(4);
580
+ });
581
+ (0, vitest_1.it)("should initialize the destination ATA and vault when requested", async () => {
582
+ const [vault] = await (0, ephemeral_spl_token_program_1.deriveVault)(mint);
583
+ const [vaultEphemeralAta, vaultEataBump] = await (0, ephemeral_spl_token_program_1.deriveEphemeralAta)(vault, mint);
584
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
585
+ visibility: "private",
586
+ fromBalance: "base",
587
+ toBalance: "base",
588
+ validator,
589
+ shuttleId: 7,
590
+ initIfMissing: true,
591
+ initVaultIfMissing: true,
592
+ privateTransfer: {
593
+ minDelayMs: 100n,
594
+ maxDelayMs: 300n,
595
+ split: 4,
596
+ },
597
+ });
598
+ (0, vitest_1.expect)(instructions).toHaveLength(5);
599
+ (0, vitest_1.expect)(instructions[2].accounts?.[1].address).toBe(vaultEphemeralAta);
600
+ (0, vitest_1.expect)(instructions[2].data?.[0]).toBe(4);
601
+ (0, vitest_1.expect)(instructions[2].data?.[1]).toBe(vaultEataBump);
602
+ (0, vitest_1.expect)(instructions[3].accounts?.[2].address).toBe(to);
603
+ (0, vitest_1.expect)(instructions[3].data?.[0]).toBe(1);
604
+ (0, vitest_1.expect)(instructions[4].data?.[0]).toBe(25);
605
+ });
606
+ (0, vitest_1.it)("should prepend source ATA creation when initAtasIfMissing is set on base-source transfers", async () => {
607
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
608
+ visibility: "public",
609
+ fromBalance: "base",
610
+ toBalance: "base",
611
+ initAtasIfMissing: true,
612
+ });
613
+ (0, vitest_1.expect)(instructions).toHaveLength(2);
614
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(1);
615
+ (0, vitest_1.expect)(instructions[0].accounts?.[2].address).toBe(from);
616
+ (0, vitest_1.expect)(instructions[1].data?.[0]).toBe(3);
617
+ });
618
+ (0, vitest_1.it)("should use the shuttle merge instruction for private base-to-ephemeral transfers", async () => {
619
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
620
+ visibility: "private",
621
+ fromBalance: "base",
622
+ toBalance: "ephemeral",
623
+ validator,
624
+ shuttleId: 7,
625
+ });
626
+ (0, vitest_1.expect)(instructions).toHaveLength(1);
627
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(24);
628
+ (0, vitest_1.expect)(instructions[0].accounts).toHaveLength(19);
629
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(6)).toBe(25n);
630
+ });
631
+ (0, vitest_1.it)("should initialize and delegate the receiver eata for private base-to-ephemeral transfers when requested", async () => {
632
+ const [toEphemeralAta, toEataBump] = await (0, ephemeral_spl_token_program_1.deriveEphemeralAta)(to, mint);
633
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
634
+ visibility: "private",
635
+ fromBalance: "base",
636
+ toBalance: "ephemeral",
637
+ validator,
638
+ shuttleId: 7,
639
+ initIfMissing: true,
640
+ });
641
+ (0, vitest_1.expect)(instructions).toHaveLength(4);
642
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(1);
643
+ (0, vitest_1.expect)(instructions[0].accounts?.[2].address).toBe(to);
644
+ (0, vitest_1.expect)(instructions[1].data?.[0]).toBe(0);
645
+ (0, vitest_1.expect)(instructions[1].accounts?.[0].address).toBe(toEphemeralAta);
646
+ (0, vitest_1.expect)(instructions[2].data?.[0]).toBe(4);
647
+ (0, vitest_1.expect)(instructions[2].data?.[1]).toBe(toEataBump);
648
+ (0, vitest_1.expect)(instructions[2].accounts?.[1].address).toBe(toEphemeralAta);
649
+ (0, vitest_1.expect)(instructions[3].data?.[0]).toBe(24);
650
+ });
651
+ (0, vitest_1.it)("should ignore initAtasIfMissing on ephemeral-source transfers", async () => {
652
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
653
+ visibility: "private",
654
+ fromBalance: "ephemeral",
655
+ toBalance: "base",
656
+ initAtasIfMissing: true,
657
+ privateTransfer: {
658
+ minDelayMs: 100n,
659
+ maxDelayMs: 300n,
660
+ split: 4,
661
+ },
662
+ });
663
+ (0, vitest_1.expect)(instructions).toHaveLength(1);
664
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(16);
665
+ });
666
+ (0, vitest_1.it)("should use depositAndQueueTransferIx for private ephemeral-to-base transfers", async () => {
667
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
668
+ visibility: "private",
669
+ fromBalance: "ephemeral",
670
+ toBalance: "base",
671
+ initIfMissing: true,
672
+ initVaultIfMissing: true,
673
+ privateTransfer: {
674
+ minDelayMs: 100n,
675
+ maxDelayMs: 300n,
676
+ split: 4,
677
+ },
678
+ });
679
+ (0, vitest_1.expect)(instructions).toHaveLength(1);
680
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(16);
681
+ (0, vitest_1.expect)(instructions[0].accounts).toHaveLength(8);
682
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(1)).toBe(25n);
683
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(9)).toBe(100n);
684
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(17)).toBe(300n);
685
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readUInt32LE(25)).toBe(4);
686
+ });
687
+ (0, vitest_1.it)("should reject private base-to-base transfers when maxDelayMs is less than minDelayMs", async () => {
688
+ await (0, vitest_1.expect)((0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
689
+ visibility: "private",
690
+ fromBalance: "base",
691
+ toBalance: "base",
692
+ shuttleId: 7,
693
+ privateTransfer: {
694
+ minDelayMs: 300n,
695
+ maxDelayMs: 100n,
696
+ split: 4,
697
+ },
698
+ })).rejects.toThrow("maxDelayMs must be greater than or equal to minDelayMs");
699
+ });
700
+ (0, vitest_1.it)("should use a normal transfer for public base-to-base transfers", async () => {
701
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
702
+ visibility: "public",
703
+ fromBalance: "base",
704
+ toBalance: "base",
705
+ });
706
+ (0, vitest_1.expect)(instructions).toHaveLength(1);
707
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(3);
708
+ (0, vitest_1.expect)(instructions[0].accounts).toHaveLength(3);
709
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(1)).toBe(25n);
710
+ });
711
+ (0, vitest_1.it)("should use a normal transfer for public ephemeral-to-ephemeral transfers", async () => {
712
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
713
+ visibility: "public",
714
+ fromBalance: "ephemeral",
715
+ toBalance: "ephemeral",
716
+ });
717
+ (0, vitest_1.expect)(instructions).toHaveLength(1);
718
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(3);
719
+ (0, vitest_1.expect)(instructions[0].accounts).toHaveLength(3);
720
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(1)).toBe(25n);
721
+ });
722
+ (0, vitest_1.it)("should use a normal transfer for private ephemeral-to-ephemeral transfers", async () => {
723
+ const instructions = await (0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
724
+ visibility: "private",
725
+ fromBalance: "ephemeral",
726
+ toBalance: "ephemeral",
727
+ initIfMissing: true,
728
+ initVaultIfMissing: true,
729
+ });
730
+ (0, vitest_1.expect)(instructions).toHaveLength(1);
731
+ (0, vitest_1.expect)(instructions[0].data?.[0]).toBe(3);
732
+ (0, vitest_1.expect)(instructions[0].accounts).toHaveLength(3);
733
+ (0, vitest_1.expect)(Buffer.from(instructions[0].data ?? []).readBigUInt64LE(1)).toBe(25n);
734
+ });
735
+ (0, vitest_1.it)("should reject unsupported routes", async () => {
736
+ await (0, vitest_1.expect)((0, ephemeral_spl_token_program_1.transferSpl)(from, to, mint, 25n, {
737
+ visibility: "public",
738
+ fromBalance: "base",
739
+ toBalance: "ephemeral",
740
+ })).rejects.toThrow("transferSpl route not implemented: visibility=public, fromBalance=base, toBalance=ephemeral");
741
+ });
742
+ });
743
+ (0, vitest_1.describe)("initVaultIx (Ephemeral SPL Token Program)", () => {
744
+ (0, vitest_1.it)("should use the provided vault ephemeral ATA synchronously", async () => {
745
+ const mint = (0, kit_1.address)("11111111111111111111111111111114");
746
+ const payer = (0, kit_1.address)("11111111111111111111111111111115");
747
+ const [vault, vaultBump] = await (0, ephemeral_spl_token_program_1.deriveVault)(mint);
748
+ const [vaultEphemeralAta] = await (0, ephemeral_spl_token_program_1.deriveEphemeralAta)(vault, mint);
749
+ const vaultAta = (0, kit_1.address)("11111111111111111111111111111116");
750
+ const instruction = (0, ephemeral_spl_token_program_1.initVaultIx)(vault, mint, payer, vaultBump, vaultEphemeralAta, vaultAta);
751
+ (0, vitest_1.expect)(instruction.accounts?.[0].address).toBe(vault);
752
+ (0, vitest_1.expect)(instruction.accounts?.[3].address).toBe(vaultEphemeralAta);
753
+ (0, vitest_1.expect)(instruction.accounts?.[4].address).toBe(vaultAta);
754
+ (0, vitest_1.expect)(Array.from(instruction.data ?? [])).toEqual([1, vaultBump]);
755
+ });
756
+ });
757
+ (0, vitest_1.describe)("ensureTransferQueueCrankIx (Ephemeral SPL Token Program)", () => {
758
+ const payer = mockAddress;
759
+ const queue = differentAddress;
760
+ (0, vitest_1.it)("should include queue, magic context, and magic program in order", () => {
761
+ const instruction = (0, ephemeral_spl_token_program_1.ensureTransferQueueCrankIx)(payer, queue);
762
+ (0, vitest_1.expect)(instruction.accounts).toHaveLength(4);
763
+ (0, vitest_1.expect)(instruction.accounts?.[0].address).toBe(payer);
764
+ (0, vitest_1.expect)(instruction.accounts?.[1].address).toBe(queue);
765
+ (0, vitest_1.expect)(instruction.accounts?.[2].address).toBe(constants_1.MAGIC_CONTEXT_ID);
766
+ (0, vitest_1.expect)(instruction.accounts?.[3].address).toBe(constants_1.MAGIC_PROGRAM_ID);
767
+ });
768
+ });
769
+ (0, vitest_1.describe)("depositAndQueueTransferIx (Ephemeral SPL Token Program)", () => {
770
+ const queue = differentAddress;
771
+ const vault = (0, kit_1.address)("11111111111111111111111111111113");
772
+ const mint = (0, kit_1.address)("11111111111111111111111111111114");
773
+ const source = (0, kit_1.address)("11111111111111111111111111111115");
774
+ const vaultAta = (0, kit_1.address)("11111111111111111111111111111116");
775
+ const destination = (0, kit_1.address)("11111111111111111111111111111117");
776
+ (0, vitest_1.it)("should serialize min/max delay ms and split", () => {
777
+ const instruction = (0, ephemeral_spl_token_program_1.depositAndQueueTransferIx)(queue, vault, mint, source, vaultAta, destination, mockAddress, 25n, 100n, 300n, 4);
778
+ (0, vitest_1.expect)(instruction.accounts).toHaveLength(8);
779
+ (0, vitest_1.expect)(Array.from(instruction.data ?? [])).toEqual([
780
+ 16,
781
+ ...Array.from(Buffer.from([25n, 100n, 300n].flatMap((value) => {
782
+ const out = Buffer.alloc(8);
783
+ out.writeBigUInt64LE(value);
784
+ return Array.from(out);
785
+ }))),
786
+ 4,
787
+ 0,
788
+ 0,
789
+ 0,
790
+ ]);
791
+ });
792
+ });
793
+ (0, vitest_1.describe)("delegateTransferQueueIx (Ephemeral SPL Token Program)", () => {
794
+ const payer = mockAddress;
795
+ const queue = differentAddress;
796
+ (0, vitest_1.it)("should serialize discriminator 19 for the delegated transfer queue opcode", async () => {
797
+ const instruction = await (0, ephemeral_spl_token_program_1.delegateTransferQueueIx)(queue, payer, mockAddress);
798
+ (0, vitest_1.expect)(instruction.accounts).toHaveLength(9);
799
+ (0, vitest_1.expect)(instruction.data).toEqual(new Uint8Array([19]));
800
+ });
801
+ });
423
802
  });
424
803
  //# sourceMappingURL=instructions.test.js.map