@ledgerhq/device-signer-kit-solana 0.0.0-device-id-20251125171501 → 0.0.0-dmk-lifi-20260106144650

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 (139) hide show
  1. package/README.md +3 -0
  2. package/lib/cjs/api/SignerSolanaBuilder.js +1 -1
  3. package/lib/cjs/api/SignerSolanaBuilder.js.map +3 -3
  4. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  5. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
  6. package/lib/cjs/api/index.js +1 -1
  7. package/lib/cjs/api/index.js.map +2 -2
  8. package/lib/cjs/api/model/TransactionResolutionContext.js +1 -1
  9. package/lib/cjs/api/model/TransactionResolutionContext.js.map +3 -3
  10. package/lib/cjs/internal/DefaultSignerSolana.js.map +2 -2
  11. package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
  12. package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +3 -3
  13. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
  14. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  15. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
  16. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
  17. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
  18. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
  19. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js +1 -1
  20. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
  21. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
  22. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
  23. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  24. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  25. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  26. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  27. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
  28. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
  29. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +1 -1
  30. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
  31. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
  32. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
  33. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
  34. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
  35. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  36. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
  37. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  38. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  39. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  40. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  41. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  42. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  43. package/lib/cjs/internal/di.js +1 -1
  44. package/lib/cjs/internal/di.js.map +3 -3
  45. package/lib/cjs/internal/externalTypes.js +1 -1
  46. package/lib/cjs/internal/externalTypes.js.map +2 -2
  47. package/lib/cjs/package.json +40 -36
  48. package/lib/esm/api/SignerSolanaBuilder.js +1 -1
  49. package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
  50. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -0
  51. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +4 -4
  52. package/lib/esm/api/index.js +1 -1
  53. package/lib/esm/api/index.js.map +2 -2
  54. package/lib/esm/api/model/TransactionResolutionContext.js +1 -0
  55. package/lib/esm/api/model/TransactionResolutionContext.js.map +4 -4
  56. package/lib/esm/internal/DefaultSignerSolana.js.map +2 -2
  57. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  58. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
  59. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  60. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  61. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
  62. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
  63. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
  64. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
  65. package/lib/esm/internal/app-binder/command/SignTransactionCommand.js +1 -1
  66. package/lib/esm/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
  67. package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
  68. package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
  69. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  70. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  71. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  72. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  73. package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
  74. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
  75. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +1 -1
  76. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
  77. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
  78. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
  79. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
  80. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
  81. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  82. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
  83. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  84. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  85. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  86. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  87. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  88. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  89. package/lib/esm/internal/di.js +1 -1
  90. package/lib/esm/internal/di.js.map +3 -3
  91. package/lib/esm/internal/externalTypes.js +1 -1
  92. package/lib/esm/internal/externalTypes.js.map +2 -2
  93. package/lib/esm/package.json +40 -36
  94. package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
  95. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +13 -2
  96. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  97. package/lib/types/api/index.d.ts +1 -0
  98. package/lib/types/api/index.d.ts.map +1 -1
  99. package/lib/types/api/model/TransactionResolutionContext.d.ts +7 -0
  100. package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -1
  101. package/lib/types/internal/DefaultSignerSolana.d.ts +3 -0
  102. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  103. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +3 -2
  104. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  105. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts +29 -0
  106. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts.map +1 -0
  107. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts +2 -0
  108. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts.map +1 -0
  109. package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts +2 -0
  110. package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts.map +1 -1
  111. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +2 -2
  112. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  113. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +7 -10
  114. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
  115. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts +8 -0
  116. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts.map +1 -0
  117. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts +2 -0
  118. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts.map +1 -0
  119. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +7 -10
  120. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
  121. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +14 -7
  122. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
  123. package/lib/types/internal/di.d.ts.map +1 -1
  124. package/lib/types/internal/externalTypes.d.ts +1 -0
  125. package/lib/types/internal/externalTypes.d.ts.map +1 -1
  126. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  127. package/package.json +34 -30
  128. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
  129. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
  130. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
  131. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
  132. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
  133. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
  134. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
  135. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
  136. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +0 -14
  137. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +0 -1
  138. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +0 -2
  139. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";var a=require("@solana/spl-token"),e=require("@solana/web3.js"),n=require("vitest"),T=require("../../app-binder/services/bs58Encoder"),i=require("./TransactionInspector");const A=T.DefaultBs58Encoder.encode(new Uint8Array(32).fill(170));function p(t,s,c){const r=c??s[0]??e.Keypair.generate(),o=new e.Transaction;o.recentBlockhash=A,o.feePayer=r.publicKey,o.add(...t);const u=new Set,d=[r,...s].filter(y=>{const l=y.publicKey.toBase58();return u.has(l)?!1:(u.add(l),!0)});return o.sign(...d),{raw:o.serialize(),payer:r}}(0,n.describe)("TransactionInspector",()=>{(0,n.it)("falls back to STANDARD for a plain SystemProgram transfer",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:s,lamports:1e3}),{raw:r}=p([c],[t],t),o=await new i.TransactionInspector(r).inspectTransactionType();(0,n.expect)(o.transactionType).toBe(i.SolanaTransactionTypes.STANDARD),(0,n.expect)(o.data).toEqual({})}),(0,n.it)("detects an SPL Transfer and returns the destination address",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,42n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector(o).inspectTransactionType();(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.tokenAddress).toBe(c.toBase58())}),(0,n.it)("detects an SPL TransferChecked and returns the destination address",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createTransferCheckedInstruction)(c,s,r,t.publicKey,123n,0,[],a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.tokenAddress).toBe(r.toBase58())}),(0,n.it)("detects InitializeAccount and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createInitializeAccountInstruction)(c,s,r,a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects InitializeAccount2 and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createInitializeAccount2Instruction)(c,s,r,a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects InitializeAccount3 and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createInitializeAccount3Instruction)(c,s,a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector(o).inspectTransactionType();(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects ATA creation via Associated Token Program (classic TOKEN program)",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:s.toBase58(),mintAddress:c.toBase58()})}),(0,n.it)("detects ATA creation via Associated Token Program (TOKEN-2022 program)",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_2022_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_2022_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:s.toBase58(),mintAddress:c.toBase58()})}),(0,n.it)("detects CloseAccount and returns the closed token account",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createCloseAccountInstruction)(s,c,t.publicKey),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector(o).inspectTransactionType();(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.tokenAddress).toBe(s.toBase58())}),(0,n.it)("detects SyncNative and returns the WSOL account",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=(0,a.createSyncNativeInstruction)(s,a.TOKEN_PROGRAM_ID),{raw:r}=p([c],[t],t),o=await new i.TransactionInspector(r).inspectTransactionType();(0,n.expect)(o.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(o.data.tokenAddress).toBe(s.toBase58())}),(0,n.it)("marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)",async()=>{const t=e.Keypair.generate(),s=new e.TransactionInstruction({programId:a.TOKEN_PROGRAM_ID,keys:[],data:Buffer.from([])}),{raw:c}=p([s],[t],t),r=await new i.TransactionInspector(c).inspectTransactionType();(0,n.expect)(r.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(r.data).toEqual({})}),(0,n.it)("falls back to STANDARD if the payload is unparseable",async()=>{const t=new Uint8Array([171,173,190,239]),s=await new i.TransactionInspector(t).inspectTransactionType();(0,n.expect)(s.transactionType).toBe(i.SolanaTransactionTypes.STANDARD),(0,n.expect)(s.data).toEqual({})}),(0,n.it)("fast path: tokenAddress override + SPL instruction, SPL and returns override",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,1n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=e.Keypair.generate().publicKey.toBase58(),d=await new i.TransactionInspector(o,u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.tokenAddress).toBe(u)}),(0,n.it)("fast path: createATA override + ATA instruction, SPL and returns override",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d={address:e.Keypair.generate().publicKey.toBase58(),mintAddress:e.Keypair.generate().publicKey.toBase58()},y=await new i.TransactionInspector(u,void 0,d).inspectTransactionType();(0,n.expect)(y.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(y.data.createATA).toEqual(d)}),(0,n.it)("fast path: both overrides + SPL instruction, SPL and returns both",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,7n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=e.Keypair.generate().publicKey.toBase58(),d={address:e.Keypair.generate().publicKey.toBase58(),mintAddress:e.Keypair.generate().publicKey.toBase58()},y=await new i.TransactionInspector(o,u,d).inspectTransactionType();(0,n.expect)(y.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(y.data.tokenAddress).toBe(u),(0,n.expect)(y.data.createATA).toEqual(d)})});
1
+ "use strict";var a=require("@solana/spl-token"),e=require("@solana/web3.js"),n=require("vitest"),T=require("../../app-binder/services/bs58Encoder"),i=require("./TransactionInspector");const A=T.DefaultBs58Encoder.encode(new Uint8Array(32).fill(170));function p(t,s,c){const r=c??s[0]??e.Keypair.generate(),o=new e.Transaction;o.recentBlockhash=A,o.feePayer=r.publicKey,o.add(...t);const u=new Set,d=[r,...s].filter(y=>{const l=y.publicKey.toBase58();return u.has(l)?!1:(u.add(l),!0)});return o.sign(...d),{raw:o.serialize(),payer:r}}(0,n.describe)("TransactionInspector",()=>{(0,n.it)("falls back to STANDARD for a plain SystemProgram transfer",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:s,lamports:1e3}),{raw:r}=p([c],[t],t),o=await new i.TransactionInspector().inspectTransactionType(r);(0,n.expect)(o.transactionType).toBe(i.SolanaTransactionTypes.STANDARD),(0,n.expect)(o.data).toEqual({})}),(0,n.it)("detects an SPL Transfer and returns the destination address",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,42n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector().inspectTransactionType(o);(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.tokenAddress).toBe(c.toBase58())}),(0,n.it)("detects an SPL TransferChecked and returns the destination address",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createTransferCheckedInstruction)(c,s,r,t.publicKey,123n,0,[],a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector().inspectTransactionType(u);(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.tokenAddress).toBe(r.toBase58())}),(0,n.it)("detects InitializeAccount and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createInitializeAccountInstruction)(c,s,r,a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector().inspectTransactionType(u);(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects InitializeAccount2 and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createInitializeAccount2Instruction)(c,s,r,a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector().inspectTransactionType(u);(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects InitializeAccount3 and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createInitializeAccount3Instruction)(c,s,a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector().inspectTransactionType(o);(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects ATA creation via Associated Token Program (classic TOKEN program)",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector().inspectTransactionType(u);(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:s.toBase58(),mintAddress:c.toBase58()})}),(0,n.it)("detects ATA creation via Associated Token Program (TOKEN-2022 program)",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_2022_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_2022_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector().inspectTransactionType(u);(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:s.toBase58(),mintAddress:c.toBase58()})}),(0,n.it)("detects CloseAccount and returns the closed token account",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createCloseAccountInstruction)(s,c,t.publicKey),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector().inspectTransactionType(o);(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.tokenAddress).toBe(s.toBase58())}),(0,n.it)("detects SyncNative and returns the WSOL account",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=(0,a.createSyncNativeInstruction)(s,a.TOKEN_PROGRAM_ID),{raw:r}=p([c],[t],t),o=await new i.TransactionInspector().inspectTransactionType(r);(0,n.expect)(o.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(o.data.tokenAddress).toBe(s.toBase58())}),(0,n.it)("marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)",async()=>{const t=e.Keypair.generate(),s=new e.TransactionInstruction({programId:a.TOKEN_PROGRAM_ID,keys:[],data:Buffer.from([])}),{raw:c}=p([s],[t],t),r=await new i.TransactionInspector().inspectTransactionType(c);(0,n.expect)(r.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(r.data).toEqual({})}),(0,n.it)("falls back to STANDARD if the payload is unparseable",async()=>{const t=new Uint8Array([171,173,190,239]),s=await new i.TransactionInspector().inspectTransactionType(t);(0,n.expect)(s.transactionType).toBe(i.SolanaTransactionTypes.STANDARD),(0,n.expect)(s.data).toEqual({})}),(0,n.it)("fast path: tokenAddress override + SPL instruction, SPL and returns override",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,1n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=e.Keypair.generate().publicKey.toBase58(),d=await new i.TransactionInspector().inspectTransactionType(o,u);(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.tokenAddress).toBe(u)}),(0,n.it)("fast path: createATA override + ATA instruction, SPL and returns override",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d={address:e.Keypair.generate().publicKey.toBase58(),mintAddress:e.Keypair.generate().publicKey.toBase58()},y=await new i.TransactionInspector().inspectTransactionType(u,void 0,d);(0,n.expect)(y.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(y.data.createATA).toEqual(d)}),(0,n.it)("fast path: both overrides + SPL instruction, SPL and returns both",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,7n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=e.Keypair.generate().publicKey.toBase58(),d={address:e.Keypair.generate().publicKey.toBase58(),mintAddress:e.Keypair.generate().publicKey.toBase58()},y=await new i.TransactionInspector().inspectTransactionType(o,u,d);(0,n.expect)(y.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(y.data.tokenAddress).toBe(u),(0,n.expect)(y.data.createATA).toEqual(d)})});
2
2
  //# sourceMappingURL=TransactionInspector.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.test.ts"],
4
- "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n createInitializeAccount2Instruction,\n createInitializeAccount3Instruction,\n createInitializeAccountInstruction,\n createSyncNativeInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { DefaultBs58Encoder } from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = DefaultBs58Encoder.encode(\n new Uint8Array(32).fill(0xaa),\n);\n\nfunction makeSignedRawTx(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniqueSigners = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniqueSigners);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", async () => {\n // given\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n });\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", async () => {\n // given\n const owner = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner.publicKey,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects InitializeAccount and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount2 and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount2Instruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount3 and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount3Instruction(\n newAccount,\n mint,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (classic TOKEN program)\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (TOKEN-2022 program)\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata22 = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata22,\n owner,\n mint,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects CloseAccount and returns the closed token account\", async () => {\n // given\n const owner = Keypair.generate();\n const account = Keypair.generate().publicKey;\n const dest = Keypair.generate().publicKey;\n\n const instruction = createCloseAccountInstruction(\n account,\n dest,\n owner.publicKey,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"detects SyncNative and returns the WSOL account\", async () => {\n // given\n const payer = Keypair.generate();\n const account = Keypair.generate().publicKey;\n\n const instruction = createSyncNativeInstruction(account, TOKEN_PROGRAM_ID);\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)\", async () => {\n // given\n const payer = Keypair.generate();\n const bogusIx = new TransactionInstruction({\n programId: TOKEN_PROGRAM_ID,\n keys: [],\n data: Buffer.from([]),\n });\n\n const { raw } = makeSignedRawTx([bogusIx], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data).toEqual({});\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", async () => {\n // given\n const garbage = new Uint8Array([0xab, 0xad, 0xbe, 0xef]);\n\n // when\n const result = await new TransactionInspector(\n garbage,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"fast path: tokenAddress override + SPL instruction, SPL and returns override\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 1n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const overrideToken = Keypair.generate().publicKey.toBase58();\n\n // when\n const result = await new TransactionInspector(\n raw,\n overrideToken,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(overrideToken);\n });\n\n it(\"fast path: createATA override + ATA instruction, SPL and returns override\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const overrideATA = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n // when\n const result = await new TransactionInspector(\n raw,\n undefined,\n overrideATA,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual(overrideATA);\n });\n\n it(\"fast path: both overrides + SPL instruction, SPL and returns both\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 7n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const tokenOverride = Keypair.generate().publicKey.toBase58();\n const ataOverride = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n // when\n const result = await new TransactionInspector(\n raw,\n tokenOverride,\n ataOverride,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(tokenOverride);\n expect(result.data.createATA).toEqual(ataOverride);\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n createInitializeAccount2Instruction,\n createInitializeAccount3Instruction,\n createInitializeAccountInstruction,\n createSyncNativeInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { DefaultBs58Encoder } from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = DefaultBs58Encoder.encode(\n new Uint8Array(32).fill(0xaa),\n);\n\nfunction makeSignedRawTx(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniqueSigners = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniqueSigners);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", async () => {\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n });\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", async () => {\n const owner = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner.publicKey,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects InitializeAccount and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount2 and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount2Instruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount3 and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount3Instruction(\n newAccount,\n mint,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (classic TOKEN program)\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (TOKEN-2022 program)\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata22 = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata22,\n owner,\n mint,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects CloseAccount and returns the closed token account\", async () => {\n const owner = Keypair.generate();\n const account = Keypair.generate().publicKey;\n const dest = Keypair.generate().publicKey;\n\n const instruction = createCloseAccountInstruction(\n account,\n dest,\n owner.publicKey,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"detects SyncNative and returns the WSOL account\", async () => {\n const payer = Keypair.generate();\n const account = Keypair.generate().publicKey;\n\n const instruction = createSyncNativeInstruction(account, TOKEN_PROGRAM_ID);\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)\", async () => {\n const payer = Keypair.generate();\n const bogusIx = new TransactionInstruction({\n programId: TOKEN_PROGRAM_ID,\n keys: [],\n data: Buffer.from([]),\n });\n\n const { raw } = makeSignedRawTx([bogusIx], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data).toEqual({});\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", async () => {\n const garbage = new Uint8Array([0xab, 0xad, 0xbe, 0xef]);\n\n const result = await new TransactionInspector().inspectTransactionType(\n garbage,\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"fast path: tokenAddress override + SPL instruction, SPL and returns override\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 1n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const overrideToken = Keypair.generate().publicKey.toBase58();\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n overrideToken, // tokenAddress override\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(overrideToken);\n });\n\n it(\"fast path: createATA override + ATA instruction, SPL and returns override\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const overrideATA = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n undefined, // no tokenAddress override\n overrideATA, // createATA override\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual(overrideATA);\n });\n\n it(\"fast path: both overrides + SPL instruction, SPL and returns both\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 7n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const tokenOverride = Keypair.generate().publicKey.toBase58();\n const ataOverride = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n tokenOverride,\n ataOverride,\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(tokenOverride);\n expect(result.data.createATA).toEqual(ataOverride);\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_spl_token", "import_web3", "import_vitest", "import_bs58Encoder", "import_TransactionInspector", "DUMMY_BLOCKHASH", "makeSignedRawTx", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniqueSigners", "kp", "k", "dest", "instruction", "raw", "result", "owner", "source", "destination", "mint", "newAccount", "ata", "ata22", "account", "bogusIx", "garbage", "overrideToken", "overrideATA", "tokenOverride", "ataOverride"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var a in e)o(r,a,{get:e[a],enumerable:!0})},p=(r,e,a,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of m(e))!l.call(r,s)&&s!==a&&o(r,s,{get:()=>e[s],enumerable:!(i=t(e,s))||i.enumerable});return r};var g=r=>p(o({},"__esModule",{value:!0}),r);var y={};c(y,{DefaultSolanaMessageNormaliser:()=>M});module.exports=g(y);var n=require("../../../app-binder/services/TransactionInspector");class M{static async normaliseMessage(e){return n.TransactionInspector.normaliseMessage(e)}}0&&(module.exports={DefaultSolanaMessageNormaliser});
2
+ //# sourceMappingURL=DefaultSolanaMessageNormaliser.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.ts"],
4
+ "sourcesContent": ["import type { NormalizedMessage } from \"@internal/app-binder/services/TransactionInspector\";\nimport { TransactionInspector } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport interface SolanaMessageNormaliserConstructor {\n normaliseMessage(rawBytes: Uint8Array): Promise<NormalizedMessage>;\n}\n\nexport class DefaultSolanaMessageNormaliser {\n static async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n return TransactionInspector.normaliseMessage(rawBytes);\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAqC,8DAM9B,MAAMF,CAA+B,CAC1C,aAAa,iBACXG,EAC4B,CAC5B,OAAO,uBAAqB,iBAAiBA,CAAQ,CACvD,CACF",
6
+ "names": ["DefaultSolanaMessageNormaliser_exports", "__export", "DefaultSolanaMessageNormaliser", "__toCommonJS", "import_TransactionInspector", "rawBytes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var b=Object.create;var d=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var I=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var h=(e,a,i,o)=>{if(a&&typeof a=="object"||typeof a=="function")for(let n of P(a))!B.call(e,n)&&n!==i&&d(e,n,{get:()=>a[n],enumerable:!(o=f(a,n))||o.enumerable});return e};var w=(e,a,i)=>(i=e!=null?b(I(e)):{},h(a||!e||!e.__esModule?d(i,"default",{value:e,enumerable:!0}):i,e));var r=require("@solana/web3.js"),K=w(require("bs58")),t=require("vitest"),m=require("./DefaultSolanaMessageNormaliser");const x=K.default.encode(new Uint8Array(32).fill(170));function g(e,a,i){const o=i??a[0]??r.Keypair.generate(),n=new r.Transaction;n.recentBlockhash=x,n.feePayer=o.publicKey,n.add(...e);const s=new Set,c=[o,...a].filter(l=>{const u=l.publicKey.toBase58();return s.has(u)?!1:(s.add(u),!0)});return n.sign(...c),{raw:n.serialize(),payer:o}}(0,t.describe)("DefaultSolanaMessageNormaliser",()=>{(0,t.it)("normalises a legacy tx with multiple SystemProgram.transfer instructions preserving order",async()=>{const e=r.Keypair.generate(),a=[r.Keypair.generate(),r.Keypair.generate(),r.Keypair.generate()],i=1234,o=a.map(c=>r.SystemProgram.transfer({fromPubkey:e.publicKey,toPubkey:c.publicKey,lamports:i})),{raw:n}=g(o,[e],e),s=await m.DefaultSolanaMessageNormaliser.normaliseMessage(n);(0,t.expect)(s.compiledInstructions).toHaveLength(o.length);for(let c=0;c<o.length;c++){const l=s.compiledInstructions[c],u=s.allKeys[l.programIdIndex];(0,t.expect)(u.equals(r.SystemProgram.programId)).toBe(!0);const p=l.accountKeyIndexes.map(y=>s.allKeys[y]);(0,t.expect)(p[0].equals(e.publicKey)).toBe(!0),(0,t.expect)(p[1].equals(a[c].publicKey)).toBe(!0),(0,t.expect)(l.data instanceof Uint8Array).toBe(!0),(0,t.expect)(l.data.length).toBeGreaterThan(0)}}),(0,t.it)("can be used via the SolanaMessageNormaliserConstructor interface",async()=>{const e=r.Keypair.generate(),a=r.Keypair.generate(),i=r.SystemProgram.transfer({fromPubkey:e.publicKey,toPubkey:a.publicKey,lamports:1e3}),{raw:o}=g([i],[e],e),s=await m.DefaultSolanaMessageNormaliser.normaliseMessage(o);(0,t.expect)(s.compiledInstructions).toHaveLength(1);const c=s.compiledInstructions[0],l=s.allKeys[c.programIdIndex];(0,t.expect)(l.equals(r.SystemProgram.programId)).toBe(!0);const u=c.accountKeyIndexes.map(p=>s.allKeys[p]);(0,t.expect)(u[0].equals(e.publicKey)).toBe(!0),(0,t.expect)(u[1].equals(a.publicKey)).toBe(!0)}),(0,t.it)("handles single-instruction tx and preserves indices mapping",async()=>{const e=r.Keypair.generate(),a=r.Keypair.generate(),o=r.SystemProgram.transfer({fromPubkey:e.publicKey,toPubkey:a.publicKey,lamports:5}),{raw:n}=g([o],[e],e),s=await m.DefaultSolanaMessageNormaliser.normaliseMessage(n);(0,t.expect)(Array.isArray(s.allKeys)).toBe(!0),(0,t.expect)(s.allKeys.length).toBeGreaterThanOrEqual(3);const c=s.compiledInstructions[0],l=s.allKeys[c.programIdIndex];(0,t.expect)(l.equals(r.SystemProgram.programId)).toBe(!0);const[u,p]=c.accountKeyIndexes.map(y=>s.allKeys[y]);(0,t.expect)(u.equals(e.publicKey)).toBe(!0),(0,t.expect)(p.equals(a.publicKey)).toBe(!0)})});
2
+ //# sourceMappingURL=DefaultSolanaMessageNormaliser.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.ts"],
4
+ "sourcesContent": ["import {\n Keypair,\n type PublicKey,\n SystemProgram,\n Transaction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n DefaultSolanaMessageNormaliser,\n type SolanaMessageNormaliserConstructor,\n} from \"./DefaultSolanaMessageNormaliser\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(0xaa));\n\nfunction makeSignedRawTx(\n instructions: Parameters<Transaction[\"add\"]>[0][],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...instructions);\n\n // unique signers: fee payer first\n const seen = new Set<string>();\n const uniq = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniq);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"DefaultSolanaMessageNormaliser\", () => {\n it(\"normalises a legacy tx with multiple SystemProgram.transfer instructions preserving order\", async () => {\n // given\n const payer = Keypair.generate();\n const recipients = [\n Keypair.generate(),\n Keypair.generate(),\n Keypair.generate(),\n ];\n const lamports = 1234;\n\n const instructions = recipients.map((r) =>\n SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: r.publicKey,\n lamports,\n }),\n );\n\n const { raw } = makeSignedRawTx(instructions, [payer], payer);\n\n // when\n const msg = await DefaultSolanaMessageNormaliser.normaliseMessage(raw);\n\n // then\n // same number of compiled instructions\n expect(msg.compiledInstructions).toHaveLength(instructions.length);\n\n for (let i = 0; i < instructions.length; i++) {\n const compiled = msg.compiledInstructions[i]!;\n const programId = msg.allKeys[compiled.programIdIndex]!;\n // program resolves to SystemProgram\n expect(programId.equals(SystemProgram.programId)).toBe(true);\n\n // accounts resolve to [from, to] in order\n const accounts = compiled.accountKeyIndexes.map(\n (idx) => msg.allKeys[idx]!,\n );\n expect((accounts[0] as PublicKey).equals(payer.publicKey)).toBe(true);\n expect((accounts[1] as PublicKey).equals(recipients[i]!.publicKey)).toBe(\n true,\n );\n\n // data is present (SystemProgram.transfer has non-empty data)\n expect(compiled.data instanceof Uint8Array).toBe(true);\n expect(compiled.data.length).toBeGreaterThan(0);\n }\n });\n\n it(\"can be used via the SolanaMessageNormaliserConstructor interface\", async () => {\n // given\n const payer = Keypair.generate();\n const recipient = Keypair.generate();\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: recipient.publicKey,\n lamports: 1_000,\n });\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when (note: using the class as a static 'constructor-like' value)\n const Normaliser: SolanaMessageNormaliserConstructor =\n DefaultSolanaMessageNormaliser;\n const msg = await Normaliser.normaliseMessage(raw);\n\n // then\n expect(msg.compiledInstructions).toHaveLength(1);\n const compiled = msg.compiledInstructions[0]!;\n const programId = msg.allKeys[compiled.programIdIndex]!;\n expect(programId.equals(SystemProgram.programId)).toBe(true);\n\n const accounts = compiled.accountKeyIndexes.map((i) => msg.allKeys[i]!);\n expect((accounts[0] as PublicKey).equals(payer.publicKey)).toBe(true);\n expect((accounts[1] as PublicKey).equals(recipient.publicKey)).toBe(true);\n });\n\n it(\"handles single-instruction tx and preserves indices mapping\", async () => {\n // given\n const payer = Keypair.generate();\n const recipient = Keypair.generate();\n const lamports = 5;\n\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: recipient.publicKey,\n lamports,\n });\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const msg = await DefaultSolanaMessageNormaliser.normaliseMessage(raw);\n\n // then\n expect(Array.isArray(msg.allKeys)).toBe(true);\n expect(msg.allKeys.length).toBeGreaterThanOrEqual(3);\n\n const compiled = msg.compiledInstructions[0]!;\n const resolvedPid = msg.allKeys[compiled.programIdIndex]!;\n expect(resolvedPid.equals(SystemProgram.programId)).toBe(true);\n\n const [fromPk, toPk] = compiled.accountKeyIndexes.map(\n (i) => msg.allKeys[i]!,\n );\n expect((fromPk as PublicKey).equals(payer.publicKey)).toBe(true);\n expect((toPk as PublicKey).equals(recipient.publicKey)).toBe(true);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_web3", "import_bs58", "import_vitest", "import_DefaultSolanaMessageNormaliser", "DUMMY_BLOCKHASH", "bs58", "makeSignedRawTx", "instructions", "signers", "feePayer", "payer", "tx", "seen", "uniq", "kp", "k", "recipients", "lamports", "r", "raw", "msg", "i", "compiled", "programId", "accounts", "idx", "recipient", "instruction", "resolvedPid", "fromPk", "toPk"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var C=(n,t)=>{for(var o in t)i(n,o,{get:t[o],enumerable:!0})},g=(n,t,o,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of u(t))!p.call(n,e)&&e!==o&&i(n,e,{get:()=>t[e],enumerable:!(a=d(t,e))||a.enumerable});return n};var m=n=>g(i({},"__esModule",{value:!0}),n);var A={};C(A,{BuildTransactionContextTask:()=>f});module.exports=m(A);var c=require("@ledgerhq/device-management-kit"),l=require("../../app-binder/command/GetChallengeCommand");class f{constructor(t,o){this.api=t;this.args=o}async run(){const{contextModule:t,options:o}=this.args,a=this.api.getDeviceSessionState();let e;const s=await this.api.sendCommand(new l.GetChallengeCommand);return(0,c.isSuccessCommandResult)(s)&&(e=s.data.challenge),(await t.getSolanaContext({deviceModelId:a.deviceModelId,tokenAddress:o.tokenAddress,challenge:e,createATA:o.createATA})).caseOf({Left:r=>{throw r},Right:r=>({challenge:e,descriptor:r.descriptor,addressResult:{tokenAccount:r.tokenAccount,owner:r.owner,contract:r.contract},calCertificate:r.certificate})})}}0&&(module.exports={BuildTransactionContextTask});
1
+ "use strict";var s=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var x=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},C=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of u(e))!p.call(o,a)&&a!==t&&s(o,a,{get:()=>e[a],enumerable:!(r=g(e,a))||r.enumerable});return o};var m=o=>C(s({},"__esModule",{value:!0}),o);var y={};x(y,{BuildTransactionContextTask:()=>h});module.exports=m(y);var d=require("@ledgerhq/device-management-kit"),c=require("../../app-binder/command/GetChallengeCommand");class h{constructor(e,t){this.api=e;this.args=t;this._logger=t.loggerFactory("BuildTransactionContextTask")}_logger;async run(){this._logger.debug("[run] Starting BuildTransactionContextTask");const{contextModule:e,options:t}=this.args,r=this.api.getDeviceSessionState();let a;const l=await this.api.sendCommand(new c.GetChallengeCommand);if((0,d.isSuccessCommandResult)(l))a=l.data.challenge;else throw new Error("Failed to get challenge from device");const i={deviceModelId:r.deviceModelId,tokenAddress:t.tokenAddress,challenge:a,createATA:t.createATA,tokenInternalId:t.tokenInternalId,templateId:t.templateId};return this._logger.debug("[run] Calling contextModule.getSolanaContext",{data:{args:i}}),(await e.getSolanaContext(i)).caseOf({Left:n=>{throw this._logger.error("[run] Solana context result",{data:{error:{message:n.message,name:n.name,stack:n.stack}}}),n},Right:n=>(this._logger.debug("[run] Solana context result",{data:{result:n}}),n)})}}0&&(module.exports={BuildTransactionContextTask});
2
2
  //# sourceMappingURL=BuildTransactionContextTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.ts"],
4
- "sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n challenge: string | undefined;\n addressResult: {\n tokenAccount: string;\n owner: string;\n contract: string;\n };\n calCertificate: PkiCertificate;\n descriptor: Uint8Array;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionResolutionContext;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {}\n\n async run(): Promise<SolanaBuildContextResult> {\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // get Solana context\n const contextResult = await contextModule.getSolanaContext({\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n challenge,\n descriptor: ctx.descriptor,\n addressResult: {\n tokenAccount: ctx.tokenAccount,\n owner: ctx.owner,\n contract: ctx.contract,\n },\n calCertificate: ctx.certificate,\n };\n },\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAGO,2CAGPC,EAAoC,4DAkB7B,MAAMH,CAA4B,CACvC,YACmBI,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAyC,CAC7C,KAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAI,KAAK,KAClCC,EAAc,KAAK,IAAI,sBAAsB,EAGnD,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAI,qBAAqB,EACzE,SAAI,0BAAuBA,CAAY,IACrCD,EAAYC,EAAa,KAAK,YAIV,MAAMJ,EAAc,iBAAiB,CACzD,cAAeE,EAAY,cAC3B,aAAcD,EAAQ,aACtB,UAAAE,EACA,UAAWF,EAAQ,SACrB,CAAC,GAEoB,OAAO,CAC1B,KAAOI,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,IACC,CACL,UAAAH,EACA,WAAYG,EAAI,WAChB,cAAe,CACb,aAAcA,EAAI,aAClB,MAAOA,EAAI,MACX,SAAUA,EAAI,QAChB,EACA,eAAgBA,EAAI,WACtB,EAEJ,CAAC,CACH,CACF",
6
- "names": ["BuildTransactionContextTask_exports", "__export", "BuildTransactionContextTask", "__toCommonJS", "import_device_management_kit", "import_GetChallengeCommand", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "err", "ctx"]
4
+ "sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n type SolanaContextLoaderResults,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n trustedNamePKICertificate: PkiCertificate;\n tlvDescriptor: Uint8Array;\n loadersResults: SolanaContextLoaderResults;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionResolutionContext;\n readonly loggerFactory: (tag: string) => LoggerPublisherService;\n};\n\nexport class BuildTransactionContextTask {\n private readonly _logger: LoggerPublisherService;\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {\n this._logger = args.loggerFactory(\"BuildTransactionContextTask\");\n }\n\n async run(): Promise<SolanaBuildContextResult> {\n this._logger.debug(\"[run] Starting BuildTransactionContextTask\");\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n } else {\n throw new Error(\"Failed to get challenge from device\");\n }\n\n const contextModuleGetSolanaContextArgs = {\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n tokenInternalId: options.tokenInternalId,\n templateId: options.templateId,\n };\n // get Solana context\n this._logger.debug(\"[run] Calling contextModule.getSolanaContext\", {\n data: {\n args: contextModuleGetSolanaContextArgs,\n },\n });\n const contextResult = await contextModule.getSolanaContext(\n contextModuleGetSolanaContextArgs,\n );\n\n return contextResult.caseOf({\n Left: (err) => {\n this._logger.error(\"[run] Solana context result\", {\n data: {\n error: {\n message: err.message,\n name: err.name,\n stack: err.stack,\n },\n },\n });\n throw err;\n },\n Right: (ctx) => {\n this._logger.debug(\"[run] Solana context result\", {\n data: {\n result: ctx,\n },\n });\n return ctx;\n },\n });\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAKA,IAAAI,EAIO,2CAGPC,EAAoC,4DAc7B,MAAMH,CAA4B,CAEvC,YACmBI,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,EAEjB,KAAK,QAAUA,EAAK,cAAc,6BAA6B,CACjE,CANiB,QAQjB,MAAM,KAAyC,CAC7C,KAAK,QAAQ,MAAM,4CAA4C,EAC/D,KAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAI,KAAK,KAClCC,EAAc,KAAK,IAAI,sBAAsB,EAGnD,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAI,qBAAqB,EACzE,MAAI,0BAAuBA,CAAY,EACrCD,EAAYC,EAAa,KAAK,cAE9B,OAAM,IAAI,MAAM,qCAAqC,EAGvD,MAAMC,EAAoC,CACxC,cAAeH,EAAY,cAC3B,aAAcD,EAAQ,aACtB,UAAAE,EACA,UAAWF,EAAQ,UACnB,gBAAiBA,EAAQ,gBACzB,WAAYA,EAAQ,UACtB,EAEA,YAAK,QAAQ,MAAM,+CAAgD,CACjE,KAAM,CACJ,KAAMI,CACR,CACF,CAAC,GACqB,MAAML,EAAc,iBACxCK,CACF,GAEqB,OAAO,CAC1B,KAAOC,GAAQ,CACb,WAAK,QAAQ,MAAM,8BAA+B,CAChD,KAAM,CACJ,MAAO,CACL,QAASA,EAAI,QACb,KAAMA,EAAI,KACV,MAAOA,EAAI,KACb,CACF,CACF,CAAC,EACKA,CACR,EACA,MAAQC,IACN,KAAK,QAAQ,MAAM,8BAA+B,CAChD,KAAM,CACJ,OAAQA,CACV,CACF,CAAC,EACMA,EAEX,CAAC,CACH,CACF",
6
+ "names": ["BuildTransactionContextTask_exports", "__export", "BuildTransactionContextTask", "__toCommonJS", "import_device_management_kit", "import_GetChallengeCommand", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "contextModuleGetSolanaContextArgs", "err", "ctx"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var n=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),e=require("vitest"),i=require("../../app-binder/command/GetChallengeCommand"),l=require("./BuildTransactionContextTask");const a={getSolanaContext:e.vi.fn()},d={contextModule:a,options:{tokenAddress:"someAddress",createATA:void 0}},t={descriptor:new Uint8Array([1,2,3]),tokenAccount:"someTokenAccount",owner:"someOwner",contract:"someContract",certificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1}};let o;(0,e.describe)("BuildTransactionContextTask",()=>{(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),o={getDeviceSessionState:e.vi.fn().mockReturnValue({deviceModelId:n.DeviceModelId.NANO_X}),sendCommand:e.vi.fn().mockResolvedValue({status:n.CommandResultStatus.Success,data:{challenge:"someChallenge"}})}}),(0,e.it)("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue((0,c.Right)(t));const s=await new l.BuildTransactionContextTask(o,d).run();(0,e.expect)(o.sendCommand).toHaveBeenCalledWith(e.expect.any(i.GetChallengeCommand)),(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:n.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),(0,e.expect)(s).toEqual({challenge:"someChallenge",descriptor:t.descriptor,calCertificate:t.certificate,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract}})}),(0,e.it)("returns context when challenge command fails",async()=>{o.sendCommand.mockResolvedValue({status:n.CommandResultStatus.Error,data:{}}),a.getSolanaContext.mockResolvedValue((0,c.Right)(t));const s=await new l.BuildTransactionContextTask(o,d).run();(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:n.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:void 0,createATA:void 0}),(0,e.expect)(s).toEqual({challenge:void 0,descriptor:t.descriptor,calCertificate:t.certificate,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract}})}),(0,e.it)("throws if getSolanaContext returns Left",async()=>{const r=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue((0,c.Left)(r));const s=new l.BuildTransactionContextTask(o,d);await(0,e.expect)(s.run()).rejects.toThrow("Solana context failure")})});
1
+ "use strict";var o=require("@ledgerhq/device-management-kit"),n=require("purify-ts"),e=require("vitest"),i=require("../../app-binder/command/GetChallengeCommand"),l=require("./BuildTransactionContextTask");const a={getSolanaContext:e.vi.fn()},u=e.vi.fn(()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn()})),d={contextModule:a,loggerFactory:u,options:{tokenAddress:"someAddress",createATA:void 0}},r={tlvDescriptor:new Uint8Array([1,2,3]),trustedNamePKICertificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1},loadersResults:[]};let t;(0,e.describe)("BuildTransactionContextTask",()=>{(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),t={getDeviceSessionState:e.vi.fn().mockReturnValue({deviceModelId:o.DeviceModelId.NANO_X}),sendCommand:e.vi.fn().mockResolvedValue({status:o.CommandResultStatus.Success,data:{challenge:"someChallenge"}})}}),(0,e.it)("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue((0,n.Right)(r));const c=await new l.BuildTransactionContextTask(t,d).run();(0,e.expect)(t.sendCommand).toHaveBeenCalledWith(e.expect.any(i.GetChallengeCommand)),(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:o.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),(0,e.expect)(c).toEqual({tlvDescriptor:r.tlvDescriptor,trustedNamePKICertificate:r.trustedNamePKICertificate,loadersResults:[]})}),(0,e.it)("throws if challenge command fails",async()=>{t.sendCommand.mockResolvedValue({status:o.CommandResultStatus.Error,data:{}}),a.getSolanaContext.mockResolvedValue((0,n.Right)(r));const s=new l.BuildTransactionContextTask(t,d);await(0,e.expect)(s.run()).rejects.toThrow("Failed to get challenge from device")}),(0,e.it)("throws if getSolanaContext returns Left",async()=>{const s=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue((0,n.Left)(s));const c=new l.BuildTransactionContextTask(t,d);await(0,e.expect)(c.run()).rejects.toThrow("Solana context failure")})});
2
2
  //# sourceMappingURL=BuildTransactionContextTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst domainSolanaPayload = {\n descriptor: new Uint8Array([1, 2, 3]),\n tokenAccount: \"someTokenAccount\",\n owner: \"someOwner\",\n contract: \"someContract\",\n certificate: { payload: new Uint8Array([0xaa, 0xbb]), keyUsageNumber: 1 },\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: \"someChallenge\",\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"returns context when challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: undefined,\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: undefined,\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
- "mappings": "aAIA,IAAAA,EAIO,2CACPC,EAA4B,qBAC5BC,EAAqD,kBAErDC,EAAoC,4DAEpCC,EAGO,yCAEP,MAAMC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,CAC1B,EAEMC,EAAc,CAClB,cAAeD,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAAsB,CAC1B,WAAY,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACpC,aAAc,mBACd,MAAO,YACP,SAAU,eACV,YAAa,CAAE,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAAG,eAAgB,CAAE,CAC1E,EAEA,IAAIC,KAEJ,YAAS,8BAA+B,IAAM,IAC5C,cAAW,IAAM,CACf,KAAG,cAAc,EAEjBA,EAAU,CACR,sBAAuB,KACpB,GAAG,EACH,gBAAgB,CAAE,cAAe,gBAAc,MAAO,CAAC,EAC1D,YAAa,KAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQ,sBAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,KAED,MAAG,+DAAgE,SAAY,CAC5EH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAE9B,UAAOE,EAAQ,WAAW,EAAE,qBAC1B,SAAO,IAAI,qBAAmB,CAChC,KAEA,UAAOH,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,KAED,UAAOI,CAAM,EAAE,QAAkC,CAC/C,UAAW,gBACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,KAED,MAAG,+CAAgD,SAAY,CAC5DC,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQ,sBAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAE9B,UAAOD,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,OACX,UAAW,MACb,CAAC,KAED,UAAOI,CAAM,EAAE,QAAkC,CAC/C,UAAW,OACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,KAED,MAAG,0CAA2C,SAAY,CACxD,MAAMG,EAAQ,IAAI,MAAM,wBAAwB,EAC/CL,EAAkB,iBAAyB,qBAAkB,QAAKK,CAAK,CAAC,EAEzE,MAAMC,EAAO,IAAI,8BAA4BH,EAASF,CAAW,EAEjE,QAAM,UAAOK,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
6
- "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_GetChallengeCommand", "import_BuildTransactionContextTask", "contextModuleMock", "defaultArgs", "domainSolanaPayload", "apiMock", "result", "error", "task"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nconst dmkLoggerFactoryMock: (tag: string) => LoggerPublisherService = vi.fn(\n () =>\n ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n }) as any,\n);\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n loggerFactory: dmkLoggerFactoryMock,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst solanaContextRightPayload = {\n tlvDescriptor: new Uint8Array([1, 2, 3]),\n trustedNamePKICertificate: {\n payload: new Uint8Array([0xaa, 0xbb]),\n keyUsageNumber: 1,\n },\n loadersResults: [], // required by the task's return type\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(solanaContextRightPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n // challenge is fetched\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n // getSolanaContext called with challenge\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n // matches SolanaBuildContextResult shape\n expect(result).toEqual<SolanaBuildContextResult>({\n tlvDescriptor: solanaContextRightPayload.tlvDescriptor,\n trustedNamePKICertificate:\n solanaContextRightPayload.trustedNamePKICertificate,\n loadersResults: [],\n });\n });\n\n it(\"throws if challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(solanaContextRightPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\n \"Failed to get challenge from device\",\n );\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
+ "mappings": "aAIA,IAAAA,EAKO,2CACPC,EAA4B,qBAC5BC,EAAqD,kBAErDC,EAAoC,4DAEpCC,EAGO,yCAEP,MAAMC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,CAC1B,EAEMC,EAAgE,KAAG,GACvE,KACG,CACC,MAAO,KAAG,GAAG,EACb,KAAM,KAAG,GAAG,EACZ,KAAM,KAAG,GAAG,EACZ,MAAO,KAAG,GAAG,CACf,EACJ,EAEMC,EAAc,CAClB,cAAeF,EACf,cAAeC,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAA4B,CAChC,cAAe,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACvC,0BAA2B,CACzB,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACpC,eAAgB,CAClB,EACA,eAAgB,CAAC,CACnB,EAEA,IAAIC,KAEJ,YAAS,8BAA+B,IAAM,IAC5C,cAAW,IAAM,CACf,KAAG,cAAc,EAEjBA,EAAU,CACR,sBAAuB,KACpB,GAAG,EACH,gBAAgB,CAAE,cAAe,gBAAc,MAAO,CAAC,EAC1D,YAAa,KAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQ,sBAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,KAED,MAAG,+DAAgE,SAAY,CAC5EJ,EAAkB,iBAAyB,qBAC1C,SAAMG,CAAyB,CACjC,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAG9B,UAAOE,EAAQ,WAAW,EAAE,qBAC1B,SAAO,IAAI,qBAAmB,CAChC,KAGA,UAAOJ,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,KAGD,UAAOK,CAAM,EAAE,QAAkC,CAC/C,cAAeF,EAA0B,cACzC,0BACEA,EAA0B,0BAC5B,eAAgB,CAAC,CACnB,CAAC,CACH,CAAC,KAED,MAAG,oCAAqC,SAAY,CACjDC,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQ,sBAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAJ,EAAkB,iBAAyB,qBAC1C,SAAMG,CAAyB,CACjC,EAEA,MAAMG,EAAO,IAAI,8BAA4BF,EAASF,CAAW,EAEjE,QAAM,UAAOI,EAAK,IAAI,CAAC,EAAE,QAAQ,QAC/B,qCACF,CACF,CAAC,KAED,MAAG,0CAA2C,SAAY,CACxD,MAAMC,EAAQ,IAAI,MAAM,wBAAwB,EAC/CP,EAAkB,iBAAyB,qBAAkB,QAAKO,CAAK,CAAC,EAEzE,MAAMD,EAAO,IAAI,8BAA4BF,EAASF,CAAW,EAEjE,QAAM,UAAOI,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_GetChallengeCommand", "import_BuildTransactionContextTask", "contextModuleMock", "dmkLoggerFactoryMock", "defaultArgs", "solanaContextRightPayload", "apiMock", "result", "task", "error"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var C=(o,t)=>{for(var e in t)i(o,e,{get:t[e],enumerable:!0})},f=(o,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of l(t))!y.call(o,r)&&r!==e&&i(o,r,{get:()=>t[r],enumerable:!(a=d(t,r))||a.enumerable});return o};var u=o=>f(i({},"__esModule",{value:!0}),o);var P={};C(P,{ProvideSolanaTransactionContextTask:()=>v});module.exports=u(P);var n=require("@ledgerhq/device-management-kit"),s=require("purify-ts"),m=require("../../app-binder/command/ProvideTLVDescriptorCommand"),c=require("../../app-binder/command/ProvideTrustedNamePKICommand");class v{constructor(t,e){this.api=t;this.context=e}async run(){const{descriptor:t,certificate:e}=this.context,{payload:a}=e,r=await this.api.sendCommand(new c.ProvideTrustedNamePKICommand({pkiBlob:a}));if(!(0,n.isSuccessCommandResult)(r))throw r;const p=await this.api.sendCommand(new m.ProvideTLVDescriptorCommand({payload:t}));if(!(0,n.isSuccessCommandResult)(p))throw p;return s.Nothing}}0&&(module.exports={ProvideSolanaTransactionContextTask});
1
+ "use strict";var g=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var x=(i,e)=>{for(var a in e)g(i,a,{get:e[a],enumerable:!0})},w=(i,e,a,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of v(e))!T.call(i,r)&&r!==a&&g(i,r,{get:()=>e[r],enumerable:!(t=k(e,r))||t.enumerable});return i};var h=i=>w(g({},"__esModule",{value:!0}),i);var L={};x(L,{ProvideSolanaTransactionContextTask:()=>A,SWAP_MODE:()=>C});module.exports=h(L);var s=require("@ledgerhq/context-module"),n=require("@ledgerhq/device-management-kit"),y=require("purify-ts"),p=require("../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand"),S=require("../../app-binder/command/ProvideTLVDescriptorCommand"),f=require("../../app-binder/services/utils/DefaultSolanaMessageNormaliser");const C="test";class A{constructor(e,a){this.api=e;this.args=a;this._logger=a.loggerFactory("ProvideSolanaTransactionContextTask"),this._normaliser=a.normaliser??f.DefaultSolanaMessageNormaliser}_logger;_normaliser;async run(){this._logger.debug("[run] Starting ProvideSolanaTransactionContextTask");const{tlvDescriptor:e,trustedNamePKICertificate:a,loadersResults:t,transactionBytes:r}=this.args;await this.api.sendCommand(new n.LoadCertificateCommand({certificate:a.payload,keyUsage:a.keyUsageNumber})),await this.api.sendCommand(new S.ProvideTLVDescriptorCommand({payload:e})),this._logger.debug("[run] Providing optional Solana context from loaders",{data:{loadersResults:t}});for(const d of t)switch(d.type){case s.SolanaContextTypes.SOLANA_TOKEN:{const o=t.find(l=>l.type===s.SolanaContextTypes.SOLANA_TOKEN);this._logger.debug(`[run] Providing ${s.SolanaContextTypes.SOLANA_TOKEN}`,{data:{args:{tokenMetadataResult:o}}}),o&&await this.provideTokenMetadataContext(o);break}case s.SolanaContextTypes.SOLANA_LIFI:{const o=t.find(l=>l.type===s.SolanaContextTypes.SOLANA_LIFI);this._logger.debug(`[run] Providing ${s.SolanaContextTypes.SOLANA_LIFI}`,{data:{args:{lifiDescriptorListResult:o,transactionBytes:r}}}),o&&await this.provideSwapContext(o,r);break}case s.SolanaContextTypes.ERROR:{this._logger.debug("[run] Loader result of type ERROR, skipping");break}default:{this._logger.debug("[run] Loader result of unknown type, skipping");break}}return y.Nothing}async provideTokenMetadataContext(e){const{payload:a,certificate:t}=e;if(a&&t){const r=await this.api.sendCommand(new n.LoadCertificateCommand({certificate:t.payload,keyUsage:t.keyUsageNumber}));if(!(0,n.isSuccessCommandResult)(r))throw new Error("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required");await this.api.sendCommand(new p.ProvideTLVTransactionInstructionDescriptorCommand({kind:"descriptor",dataHex:a.solanaTokenDescriptor.data,signatureHex:a.solanaTokenDescriptor.signature,isFirstMessage:!0,swapSignatureTag:!1}))}}async provideSwapContext(e,a){const t=e.payload;if(t){const r=await this._normaliser.normaliseMessage(a);for(const[d,o]of r.compiledInstructions.entries()){const m=r.allKeys[o.programIdIndex]?.toBase58(),c=m?t[m]:void 0,u=c?.signatures?.[C];c&&u?await this.api.sendCommand(new p.ProvideTLVTransactionInstructionDescriptorCommand({kind:"descriptor",dataHex:c.data,signatureHex:u,isFirstMessage:d===0,swapSignatureTag:!0})):await this.api.sendCommand(new p.ProvideTLVTransactionInstructionDescriptorCommand({kind:"empty",isFirstMessage:d===0,swapSignatureTag:!0}))}}}}0&&(module.exports={ProvideSolanaTransactionContextTask,SWAP_MODE});
2
2
  //# sourceMappingURL=ProvideTransactionContextTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.ts"],
4
- "sourcesContent": ["import { type PkiCertificate } from \"@ledgerhq/context-module\";\nimport {\n type CommandErrorResult,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Maybe, Nothing } from \"purify-ts\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTrustedNamePKICommand } from \"@internal/app-binder/command/ProvideTrustedNamePKICommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n\nexport type SolanaContextForDevice = {\n descriptor: Uint8Array;\n certificate: PkiCertificate;\n};\n\nexport class ProvideSolanaTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly context: SolanaContextForDevice,\n ) {}\n\n async run(): Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>> {\n const { descriptor, certificate } = this.context;\n const { payload: certificatePayload } = certificate;\n\n // send CAL certificate + signature\n const pkiResult = await this.api.sendCommand(\n new ProvideTrustedNamePKICommand({\n pkiBlob: certificatePayload,\n }),\n );\n if (!isSuccessCommandResult(pkiResult)) {\n throw pkiResult;\n }\n\n // send signed TLV descriptor\n const tlvResult = await this.api.sendCommand(\n new ProvideTLVDescriptorCommand({ payload: descriptor }),\n );\n if (!isSuccessCommandResult(tlvResult)) {\n throw tlvResult;\n }\n\n return Nothing;\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAIO,2CACPC,EAAoC,qBAEpCC,EAA4C,oEAC5CC,EAA6C,qEAQtC,MAAML,CAAoC,CAC/C,YACmBM,EACAC,EACjB,CAFiB,SAAAD,EACA,aAAAC,CAChB,CAEH,MAAM,KAA+D,CACnE,KAAM,CAAE,WAAAC,EAAY,YAAAC,CAAY,EAAI,KAAK,QACnC,CAAE,QAASC,CAAmB,EAAID,EAGlCE,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAI,+BAA6B,CAC/B,QAASD,CACX,CAAC,CACH,EACA,GAAI,IAAC,0BAAuBC,CAAS,EACnC,MAAMA,EAIR,MAAMC,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAI,8BAA4B,CAAE,QAASJ,CAAW,CAAC,CACzD,EACA,GAAI,IAAC,0BAAuBI,CAAS,EACnC,MAAMA,EAGR,OAAO,SACT,CACF",
6
- "names": ["ProvideTransactionContextTask_exports", "__export", "ProvideSolanaTransactionContextTask", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_ProvideTLVDescriptorCommand", "import_ProvideTrustedNamePKICommand", "api", "context", "descriptor", "certificate", "certificatePayload", "pkiResult", "tlvResult"]
4
+ "sourcesContent": ["import {\n SolanaContextTypes,\n type SolanaLifiContextSuccess,\n type SolanaTokenContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n type CommandErrorResult,\n type InternalApi,\n isSuccessCommandResult,\n LoadCertificateCommand,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Maybe, Nothing } from \"purify-ts\";\n\nimport { ProvideTLVTransactionInstructionDescriptorCommand } from \"@internal/app-binder//command/ProvideTLVTransactionInstructionDescriptorCommand\";\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport {\n DefaultSolanaMessageNormaliser,\n type SolanaMessageNormaliserConstructor,\n} from \"@internal/app-binder/services/utils/DefaultSolanaMessageNormaliser\";\n\nimport { type SolanaBuildContextResult } from \"./BuildTransactionContextTask\";\n\nexport const SWAP_MODE = \"test\";\n\nexport type ProvideSolanaTransactionContextTaskArgs =\n SolanaBuildContextResult & {\n readonly transactionBytes: Uint8Array;\n readonly loggerFactory: (tag: string) => LoggerPublisherService;\n readonly normaliser?: SolanaMessageNormaliserConstructor;\n };\n\nexport class ProvideSolanaTransactionContextTask {\n private readonly _logger: LoggerPublisherService;\n private readonly _normaliser: SolanaMessageNormaliserConstructor;\n constructor(\n private readonly api: InternalApi,\n private readonly args: ProvideSolanaTransactionContextTaskArgs,\n ) {\n this._logger = args.loggerFactory(\"ProvideSolanaTransactionContextTask\");\n this._normaliser = args.normaliser ?? DefaultSolanaMessageNormaliser;\n }\n\n async run(): Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>> {\n this._logger.debug(\"[run] Starting ProvideSolanaTransactionContextTask\");\n const {\n tlvDescriptor,\n trustedNamePKICertificate,\n loadersResults,\n transactionBytes,\n } = this.args;\n\n // --------------------------------------------------------------------\n // providing default solana context\n\n // send PKI certificate + signature\n await this.api.sendCommand(\n new LoadCertificateCommand({\n certificate: trustedNamePKICertificate.payload,\n keyUsage: trustedNamePKICertificate.keyUsageNumber,\n }),\n );\n\n // send signed descriptor\n await this.api.sendCommand(\n new ProvideTLVDescriptorCommand({ payload: tlvDescriptor }),\n );\n\n // --------------------------------------------------------------------\n // providing optional solana context via context module loaders results\n\n this._logger.debug(\"[run] Providing optional Solana context from loaders\", {\n data: { loadersResults },\n });\n for (const loaderResult of loadersResults) {\n switch (loaderResult.type) {\n // always resolve SOLANA_TOKEN first\n case SolanaContextTypes.SOLANA_TOKEN: {\n const tokenMetadataResult = loadersResults.find(\n (res) => res.type === SolanaContextTypes.SOLANA_TOKEN,\n );\n this._logger.debug(\n `[run] Providing ${SolanaContextTypes.SOLANA_TOKEN}`,\n { data: { args: { tokenMetadataResult } } },\n );\n if (tokenMetadataResult) {\n await this.provideTokenMetadataContext(tokenMetadataResult);\n }\n break;\n }\n\n case SolanaContextTypes.SOLANA_LIFI: {\n const lifiDescriptorListResult = loadersResults.find(\n (res) => res.type === SolanaContextTypes.SOLANA_LIFI,\n );\n this._logger.debug(\n `[run] Providing ${SolanaContextTypes.SOLANA_LIFI}`,\n { data: { args: { lifiDescriptorListResult, transactionBytes } } },\n );\n if (lifiDescriptorListResult) {\n await this.provideSwapContext(\n lifiDescriptorListResult,\n transactionBytes,\n );\n }\n break;\n }\n\n case SolanaContextTypes.ERROR: {\n this._logger.debug(`[run] Loader result of type ERROR, skipping`);\n break;\n }\n\n default: {\n this._logger.debug(`[run] Loader result of unknown type, skipping`);\n break;\n }\n }\n }\n\n return Nothing;\n }\n\n private async provideTokenMetadataContext(\n tokenMetadataResult: SolanaTokenContextSuccess,\n ): Promise<void> {\n const {\n payload: tokenMetadataPayload,\n certificate: tokenMetadataCertificate,\n } = tokenMetadataResult;\n\n if (tokenMetadataPayload && tokenMetadataCertificate) {\n // send token metadata certificate\n const tokenMetadataCertificateToDeviceResult = await this.api.sendCommand(\n new LoadCertificateCommand({\n certificate: tokenMetadataCertificate.payload,\n keyUsage: tokenMetadataCertificate.keyUsageNumber,\n }),\n );\n if (!isSuccessCommandResult(tokenMetadataCertificateToDeviceResult)) {\n // IMPORTANT, TO BE MAPPED TO LatestFirmwareVersionRequired(\"LatestFirmwareVersionRequired\") ERROR\n throw new Error(\n \"[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required\",\n );\n }\n\n // send token metadata signed descriptor\n await this.api.sendCommand(\n new ProvideTLVTransactionInstructionDescriptorCommand({\n kind: \"descriptor\",\n dataHex: tokenMetadataPayload.solanaTokenDescriptor.data,\n signatureHex: tokenMetadataPayload.solanaTokenDescriptor.signature,\n // token metadata is a single chunk, so this is always the first message\n isFirstMessage: true,\n swapSignatureTag: false,\n }),\n );\n }\n }\n\n private async provideSwapContext(\n lifiDescriptorListResult: SolanaLifiContextSuccess,\n transactionBytes: Uint8Array,\n ): Promise<void> {\n const lifiDescriptors = lifiDescriptorListResult.payload;\n\n if (lifiDescriptors) {\n const message = await this._normaliser.normaliseMessage(transactionBytes);\n\n for (const [\n index,\n instruction,\n ] of message.compiledInstructions.entries()) {\n const programId = message.allKeys[instruction.programIdIndex];\n const programIdStr = programId?.toBase58();\n const descriptor = programIdStr\n ? lifiDescriptors[programIdStr]\n : undefined;\n const sigHex = descriptor?.signatures?.[SWAP_MODE];\n\n if (descriptor && sigHex) {\n await this.api.sendCommand(\n new ProvideTLVTransactionInstructionDescriptorCommand({\n kind: \"descriptor\",\n dataHex: descriptor.data,\n signatureHex: sigHex,\n isFirstMessage: index === 0,\n swapSignatureTag: true,\n }),\n );\n } else {\n await this.api.sendCommand(\n new ProvideTLVTransactionInstructionDescriptorCommand({\n kind: \"empty\",\n isFirstMessage: index === 0,\n swapSignatureTag: true,\n }),\n );\n }\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ProvideTransactionContextTask_exports", "__export", "ProvideSolanaTransactionContextTask", "SWAP_MODE", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_purify_ts", "import_ProvideTLVTransactionInstructionDescriptorCommand", "import_ProvideTLVDescriptorCommand", "import_DefaultSolanaMessageNormaliser", "api", "args", "tlvDescriptor", "trustedNamePKICertificate", "loadersResults", "transactionBytes", "loaderResult", "tokenMetadataResult", "res", "lifiDescriptorListResult", "tokenMetadataPayload", "tokenMetadataCertificate", "tokenMetadataCertificateToDeviceResult", "lifiDescriptors", "message", "index", "instruction", "programIdStr", "descriptor", "sigHex"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var t=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),e=require("vitest"),k=require("../../app-binder/command/ProvideTLVDescriptorCommand"),p=require("../../app-binder/command/ProvideTrustedNamePKICommand"),m=require("./ProvideTransactionContextTask");(0,e.describe)("ProvideSolanaTransactionContextTask",()=>{let o,s;const d=Uint8Array.from([170,170,170]),l={payload:Uint8Array.from([222,173,190,239,222,173,190,239])},i={_tag:"SomeError",errorCode:0,message:"SomeError"};(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),o={sendCommand:e.vi.fn()},s={descriptor:d,certificate:l}}),(0,e.it)("returns Nothing when both commands succeed",async()=>{const a=(0,t.CommandResultFactory)({data:r.Maybe.of(null)});o.sendCommand.mockResolvedValue(a);const c=await new m.ProvideSolanaTransactionContextTask(o,s).run();(0,e.expect)(o.sendCommand).toHaveBeenCalledTimes(2);const u=o.sendCommand.mock.calls[0];(0,e.expect)(u).toBeDefined();const C=u[0];(0,e.expect)(C).toBeInstanceOf(p.ProvideTrustedNamePKICommand),(0,e.expect)(C.args.pkiBlob).toStrictEqual(l.payload);const f=o.sendCommand.mock.calls[1][0];(0,e.expect)(f).toBeInstanceOf(k.ProvideTLVDescriptorCommand),(0,e.expect)(f.args.payload).toStrictEqual(d),(0,e.expect)(c).toStrictEqual(r.Nothing)}),(0,e.it)("throws error if PKI command fails",async()=>{const a=(0,t.CommandResultFactory)({error:i});o.sendCommand.mockResolvedValueOnce(a);const n=new m.ProvideSolanaTransactionContextTask(o,s);await(0,e.expect)(n.run()).rejects.toBe(a),(0,e.expect)(o.sendCommand).toHaveBeenCalledTimes(1)}),(0,e.it)("throws error if TLV command fails",async()=>{const a=(0,t.CommandResultFactory)({data:r.Maybe.of(null)}),n=(0,t.CommandResultFactory)({error:i});o.sendCommand.mockResolvedValueOnce(a).mockResolvedValueOnce(n);const c=new m.ProvideSolanaTransactionContextTask(o,s);await(0,e.expect)(c.run()).rejects.toBe(n),(0,e.expect)(o.sendCommand).toHaveBeenCalledTimes(2)})});
1
+ "use strict";var j=Object.create;var U=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var J=(a,s,d,m)=>{if(s&&typeof s=="object"||typeof s=="function")for(let u of Y(s))!z.call(a,u)&&u!==d&&U(a,u,{get:()=>s[u],enumerable:!(m=W(s,u))||m.enumerable});return a};var Q=(a,s,d)=>(d=a!=null?j(X(a)):{},J(s||!a||!a.__esModule?U(d,"default",{value:a,enumerable:!0}):d,a));var k=require("@ledgerhq/context-module"),S=require("@ledgerhq/device-management-kit"),f=require("@solana/spl-token"),n=require("@solana/web3.js"),q=Q(require("bs58")),H=require("buffer"),C=require("purify-ts"),e=require("vitest"),E=require("../../app-binder/command/ProvideTLVDescriptorCommand"),I=require("../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand"),F=require("../../app-binder/services/utils/DefaultSolanaMessageNormaliser"),l=require("./ProvideTransactionContextTask");const G=q.default.encode(new Uint8Array(32).fill(170));function Z(a,s,d){const m=d??s[0]??n.Keypair.generate(),u=new n.Transaction;u.recentBlockhash=G,u.feePayer=m.publicKey,u.add(...a);const B=new Set,c=[m,...s].filter(O=>{const t=O.publicKey.toBase58();return B.has(t)?!1:(B.add(t),!0)});return u.sign(...c),{raw:u.serialize(),payer:m}}function h(a,s,d){const m=d??s[0]??n.Keypair.generate(),u=new n.TransactionMessage({payerKey:m.publicKey,recentBlockhash:G,instructions:a}).compileToV0Message(),B=new n.VersionedTransaction(u);return B.sign([m,...s]),{raw:B.serialize(),payer:m}}const x=a=>({toBase58:()=>a}),b=a=>({normaliseMessage:e.vi.fn(async()=>a)});(0,e.describe)("ProvideSolanaTransactionContextTask (merged)",()=>{let a;const s=(0,S.CommandResultFactory)({data:void 0}),d={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:1},m=new Uint8Array([170,187,204]),u={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:2},B={data:"f0cacc1a",signature:"01020304"},c="f0cacc1a",O=e.vi.fn(()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn()}));(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),a={sendCommand:e.vi.fn()}}),(0,e.describe)("basic context",()=>{(0,e.it)("sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:[],transactionBytes:new Uint8Array([240]),loggerFactory:O},p=await new l.ProvideSolanaTransactionContextTask(a,t).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2);const r=a.sendCommand.mock.calls[0][0];(0,e.expect)(r).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(r.args.certificate).toStrictEqual(d.payload),(0,e.expect)(r.args.keyUsage).toBe(d.keyUsageNumber);const g=a.sendCommand.mock.calls[1][0];(0,e.expect)(g).toBeInstanceOf(E.ProvideTLVDescriptorCommand),(0,e.expect)(g.args.payload).toStrictEqual(m),(0,e.expect)(p).toStrictEqual(C.Nothing)}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand",async()=>{a.sendCommand.mockRejectedValueOnce(new Error("oupsy"));const t={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:[],transactionBytes:new Uint8Array([202]),loggerFactory:O},i=new l.ProvideSolanaTransactionContextTask(a,t);await(0,e.expect)(i.run()).rejects.toThrow("oupsy"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(1)}),(0,e.it)("ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.ERROR,error:{message:"err"}}],i={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),loggerFactory:O},r=await new l.ProvideSolanaTransactionContextTask(a,i).run();(0,e.expect)(r).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(E.ProvideTLVDescriptorCommand)})}),(0,e.describe)("basic context + token",()=>{(0,e.it)("when token metadata present, sends token certificate then TLV transaction-instruction descriptor",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],i={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),loggerFactory:O},r=await new l.ProvideSolanaTransactionContextTask(a,i).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4);const g=a.sendCommand.mock.calls[2][0];(0,e.expect)(g).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(g.args.certificate).toStrictEqual(u.payload),(0,e.expect)(g.args.keyUsage).toBe(u.keyUsageNumber);const y=a.sendCommand.mock.calls[3][0];(0,e.expect)(y).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(y.args.kind).toBe("descriptor"),(0,e.expect)(y.args.dataHex).toBe(B.data),(0,e.expect)(y.args.signatureHex).toBe(B.signature),(0,e.expect)(y.args.isFirstMessage).toBe(!0),(0,e.expect)(y.args.swapSignatureTag).toBe(!1),(0,e.expect)(r).toStrictEqual(C.Nothing)}),(0,e.it)("does not send token commands if token payload is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:void 0,certificate:u}],i={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([240]),loggerFactory:O},r=await new l.ProvideSolanaTransactionContextTask(a,i).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(r).toStrictEqual(C.Nothing)}),(0,e.it)("does not send token commands if token certificate is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:void 0}],i={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([202]),loggerFactory:O},r=await new l.ProvideSolanaTransactionContextTask(a,i).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(r).toStrictEqual(C.Nothing)}),(0,e.it)("throws a mapped error when sending token certificate returns a CommandErrorResult",async()=>{const t=(0,S.CommandResultFactory)({error:{_tag:"SomeError",errorCode:27264,message:"bad"}});a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(t);const i=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],p={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:i,transactionBytes:new Uint8Array([204]),loggerFactory:O},r=new l.ProvideSolanaTransactionContextTask(a,p);await(0,e.expect)(r.run()).rejects.toThrow("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(3);const g=a.sendCommand.mock.calls[2][0];(0,e.expect)(g).toBeInstanceOf(S.LoadCertificateCommand)}),(0,e.it)("does not send swap APDUs when SOLANA_LIFI context is missing (token present)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],i={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),normaliser:{normaliseMessage:e.vi.fn()},loggerFactory:O},r=await new l.ProvideSolanaTransactionContextTask(a,i).run();(0,e.expect)(r).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(E.ProvideTLVDescriptorCommand),(0,e.expect)(a.sendCommand.mock.calls[2][0]).toBeInstanceOf(S.LoadCertificateCommand);const g=a.sendCommand.mock.calls[3][0];(0,e.expect)(g).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(g.args.swapSignatureTag).toBe(!1),(0,e.expect)(g.args.isFirstMessage).toBe(!0)})}),(0,e.describe)("basic context + token + lifi",()=>{(0,e.it)("sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[x("A_PID"),x("B_PID"),x("C_PID")]},i=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:c,signatures:{[l.SWAP_MODE]:c}},C_PID:{data:c,signatures:{[l.SWAP_MODE]:c}}}}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([240]),normaliser:i,loggerFactory:O},y=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("descriptor"),(0,e.expect)(o.args.dataHex).toBe(c),(0,e.expect)(o.args.signatureHex).toBe(c),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0);const v=a.sendCommand.mock.calls[5][0];(0,e.expect)(v).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(v.args.kind).toBe("empty"),(0,e.expect)(v.args.isFirstMessage).toBe(!1),(0,e.expect)(v.args.swapSignatureTag).toBe(!0);const T=a.sendCommand.mock.calls[6][0];(0,e.expect)(T).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(T.args.kind).toBe("descriptor"),(0,e.expect)(T.args.dataHex).toBe(c),(0,e.expect)(T.args.signatureHex).toBe(c),(0,e.expect)(T.args.isFirstMessage).toBe(!1),(0,e.expect)(T.args.swapSignatureTag).toBe(!0),(0,e.expect)(i.normaliseMessage).toHaveBeenCalledOnce()}),(0,e.it)("sends empty when descriptor exists but signatures[SWAP_MODE] is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0}],allKeys:[x("ONLY_PID")]},i=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{ONLY_PID:{data:c,signatures:{}}}}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([202]),normaliser:i,loggerFactory:O},y=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("sends empty when programId is missing for an instruction",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:5}],allKeys:[x("X")]},i=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{}}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([204]),normaliser:i,loggerFactory:O},y=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockRejectedValueOnce(new Error("err"));const t={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[x("A_PID"),x("B_PID"),x("C_PID")]},i=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:c,signatures:{[l.SWAP_MODE]:c}},C_PID:{data:c,signatures:{[l.SWAP_MODE]:c}}}}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([26]),normaliser:i,loggerFactory:O},g=new l.ProvideSolanaTransactionContextTask(a,r);await(0,e.expect)(g.run()).rejects.toThrow("err"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(6);const y=a.sendCommand.mock.calls[4][0];(0,e.expect)(y).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(y.args.kind).toBe("descriptor"),(0,e.expect)(y.args.isFirstMessage).toBe(!0),(0,e.expect)(y.args.swapSignatureTag).toBe(!0);const o=a.sendCommand.mock.calls[5][0];(0,e.expect)(o).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!1),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("uses signatures[SWAP_MODE] specifically when present",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0}],allKeys:[x("SIG_PID")]},i=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{SIG_PID:{data:c,signatures:{prod:"deadbeef",[l.SWAP_MODE]:c}}}}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([240]),normaliser:i,loggerFactory:O},y=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("descriptor"),(0,e.expect)(o.args.dataHex).toBe(c),(0,e.expect)(o.args.signatureHex).toBe(c),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),i=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:i,lamports:1234}),r=n.Keypair.generate(),g=n.Keypair.generate().publicKey,y=n.Keypair.generate().publicKey,o=(0,f.createTransferInstruction)(g,y,r.publicKey,42n,[],f.TOKEN_PROGRAM_ID),v=new n.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),T=new n.TransactionInstruction({programId:v,keys:[],data:H.Buffer.from("hi")}),{raw:V}=Z([p,o,T],[t,r],t),K=n.SystemProgram.programId.toBase58(),N=v.toBase58(),P=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[K]:{data:c,signatures:{[l.SWAP_MODE]:c}},[N]:{data:c,signatures:{[l.SWAP_MODE]:c}}}}],D={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:P,transactionBytes:V,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:O},_=await new l.ProvideSolanaTransactionContextTask(a,D).run();(0,e.expect)(_).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const R=a.sendCommand.mock.calls[4][0];(0,e.expect)(R.args.kind).toBe("descriptor"),(0,e.expect)(R.args.isFirstMessage).toBe(!0),(0,e.expect)(R.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[5][0];(0,e.expect)(w.args.kind).toBe("empty"),(0,e.expect)(w.args.isFirstMessage).toBe(!1),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[6][0];(0,e.expect)(A.args.kind).toBe("descriptor"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),i=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:i,lamports:5678}),r=n.Keypair.generate().publicKey,g=n.Keypair.generate().publicKey,y=(0,f.getAssociatedTokenAddressSync)(g,r,!0,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,f.createAssociatedTokenAccountInstruction)(t.publicKey,y,r,g,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),v=new n.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),T=new n.TransactionInstruction({programId:v,keys:[],data:H.Buffer.from("hello")}),{raw:V}=h([p,o,T],[],t),K=n.SystemProgram.programId.toBase58(),N=f.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),P=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[K]:{data:c,signatures:{[l.SWAP_MODE]:c}},[N]:{data:c,signatures:{[l.SWAP_MODE]:c}}}}],D={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:P,transactionBytes:V,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:O},_=await new l.ProvideSolanaTransactionContextTask(a,D).run();(0,e.expect)(_).toEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const R=a.sendCommand.mock.calls[4][0];(0,e.expect)(R).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(R.args.kind).toBe("descriptor"),(0,e.expect)(R.args.isFirstMessage).toBe(!0),(0,e.expect)(R.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[5][0];(0,e.expect)(w).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(w.args.kind).toBe("descriptor"),(0,e.expect)(w.args.isFirstMessage).toBe(!1),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[6][0];(0,e.expect)(A).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(A.args.kind).toBe("empty"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),i=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:i,lamports:7777}),r=n.Keypair.generate(),g=n.Keypair.generate().publicKey,y=n.Keypair.generate().publicKey,o=(0,f.getAssociatedTokenAddressSync)(g,y,!0,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),v=(0,f.createAssociatedTokenAccountInstruction)(t.publicKey,o,y,g,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),T=n.Keypair.generate().publicKey,V=(0,f.createTransferInstruction)(T,o,r.publicKey,9n,[],f.TOKEN_PROGRAM_ID),{raw:K}=h([p,v,V],[r],t),N=n.SystemProgram.programId.toBase58(),P=f.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),D=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[N]:{data:c,signatures:{[l.SWAP_MODE]:c}},[P]:{data:c,signatures:{[l.SWAP_MODE]:c}}}}],L={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:D,transactionBytes:K,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:O},R=await new l.ProvideSolanaTransactionContextTask(a,L).run();(0,e.expect)(R).toEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const w=a.sendCommand.mock.calls[4][0];(0,e.expect)(w).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(w.args.kind).toBe("descriptor"),(0,e.expect)(w.args.isFirstMessage).toBe(!0),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[5][0];(0,e.expect)(A).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(A.args.kind).toBe("descriptor"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0);const M=a.sendCommand.mock.calls[6][0];(0,e.expect)(M).toBeInstanceOf(I.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(M.args.kind).toBe("empty"),(0,e.expect)(M.args.isFirstMessage).toBe(!1),(0,e.expect)(M.args.swapSignatureTag).toBe(!0)})})});
2
2
  //# sourceMappingURL=ProvideTransactionContextTask.test.js.map