@ledgerhq/device-signer-kit-solana 0.0.0-dsdk-902-20251125115730 → 0.0.0-dsdk-938-release-automation-4-20251201132435

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 (63) hide show
  1. package/README.md +3 -0
  2. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  3. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
  4. package/lib/cjs/internal/DefaultSignerSolana.js.map +2 -2
  5. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +1 -1
  6. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +3 -3
  7. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +1 -1
  8. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +3 -3
  9. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  10. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +2 -2
  11. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  12. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
  13. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  14. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +2 -2
  15. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  16. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  17. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  18. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  19. package/lib/cjs/package.json +40 -36
  20. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  21. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
  22. package/lib/esm/internal/DefaultSignerSolana.js.map +2 -2
  23. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +1 -1
  24. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +3 -3
  25. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +1 -1
  26. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +3 -3
  27. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  28. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  29. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  30. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  31. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  32. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +2 -2
  33. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  34. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  35. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  36. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  37. package/lib/esm/package.json +40 -36
  38. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +9 -8
  39. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  40. package/lib/types/internal/DefaultSignerSolana.d.ts +0 -3
  41. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  42. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts +9 -0
  43. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts.map +1 -1
  44. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +2 -3
  45. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  46. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +1 -4
  47. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
  48. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +5 -4
  49. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
  50. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  51. package/package.json +33 -29
  52. package/lib/cjs/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.js +0 -2
  53. package/lib/cjs/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.js.map +0 -7
  54. package/lib/cjs/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.test.js +0 -2
  55. package/lib/cjs/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.test.js.map +0 -7
  56. package/lib/esm/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.js +0 -2
  57. package/lib/esm/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.js.map +0 -7
  58. package/lib/esm/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.test.js +0 -2
  59. package/lib/esm/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.test.js.map +0 -7
  60. package/lib/types/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.d.ts +0 -15
  61. package/lib/types/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.d.ts.map +0 -1
  62. package/lib/types/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.test.d.ts +0 -2
  63. package/lib/types/internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand.test.d.ts.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var m=(o,t)=>{for(var e in t)s(o,e,{get:t[e],enumerable:!0})},C=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of u(t))!p.call(o,n)&&n!==e&&s(o,n,{get:()=>t[n],enumerable:!(r=c(t,n))||r.enumerable});return o};var x=o=>C(s({},"__esModule",{value:!0}),o);var g={};m(g,{BuildTransactionContextTask:()=>I});module.exports=x(g);var l=require("@ledgerhq/device-management-kit"),d=require("../../app-binder/command/GetChallengeCommand");class I{constructor(t,e){this.api=t;this.args=e}async run(){const{contextModule:t,options:e}=this.args,r=this.api.getDeviceSessionState();let n;const i=await this.api.sendCommand(new d.GetChallengeCommand);return(0,l.isSuccessCommandResult)(i)&&(n=i.data.challenge),(await t.getSolanaContext({deviceModelId:r.deviceModelId,tokenAddress:e.tokenAddress,challenge:n,createATA:e.createATA,tokenInternalId:e.tokenInternalId,templateId:e.templateId})).caseOf({Left:a=>{throw a},Right:a=>({tlvDescriptor:a.tlvDescriptor,trustedNamePKICertificate:a.trustedNamePKICertificate,loadersResults:a.loadersResults})})}}0&&(module.exports={BuildTransactionContextTask});
1
+ "use strict";var s=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var C=(o,t)=>{for(var e in t)s(o,e,{get:t[e],enumerable:!0})},m=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of u(t))!p.call(o,a)&&a!==e&&s(o,a,{get:()=>t[a],enumerable:!(r=c(t,a))||r.enumerable});return o};var x=o=>m(s({},"__esModule",{value:!0}),o);var f={};C(f,{BuildTransactionContextTask:()=>R});module.exports=x(f);var l=require("@ledgerhq/device-management-kit"),d=require("../../app-binder/command/GetChallengeCommand");class R{constructor(t,e){this.api=t;this.args=e}async run(){const{contextModule:t,options:e}=this.args,r=this.api.getDeviceSessionState();let a;const i=await this.api.sendCommand(new d.GetChallengeCommand);return(0,l.isSuccessCommandResult)(i)&&(a=i.data.challenge),(await t.getSolanaContext({deviceModelId:r.deviceModelId,tokenAddress:e.tokenAddress,challenge:a,createATA:e.createATA,tokenInternalId:e.tokenInternalId,templateId:e.templateId})).caseOf({Left:n=>{throw n},Right:n=>({tlvDescriptor:n.tlvDescriptor,trustedNamePKICertificate:n.trustedNamePKICertificate,loadersResults:n.loadersResults})})}}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 type SolanaContextLoaderResults,\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 trustedNamePKICertificate: PkiCertificate;\n tlvDescriptor: Uint8Array;\n loadersResults: SolanaContextLoaderResults;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionResolutionContext & {\n tokenInternalId?: string;\n templateId?: string;\n };\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 tokenInternalId: options.tokenInternalId,\n templateId: options.templateId,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n tlvDescriptor: ctx.tlvDescriptor,\n trustedNamePKICertificate: ctx.trustedNamePKICertificate,\n loadersResults: ctx.loadersResults,\n };\n },\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAKA,IAAAI,EAGO,2CAGPC,EAAoC,4DAgB7B,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,UACnB,gBAAiBA,EAAQ,gBACzB,WAAYA,EAAQ,UACtB,CAAC,GAEoB,OAAO,CAC1B,KAAOI,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,IACC,CACL,cAAeA,EAAI,cACnB,0BAA2BA,EAAI,0BAC/B,eAAgBA,EAAI,cACtB,EAEJ,CAAC,CACH,CACF",
4
+ "sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n type SolanaContextLoaderResults,\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 trustedNamePKICertificate: PkiCertificate;\n tlvDescriptor: Uint8Array;\n loadersResults: SolanaContextLoaderResults;\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 tokenInternalId: options.tokenInternalId,\n templateId: options.templateId,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n tlvDescriptor: ctx.tlvDescriptor,\n trustedNamePKICertificate: ctx.trustedNamePKICertificate,\n loadersResults: ctx.loadersResults,\n };\n },\n });\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAKA,IAAAI,EAGO,2CAGPC,EAAoC,4DAa7B,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,UACnB,gBAAiBA,EAAQ,gBACzB,WAAYA,EAAQ,UACtB,CAAC,GAEoB,OAAO,CAC1B,KAAOI,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,IACC,CACL,cAAeA,EAAI,cACnB,0BAA2BA,EAAI,0BAC/B,eAAgBA,EAAI,cACtB,EAEJ,CAAC,CACH,CACF",
6
6
  "names": ["BuildTransactionContextTask_exports", "__export", "BuildTransactionContextTask", "__toCommonJS", "import_device_management_kit", "import_GetChallengeCommand", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "err", "ctx"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var m=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var T=(r,e)=>{for(var t in e)m(r,t,{get:e[t],enumerable:!0})},R=(r,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of w(e))!v.call(r,o)&&o!==t&&m(r,o,{get:()=>e[o],enumerable:!(a=x(e,o))||a.enumerable});return r};var M=r=>R(m({},"__esModule",{value:!0}),r);var I={};T(I,{MODE:()=>g,ProvideSolanaTransactionContextTask:()=>A});module.exports=M(I);var i=require("@ledgerhq/context-module/src/solanaToken/domain/SolanaTokenContext.js"),n=require("@ledgerhq/device-management-kit"),y=require("purify-ts"),l=require("../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand"),C=require("../../app-binder/command/ProvideTLVDescriptorCommand"),S=require("../../app-binder/command/ProvideTrustedDynamicDescriptorCommand"),k=require("../../app-binder/services/utils/DefaultSolanaMessageNormaliser");const g="test";class A{constructor(e,t,a=k.DefaultSolanaMessageNormaliser){this.api=e;this.context=t;this.normaliser=a}async run(){const{tlvDescriptor:e,trustedNamePKICertificate:t,loadersResults:a,transactionBytes:o}=this.context;await this.api.sendCommand(new n.LoadCertificateCommand({certificate:t.payload,keyUsage:t.keyUsageNumber})),await this.api.sendCommand(new C.ProvideTLVDescriptorCommand({payload:e}));for(const d of a)switch(d.type){case i.SolanaContextTypes.SOLANA_TOKEN:{const s=a.find(c=>c.type===i.SolanaContextTypes.SOLANA_TOKEN);s&&await this.provideTokenMetadataContext(s);break}case i.SolanaContextTypes.SOLANA_LIFI:{const s=a.find(c=>c.type===i.SolanaContextTypes.SOLANA_LIFI);s&&await this.provideSwapContext(s,o);break}case i.SolanaContextTypes.ERROR:break;default:break}return y.Nothing}async provideTokenMetadataContext(e){const{payload:t,certificate:a}=e;if(t&&a){const o=await this.api.sendCommand(new n.LoadCertificateCommand({certificate:a.payload,keyUsage:a.keyUsageNumber}));if(!(0,n.isSuccessCommandResult)(o))throw new Error("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required");await this.api.sendCommand(new S.ProvideTrustedDynamicDescriptorCommand({data:t.solanaTokenDescriptor.data,signature:t.solanaTokenDescriptor.signature}))}}async provideSwapContext(e,t){const a=e.payload;if(a){const o=await this.normaliser.normaliseMessage(t);for(const[d,s]of o.compiledInstructions.entries()){const u=o.allKeys[s.programIdIndex]?.toBase58(),p=u?a[u]:void 0,f=p&&p.signatures[g];p&&f?await this.api.sendCommand(new l.ProvideTLVTransactionInstructionDescriptorCommand({kind:"descriptor",dataHex:p.data,signatureHex:f,isFirstMessage:d===0})):await this.api.sendCommand(new l.ProvideTLVTransactionInstructionDescriptorCommand({kind:"empty",isFirstMessage:d===0}))}}}}0&&(module.exports={MODE,ProvideSolanaTransactionContextTask});
1
+ "use strict";var m=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var T=(r,e)=>{for(var t in e)m(r,t,{get:e[t],enumerable:!0})},v=(r,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of k(e))!w.call(r,o)&&o!==t&&m(r,o,{get:()=>e[o],enumerable:!(a=x(e,o))||a.enumerable});return r};var M=r=>v(m({},"__esModule",{value:!0}),r);var I={};T(I,{ProvideSolanaTransactionContextTask:()=>A,SWAP_MODE:()=>g});module.exports=M(I);var i=require("@ledgerhq/context-module"),n=require("@ledgerhq/device-management-kit"),f=require("purify-ts"),l=require("../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand"),y=require("../../app-binder/command/ProvideTLVDescriptorCommand"),S=require("../../app-binder/services/utils/DefaultSolanaMessageNormaliser");const g="test";class A{constructor(e,t,a=S.DefaultSolanaMessageNormaliser){this.api=e;this.context=t;this.normaliser=a}async run(){const{tlvDescriptor:e,trustedNamePKICertificate:t,loadersResults:a,transactionBytes:o}=this.context;await this.api.sendCommand(new n.LoadCertificateCommand({certificate:t.payload,keyUsage:t.keyUsageNumber})),await this.api.sendCommand(new y.ProvideTLVDescriptorCommand({payload:e}));for(const d of a)switch(d.type){case i.SolanaContextTypes.SOLANA_TOKEN:{const s=a.find(c=>c.type===i.SolanaContextTypes.SOLANA_TOKEN);s&&await this.provideTokenMetadataContext(s);break}case i.SolanaContextTypes.SOLANA_LIFI:{const s=a.find(c=>c.type===i.SolanaContextTypes.SOLANA_LIFI);s&&await this.provideSwapContext(s,o);break}case i.SolanaContextTypes.ERROR:break;default:break}return f.Nothing}async provideTokenMetadataContext(e){const{payload:t,certificate:a}=e;if(t&&a){const o=await this.api.sendCommand(new n.LoadCertificateCommand({certificate:a.payload,keyUsage:a.keyUsageNumber}));if(!(0,n.isSuccessCommandResult)(o))throw new Error("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required");await this.api.sendCommand(new l.ProvideTLVTransactionInstructionDescriptorCommand({kind:"descriptor",dataHex:t.solanaTokenDescriptor.data,signatureHex:t.solanaTokenDescriptor.signature,isFirstMessage:!0,swapSignatureTag:!1}))}}async provideSwapContext(e,t){const a=e.payload;if(a){const o=await this.normaliser.normaliseMessage(t);for(const[d,s]of o.compiledInstructions.entries()){const u=o.allKeys[s.programIdIndex]?.toBase58(),p=u?a[u]:void 0,C=p&&p.signatures[g];p&&C?await this.api.sendCommand(new l.ProvideTLVTransactionInstructionDescriptorCommand({kind:"descriptor",dataHex:p.data,signatureHex:C,isFirstMessage:d===0,swapSignatureTag:!0})):await this.api.sendCommand(new l.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 SolanaLifiContextSuccessResult } from \"@ledgerhq/context-module/src/solanaLifi/domain/SolanaLifiContext.js\";\nimport {\n SolanaContextTypes,\n type SolanaTokenContextSuccessResult,\n} from \"@ledgerhq/context-module/src/solanaToken/domain/SolanaTokenContext.js\";\nimport {\n type CommandErrorResult,\n type InternalApi,\n isSuccessCommandResult,\n LoadCertificateCommand,\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 { ProvideTrustedDynamicDescriptorCommand } from \"@internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand\";\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 MODE = \"test\";\n\nexport class ProvideSolanaTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly context: SolanaBuildContextResult & {\n transactionBytes: Uint8Array;\n },\n private readonly normaliser: SolanaMessageNormaliserConstructor = DefaultSolanaMessageNormaliser,\n ) {}\n\n async run(): Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>> {\n const {\n tlvDescriptor,\n trustedNamePKICertificate,\n loadersResults,\n transactionBytes,\n } = this.context;\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 TLV 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 for (const loaderResult of loadersResults) {\n switch (loaderResult.type) {\n // resolve token first as swap can depend on token metadata being loaded\n case SolanaContextTypes.SOLANA_TOKEN: {\n const tokenMetadataResult = loadersResults.find(\n (res) => res.type === SolanaContextTypes.SOLANA_TOKEN,\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 if (lifiDescriptorListResult) {\n await this.provideSwapContext(\n lifiDescriptorListResult,\n transactionBytes,\n );\n }\n break;\n }\n\n case SolanaContextTypes.ERROR: {\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return Nothing;\n }\n\n private async provideTokenMetadataContext(\n tokenMetadataResult: SolanaTokenContextSuccessResult,\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 ProvideTrustedDynamicDescriptorCommand({\n data: tokenMetadataPayload.solanaTokenDescriptor.data,\n signature: tokenMetadataPayload.solanaTokenDescriptor.signature,\n }),\n );\n }\n }\n\n private async provideSwapContext(\n lifiDescriptorListResult: SolanaLifiContextSuccessResult,\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\n const sigHex = descriptor && descriptor.signatures[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 }),\n );\n } else {\n await this.api.sendCommand(\n new ProvideTLVTransactionInstructionDescriptorCommand({\n kind: \"empty\",\n isFirstMessage: index === 0,\n }),\n );\n }\n }\n }\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,UAAAE,EAAA,wCAAAC,IAAA,eAAAC,EAAAJ,GACA,IAAAK,EAGO,iFACPC,EAKO,2CACPC,EAAoC,qBAEpCC,EAAkE,2FAClEC,EAA4C,oEAC5CC,EAAuD,+EAEvDC,EAGO,8EAIA,MAAMT,EAAO,OAEb,MAAMC,CAAoC,CAC/C,YACmBS,EACAC,EAGAC,EAAiD,iCAClE,CALiB,SAAAF,EACA,aAAAC,EAGA,gBAAAC,CAChB,CAEH,MAAM,KAA+D,CACnE,KAAM,CACJ,cAAAC,EACA,0BAAAC,EACA,eAAAC,EACA,iBAAAC,CACF,EAAI,KAAK,QAMT,MAAM,KAAK,IAAI,YACb,IAAI,yBAAuB,CACzB,YAAaF,EAA0B,QACvC,SAAUA,EAA0B,cACtC,CAAC,CACH,EAGA,MAAM,KAAK,IAAI,YACb,IAAI,8BAA4B,CAAE,QAASD,CAAc,CAAC,CAC5D,EAKA,UAAWI,KAAgBF,EACzB,OAAQE,EAAa,KAAM,CAEzB,KAAK,qBAAmB,aAAc,CACpC,MAAMC,EAAsBH,EAAe,KACxCI,GAAQA,EAAI,OAAS,qBAAmB,YAC3C,EACID,GACF,MAAM,KAAK,4BAA4BA,CAAmB,EAE5D,KACF,CAEA,KAAK,qBAAmB,YAAa,CACnC,MAAME,EAA2BL,EAAe,KAC7CI,GAAQA,EAAI,OAAS,qBAAmB,WAC3C,EACIC,GACF,MAAM,KAAK,mBACTA,EACAJ,CACF,EAEF,KACF,CAEA,KAAK,qBAAmB,MACtB,MAGF,QACE,KAEJ,CAGF,OAAO,SACT,CAEA,MAAc,4BACZE,EACe,CACf,KAAM,CACJ,QAASG,EACT,YAAaC,CACf,EAAIJ,EAEJ,GAAIG,GAAwBC,EAA0B,CAEpD,MAAMC,EAAyC,MAAM,KAAK,IAAI,YAC5D,IAAI,yBAAuB,CACzB,YAAaD,EAAyB,QACtC,SAAUA,EAAyB,cACrC,CAAC,CACH,EACA,GAAI,IAAC,0BAAuBC,CAAsC,EAEhE,MAAM,IAAI,MACR,yIACF,EAIF,MAAM,KAAK,IAAI,YACb,IAAI,yCAAuC,CACzC,KAAMF,EAAqB,sBAAsB,KACjD,UAAWA,EAAqB,sBAAsB,SACxD,CAAC,CACH,CACF,CACF,CAEA,MAAc,mBACZD,EACAJ,EACe,CACf,MAAMQ,EAAkBJ,EAAyB,QAEjD,GAAII,EAAiB,CACnB,MAAMC,EAAU,MAAM,KAAK,WAAW,iBAAiBT,CAAgB,EAEvE,SAAW,CACTU,EACAC,CACF,IAAKF,EAAQ,qBAAqB,QAAQ,EAAG,CAE3C,MAAMG,EADYH,EAAQ,QAAQE,EAAY,cAAc,GAC5B,SAAS,EACnCE,EAAaD,EACfJ,EAAgBI,CAAY,EAC5B,OAEEE,EAASD,GAAcA,EAAW,WAAW7B,CAAI,EAEnD6B,GAAcC,EAChB,MAAM,KAAK,IAAI,YACb,IAAI,oDAAkD,CACpD,KAAM,aACN,QAASD,EAAW,KACpB,aAAcC,EACd,eAAgBJ,IAAU,CAC5B,CAAC,CACH,EAEA,MAAM,KAAK,IAAI,YACb,IAAI,oDAAkD,CACpD,KAAM,QACN,eAAgBA,IAAU,CAC5B,CAAC,CACH,CAEJ,CACF,CACF,CACF",
6
- "names": ["ProvideTransactionContextTask_exports", "__export", "MODE", "ProvideSolanaTransactionContextTask", "__toCommonJS", "import_SolanaTokenContext", "import_device_management_kit", "import_purify_ts", "import_ProvideTLVTransactionInstructionDescriptorCommand", "import_ProvideTLVDescriptorCommand", "import_ProvideTrustedDynamicDescriptorCommand", "import_DefaultSolanaMessageNormaliser", "api", "context", "normaliser", "tlvDescriptor", "trustedNamePKICertificate", "loadersResults", "transactionBytes", "loaderResult", "tokenMetadataResult", "res", "lifiDescriptorListResult", "tokenMetadataPayload", "tokenMetadataCertificate", "tokenMetadataCertificateToDeviceResult", "lifiDescriptors", "message", "index", "instruction", "programIdStr", "descriptor", "sigHex"]
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} 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 ProvideSolanaTransactionContextTaskContext =\n SolanaBuildContextResult & {\n transactionBytes: Uint8Array;\n };\n\nexport class ProvideSolanaTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly context: ProvideSolanaTransactionContextTaskContext,\n private readonly normaliser: SolanaMessageNormaliserConstructor = DefaultSolanaMessageNormaliser,\n ) {}\n\n async run(): Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>> {\n const {\n tlvDescriptor,\n trustedNamePKICertificate,\n loadersResults,\n transactionBytes,\n } = this.context;\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 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 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 if (lifiDescriptorListResult) {\n await this.provideSwapContext(\n lifiDescriptorListResult,\n transactionBytes,\n );\n }\n break;\n }\n\n case SolanaContextTypes.ERROR: {\n break;\n }\n\n default: {\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\n const sigHex = descriptor && 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": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yCAAAE,EAAA,cAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAIO,oCACPC,EAKO,2CACPC,EAAoC,qBAEpCC,EAAkE,2FAClEC,EAA4C,oEAE5CC,EAGO,8EAIA,MAAMP,EAAY,OAOlB,MAAMD,CAAoC,CAC/C,YACmBS,EACAC,EACAC,EAAiD,iCAClE,CAHiB,SAAAF,EACA,aAAAC,EACA,gBAAAC,CAChB,CAEH,MAAM,KAA+D,CACnE,KAAM,CACJ,cAAAC,EACA,0BAAAC,EACA,eAAAC,EACA,iBAAAC,CACF,EAAI,KAAK,QAMT,MAAM,KAAK,IAAI,YACb,IAAI,yBAAuB,CACzB,YAAaF,EAA0B,QACvC,SAAUA,EAA0B,cACtC,CAAC,CACH,EAGA,MAAM,KAAK,IAAI,YACb,IAAI,8BAA4B,CAAE,QAASD,CAAc,CAAC,CAC5D,EAKA,UAAWI,KAAgBF,EACzB,OAAQE,EAAa,KAAM,CAEzB,KAAK,qBAAmB,aAAc,CACpC,MAAMC,EAAsBH,EAAe,KACxCI,GAAQA,EAAI,OAAS,qBAAmB,YAC3C,EACID,GACF,MAAM,KAAK,4BAA4BA,CAAmB,EAE5D,KACF,CAEA,KAAK,qBAAmB,YAAa,CACnC,MAAME,EAA2BL,EAAe,KAC7CI,GAAQA,EAAI,OAAS,qBAAmB,WAC3C,EACIC,GACF,MAAM,KAAK,mBACTA,EACAJ,CACF,EAEF,KACF,CAEA,KAAK,qBAAmB,MACtB,MAGF,QACE,KAEJ,CAGF,OAAO,SACT,CAEA,MAAc,4BACZE,EACe,CACf,KAAM,CACJ,QAASG,EACT,YAAaC,CACf,EAAIJ,EAEJ,GAAIG,GAAwBC,EAA0B,CAEpD,MAAMC,EAAyC,MAAM,KAAK,IAAI,YAC5D,IAAI,yBAAuB,CACzB,YAAaD,EAAyB,QACtC,SAAUA,EAAyB,cACrC,CAAC,CACH,EACA,GAAI,IAAC,0BAAuBC,CAAsC,EAEhE,MAAM,IAAI,MACR,yIACF,EAIF,MAAM,KAAK,IAAI,YACb,IAAI,oDAAkD,CACpD,KAAM,aACN,QAASF,EAAqB,sBAAsB,KACpD,aAAcA,EAAqB,sBAAsB,UAEzD,eAAgB,GAChB,iBAAkB,EACpB,CAAC,CACH,CACF,CACF,CAEA,MAAc,mBACZD,EACAJ,EACe,CACf,MAAMQ,EAAkBJ,EAAyB,QAEjD,GAAII,EAAiB,CACnB,MAAMC,EAAU,MAAM,KAAK,WAAW,iBAAiBT,CAAgB,EAEvE,SAAW,CACTU,EACAC,CACF,IAAKF,EAAQ,qBAAqB,QAAQ,EAAG,CAE3C,MAAMG,EADYH,EAAQ,QAAQE,EAAY,cAAc,GAC5B,SAAS,EACnCE,EAAaD,EACfJ,EAAgBI,CAAY,EAC5B,OAEEE,EAASD,GAAcA,EAAW,WAAW3B,CAAS,EAExD2B,GAAcC,EAChB,MAAM,KAAK,IAAI,YACb,IAAI,oDAAkD,CACpD,KAAM,aACN,QAASD,EAAW,KACpB,aAAcC,EACd,eAAgBJ,IAAU,EAC1B,iBAAkB,EACpB,CAAC,CACH,EAEA,MAAM,KAAK,IAAI,YACb,IAAI,oDAAkD,CACpD,KAAM,QACN,eAAgBA,IAAU,EAC1B,iBAAkB,EACpB,CAAC,CACH,CAEJ,CACF,CACF,CACF",
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", "context", "normaliser", "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 j=Object.create;var h=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var J=(a,n,l,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let m of X(n))!z.call(a,m)&&m!==l&&h(a,m,{get:()=>n[m],enumerable:!(i=Y(n,m))||i.enumerable});return a};var Q=(a,n,l)=>(l=a!=null?j(W(a)):{},J(n||!a||!a.__esModule?h(l,"default",{value:a,enumerable:!0}):l,a));var k=require("@ledgerhq/context-module/src/solanaToken/domain/SolanaTokenContext.js"),B=require("@ledgerhq/device-management-kit"),p=require("@solana/spl-token"),t=require("@solana/web3.js"),F=Q(require("bs58")),M=require("buffer"),C=require("purify-ts"),e=require("vitest"),_=require("../../app-binder/command/ProvideTLVDescriptorCommand"),f=require("../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand"),U=require("../../app-binder/command/ProvideTrustedDynamicDescriptorCommand"),E=require("../../app-binder/services/utils/DefaultSolanaMessageNormaliser"),d=require("./ProvideTransactionContextTask");const G=F.default.encode(new Uint8Array(32).fill(170));function Z(a,n,l){const i=l??n[0]??t.Keypair.generate(),m=new t.Transaction;m.recentBlockhash=G,m.feePayer=i.publicKey,m.add(...a);const I=new Set,r=[i,...n].filter(s=>{const o=s.publicKey.toBase58();return I.has(o)?!1:(I.add(o),!0)});return m.sign(...r),{raw:m.serialize(),payer:i}}function q(a,n,l){const i=l??n[0]??t.Keypair.generate(),m=new t.TransactionMessage({payerKey:i.publicKey,recentBlockhash:G,instructions:a}).compileToV0Message(),I=new t.VersionedTransaction(m);return I.sign([i,...n]),{raw:I.serialize(),payer:i}}const R=a=>({toBase58:()=>a}),D=a=>({normaliseMessage:e.vi.fn(async()=>a)});(0,e.describe)("ProvideSolanaTransactionContextTask (merged)",()=>{let a;const n=(0,B.CommandResultFactory)({data:void 0}),l={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:1},i=new Uint8Array([170,187,204]),m={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:2},I={data:"f0cacc1a",signature:"01020304"},r="f0cacc1a";(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(n).mockResolvedValueOnce(n);const s={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:[],transactionBytes:new Uint8Array([240])},y=await new d.ProvideSolanaTransactionContextTask(a,s).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2);const c=a.sendCommand.mock.calls[0][0];(0,e.expect)(c).toBeInstanceOf(B.LoadCertificateCommand),(0,e.expect)(c.args.certificate).toStrictEqual(l.payload),(0,e.expect)(c.args.keyUsage).toBe(l.keyUsageNumber);const O=a.sendCommand.mock.calls[1][0];(0,e.expect)(O).toBeInstanceOf(_.ProvideTLVDescriptorCommand),(0,e.expect)(O.args.payload).toStrictEqual(i),(0,e.expect)(y).toStrictEqual(C.Nothing)}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand",async()=>{a.sendCommand.mockRejectedValueOnce(new Error("oupsy"));const s={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:[],transactionBytes:new Uint8Array([202])},o=new d.ProvideSolanaTransactionContextTask(a,s);await(0,e.expect)(o.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(n).mockResolvedValueOnce(n);const s=[{type:k.SolanaContextTypes.ERROR,error:{message:"err"}}],o={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:s,transactionBytes:new Uint8Array([26])},c=await new d.ProvideSolanaTransactionContextTask(a,o).run();(0,e.expect)(c).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(B.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(_.ProvideTLVDescriptorCommand)})}),(0,e.describe)("basic context + token",()=>{(0,e.it)("when token metadata present, sends token certificate then dynamic descriptor",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n);const s=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m}],o={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:s,transactionBytes:new Uint8Array([26])},c=await new d.ProvideSolanaTransactionContextTask(a,o).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4);const O=a.sendCommand.mock.calls[2][0];(0,e.expect)(O).toBeInstanceOf(B.LoadCertificateCommand),(0,e.expect)(O.args.certificate).toStrictEqual(m.payload),(0,e.expect)(O.args.keyUsage).toBe(m.keyUsageNumber);const g=a.sendCommand.mock.calls[3][0];(0,e.expect)(g).toBeInstanceOf(U.ProvideTrustedDynamicDescriptorCommand),(0,e.expect)(g.args.data).toBe(I.data),(0,e.expect)(g.args.signature).toBe(I.signature),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("does not send token commands if token payload is missing",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n);const s=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:void 0,certificate:m}],o={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:s,transactionBytes:new Uint8Array([240])},c=await new d.ProvideSolanaTransactionContextTask(a,o).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("does not send token commands if token certificate is missing",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n);const s=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:void 0}],o={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:s,transactionBytes:new Uint8Array([202])},c=await new d.ProvideSolanaTransactionContextTask(a,o).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("throws a mapped error when sending token certificate returns a CommandErrorResult",async()=>{const s=(0,B.CommandResultFactory)({error:{_tag:"SomeError",errorCode:27264,message:"bad"}});a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(s);const o=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m}],y={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:o,transactionBytes:new Uint8Array([204])},c=new d.ProvideSolanaTransactionContextTask(a,y);await(0,e.expect)(c.run()).rejects.toThrow("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(3);const O=a.sendCommand.mock.calls[2][0];(0,e.expect)(O).toBeInstanceOf(B.LoadCertificateCommand)}),(0,e.it)("does not send swap APDUs when SOLANA_LIFI context is missing (token present)",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n);const s=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m}],o={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:s,transactionBytes:new Uint8Array([26])},c=await new d.ProvideSolanaTransactionContextTask(a,o,{normaliseMessage:e.vi.fn()}).run();(0,e.expect)(c).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(B.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(_.ProvideTLVDescriptorCommand),(0,e.expect)(a.sendCommand.mock.calls[2][0]).toBeInstanceOf(B.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[3][0]).toBeInstanceOf(U.ProvideTrustedDynamicDescriptorCommand)})}),(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(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValue(n);const s={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[R("A_PID"),R("B_PID"),R("C_PID")]},o=D(s),y=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:r,signatures:{[d.MODE]:r}},C_PID:{data:r,signatures:{[d.MODE]:r}}}}],c={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:y,transactionBytes:new Uint8Array([240])},g=await new d.ProvideSolanaTransactionContextTask(a,c,o).run();(0,e.expect)(g).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const u=a.sendCommand.mock.calls[4][0];(0,e.expect)(u).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(u.args.kind).toBe("descriptor"),(0,e.expect)(u.args.dataHex).toBe(r),(0,e.expect)(u.args.signatureHex).toBe(r);const w=a.sendCommand.mock.calls[5][0];(0,e.expect)(w).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(w.args.kind).toBe("empty");const A=a.sendCommand.mock.calls[6][0];(0,e.expect)(A).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(A.args.kind).toBe("descriptor"),(0,e.expect)(A.args.dataHex).toBe(r),(0,e.expect)(A.args.signatureHex).toBe(r),(0,e.expect)(o.normaliseMessage).toHaveBeenCalledOnce()}),(0,e.it)("sends empty when descriptor exists but signatures[MODE] is missing",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValue(n);const s={compiledInstructions:[{programIdIndex:0}],allKeys:[R("ONLY_PID")]},o=D(s),y=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{ONLY_PID:{data:r,signatures:{}}}}],c={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:y,transactionBytes:new Uint8Array([202])},g=await new d.ProvideSolanaTransactionContextTask(a,c,o).run();(0,e.expect)(g).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const u=a.sendCommand.mock.calls[4][0];(0,e.expect)(u).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(u.args.kind).toBe("empty")}),(0,e.it)("sends empty when programId is missing for an instruction",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValue(n);const s={compiledInstructions:[{programIdIndex:5}],allKeys:[R("X")]},o=D(s),y=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{}}],c={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:y,transactionBytes:new Uint8Array([204])},g=await new d.ProvideSolanaTransactionContextTask(a,c,o).run();(0,e.expect)(g).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const u=a.sendCommand.mock.calls[4][0];(0,e.expect)(u).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(u.args.kind).toBe("empty")}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockRejectedValueOnce(new Error("err"));const s={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[R("A_PID"),R("B_PID"),R("C_PID")]},o=D(s),y=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:r,signatures:{[d.MODE]:r}},C_PID:{data:r,signatures:{[d.MODE]:r}}}}],c={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:y,transactionBytes:new Uint8Array([26])},O=new d.ProvideSolanaTransactionContextTask(a,c,o);await(0,e.expect)(O.run()).rejects.toThrow("err"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(6);const g=a.sendCommand.mock.calls[4][0];(0,e.expect)(g).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(g.args.kind).toBe("descriptor");const u=a.sendCommand.mock.calls[5][0];(0,e.expect)(u).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(u.args.kind).toBe("empty")}),(0,e.it)("uses signatures[MODE] specifically when present",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValue(n);const s={compiledInstructions:[{programIdIndex:0}],allKeys:[R("SIG_PID")]},o=D(s),y=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{SIG_PID:{data:r,signatures:{prod:"deadbeef",[d.MODE]:r}}}}],c={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:y,transactionBytes:new Uint8Array([240])},g=await new d.ProvideSolanaTransactionContextTask(a,c,o).run();(0,e.expect)(g).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const u=a.sendCommand.mock.calls[4][0];(0,e.expect)(u).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(u.args.kind).toBe("descriptor"),(0,e.expect)(u.args.dataHex).toBe(r),(0,e.expect)(u.args.signatureHex).toBe(r)}),(0,e.it)("parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValue(n);const s=t.Keypair.generate(),o=t.Keypair.generate().publicKey,y=t.SystemProgram.transfer({fromPubkey:s.publicKey,toPubkey:o,lamports:1234}),c=t.Keypair.generate(),O=t.Keypair.generate().publicKey,g=t.Keypair.generate().publicKey,u=(0,p.createTransferInstruction)(O,g,c.publicKey,42n,[],p.TOKEN_PROGRAM_ID),w=new t.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),A=new t.TransactionInstruction({programId:w,keys:[],data:M.Buffer.from("hi")}),{raw:K}=Z([y,u,A],[s,c],s),N=t.SystemProgram.programId.toBase58(),S=w.toBase58(),V=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[N]:{data:r,signatures:{[d.MODE]:r}},[S]:{data:r,signatures:{[d.MODE]:r}}}}],P={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:V,transactionBytes:K},b=await new d.ProvideSolanaTransactionContextTask(a,P,E.DefaultSolanaMessageNormaliser).run();(0,e.expect)(b).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const T=a.sendCommand.mock.calls[4][0];(0,e.expect)(T.args.kind).toBe("descriptor");const v=a.sendCommand.mock.calls[5][0];(0,e.expect)(v.args.kind).toBe("empty");const x=a.sendCommand.mock.calls[6][0];(0,e.expect)(x.args.kind).toBe("descriptor")}),(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(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValue(n);const s=t.Keypair.generate(),o=t.Keypair.generate().publicKey,y=t.SystemProgram.transfer({fromPubkey:s.publicKey,toPubkey:o,lamports:5678}),c=t.Keypair.generate().publicKey,O=t.Keypair.generate().publicKey,g=(0,p.getAssociatedTokenAddressSync)(O,c,!0,p.TOKEN_PROGRAM_ID,p.ASSOCIATED_TOKEN_PROGRAM_ID),u=(0,p.createAssociatedTokenAccountInstruction)(s.publicKey,g,c,O,p.TOKEN_PROGRAM_ID,p.ASSOCIATED_TOKEN_PROGRAM_ID),w=new t.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),A=new t.TransactionInstruction({programId:w,keys:[],data:M.Buffer.from("hello")}),{raw:K}=q([y,u,A],[],s),N=t.SystemProgram.programId.toBase58(),S=p.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),V=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[N]:{data:r,signatures:{[d.MODE]:r}},[S]:{data:r,signatures:{[d.MODE]:r}}}}],P={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:V,transactionBytes:K},b=await new d.ProvideSolanaTransactionContextTask(a,P,E.DefaultSolanaMessageNormaliser).run();(0,e.expect)(b).toEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const T=a.sendCommand.mock.calls[4][0];(0,e.expect)(T).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(T.args.kind).toBe("descriptor");const v=a.sendCommand.mock.calls[5][0];(0,e.expect)(v).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(v.args.kind).toBe("descriptor");const x=a.sendCommand.mock.calls[6][0];(0,e.expect)(x).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(x.args.kind).toBe("empty")}),(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(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValue(n);const s=t.Keypair.generate(),o=t.Keypair.generate().publicKey,y=t.SystemProgram.transfer({fromPubkey:s.publicKey,toPubkey:o,lamports:7777}),c=t.Keypair.generate(),O=t.Keypair.generate().publicKey,g=t.Keypair.generate().publicKey,u=(0,p.getAssociatedTokenAddressSync)(O,g,!0,p.TOKEN_PROGRAM_ID,p.ASSOCIATED_TOKEN_PROGRAM_ID),w=(0,p.createAssociatedTokenAccountInstruction)(s.publicKey,u,g,O,p.TOKEN_PROGRAM_ID,p.ASSOCIATED_TOKEN_PROGRAM_ID),A=t.Keypair.generate().publicKey,K=(0,p.createTransferInstruction)(A,u,c.publicKey,9n,[],p.TOKEN_PROGRAM_ID),{raw:N}=q([y,w,K],[c],s),S=t.SystemProgram.programId.toBase58(),V=p.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),P=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:I},certificate:m},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[S]:{data:r,signatures:{[d.MODE]:r}},[V]:{data:r,signatures:{[d.MODE]:r}}}}],L={trustedNamePKICertificate:l,tlvDescriptor:i,loadersResults:P,transactionBytes:N},T=await new d.ProvideSolanaTransactionContextTask(a,L,E.DefaultSolanaMessageNormaliser).run();(0,e.expect)(T).toEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const v=a.sendCommand.mock.calls[4][0];(0,e.expect)(v).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(v.args.kind).toBe("descriptor");const x=a.sendCommand.mock.calls[5][0];(0,e.expect)(x).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(x.args.kind).toBe("descriptor");const H=a.sendCommand.mock.calls[6][0];(0,e.expect)(H).toBeInstanceOf(f.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(H.args.kind).toBe("empty")})})});
1
+ "use strict";var G=Object.create;var U=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var z=(a,s,l,m)=>{if(s&&typeof s=="object"||typeof s=="function")for(let u of W(s))!X.call(a,u)&&u!==l&&U(a,u,{get:()=>s[u],enumerable:!(m=j(s,u))||m.enumerable});return a};var J=(a,s,l)=>(l=a!=null?G(Y(a)):{},z(s||!a||!a.__esModule?U(l,"default",{value:a,enumerable:!0}):l,a));var k=require("@ledgerhq/context-module"),v=require("@ledgerhq/device-management-kit"),f=require("@solana/spl-token"),n=require("@solana/web3.js"),h=J(require("bs58")),H=require("buffer"),I=require("purify-ts"),e=require("vitest"),M=require("../../app-binder/command/ProvideTLVDescriptorCommand"),O=require("../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand"),E=require("../../app-binder/services/utils/DefaultSolanaMessageNormaliser"),d=require("./ProvideTransactionContextTask");const q=h.default.encode(new Uint8Array(32).fill(170));function Q(a,s,l){const m=l??s[0]??n.Keypair.generate(),u=new n.Transaction;u.recentBlockhash=q,u.feePayer=m.publicKey,u.add(...a);const B=new Set,i=[m,...s].filter(t=>{const r=t.publicKey.toBase58();return B.has(r)?!1:(B.add(r),!0)});return u.sign(...i),{raw:u.serialize(),payer:m}}function F(a,s,l){const m=l??s[0]??n.Keypair.generate(),u=new n.TransactionMessage({payerKey:m.publicKey,recentBlockhash:q,instructions:a}).compileToV0Message(),B=new n.VersionedTransaction(u);return B.sign([m,...s]),{raw:B.serialize(),payer:m}}const S=a=>({toBase58:()=>a}),D=a=>({normaliseMessage:e.vi.fn(async()=>a)});(0,e.describe)("ProvideSolanaTransactionContextTask (merged)",()=>{let a;const s=(0,v.CommandResultFactory)({data:void 0}),l={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"},i="f0cacc1a";(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:l,tlvDescriptor:m,loadersResults:[],transactionBytes:new Uint8Array([240])},p=await new d.ProvideSolanaTransactionContextTask(a,t).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2);const c=a.sendCommand.mock.calls[0][0];(0,e.expect)(c).toBeInstanceOf(v.LoadCertificateCommand),(0,e.expect)(c.args.certificate).toStrictEqual(l.payload),(0,e.expect)(c.args.keyUsage).toBe(l.keyUsageNumber);const y=a.sendCommand.mock.calls[1][0];(0,e.expect)(y).toBeInstanceOf(M.ProvideTLVDescriptorCommand),(0,e.expect)(y.args.payload).toStrictEqual(m),(0,e.expect)(p).toStrictEqual(I.Nothing)}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand",async()=>{a.sendCommand.mockRejectedValueOnce(new Error("oupsy"));const t={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:[],transactionBytes:new Uint8Array([202])},r=new d.ProvideSolanaTransactionContextTask(a,t);await(0,e.expect)(r.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"}}],r={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26])},c=await new d.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(c).toStrictEqual(I.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(v.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(M.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}],r={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26])},c=await new d.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4);const y=a.sendCommand.mock.calls[2][0];(0,e.expect)(y).toBeInstanceOf(v.LoadCertificateCommand),(0,e.expect)(y.args.certificate).toStrictEqual(u.payload),(0,e.expect)(y.args.keyUsage).toBe(u.keyUsageNumber);const g=a.sendCommand.mock.calls[3][0];(0,e.expect)(g).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(g.args.kind).toBe("descriptor"),(0,e.expect)(g.args.dataHex).toBe(B.data),(0,e.expect)(g.args.signatureHex).toBe(B.signature),(0,e.expect)(g.args.isFirstMessage).toBe(!0),(0,e.expect)(g.args.swapSignatureTag).toBe(!1),(0,e.expect)(c).toStrictEqual(I.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}],r={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([240])},c=await new d.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(c).toStrictEqual(I.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}],r={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([202])},c=await new d.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(c).toStrictEqual(I.Nothing)}),(0,e.it)("throws a mapped error when sending token certificate returns a CommandErrorResult",async()=>{const t=(0,v.CommandResultFactory)({error:{_tag:"SomeError",errorCode:27264,message:"bad"}});a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(t);const r=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],p={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:r,transactionBytes:new Uint8Array([204])},c=new d.ProvideSolanaTransactionContextTask(a,p);await(0,e.expect)(c.run()).rejects.toThrow("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(3);const y=a.sendCommand.mock.calls[2][0];(0,e.expect)(y).toBeInstanceOf(v.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}],r={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26])},c=await new d.ProvideSolanaTransactionContextTask(a,r,{normaliseMessage:e.vi.fn()}).run();(0,e.expect)(c).toStrictEqual(I.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(v.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(M.ProvideTLVDescriptorCommand),(0,e.expect)(a.sendCommand.mock.calls[2][0]).toBeInstanceOf(v.LoadCertificateCommand);const y=a.sendCommand.mock.calls[3][0];(0,e.expect)(y).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(y.args.swapSignatureTag).toBe(!1),(0,e.expect)(y.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:[S("A_PID"),S("B_PID"),S("C_PID")]},r=D(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:i,signatures:{[d.SWAP_MODE]:i}},C_PID:{data:i,signatures:{[d.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([240])},g=await new d.ProvideSolanaTransactionContextTask(a,c,r).run();(0,e.expect)(g).toStrictEqual(I.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("descriptor"),(0,e.expect)(o.args.dataHex).toBe(i),(0,e.expect)(o.args.signatureHex).toBe(i),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0);const T=a.sendCommand.mock.calls[5][0];(0,e.expect)(T).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(T.args.kind).toBe("empty"),(0,e.expect)(T.args.isFirstMessage).toBe(!1),(0,e.expect)(T.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[6][0];(0,e.expect)(A).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(A.args.kind).toBe("descriptor"),(0,e.expect)(A.args.dataHex).toBe(i),(0,e.expect)(A.args.signatureHex).toBe(i),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0),(0,e.expect)(r.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:[S("ONLY_PID")]},r=D(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{ONLY_PID:{data:i,signatures:{}}}}],c={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([202])},g=await new d.ProvideSolanaTransactionContextTask(a,c,r).run();(0,e.expect)(g).toStrictEqual(I.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.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:[S("X")]},r=D(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{}}],c={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([204])},g=await new d.ProvideSolanaTransactionContextTask(a,c,r).run();(0,e.expect)(g).toStrictEqual(I.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.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:[S("A_PID"),S("B_PID"),S("C_PID")]},r=D(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:i,signatures:{[d.SWAP_MODE]:i}},C_PID:{data:i,signatures:{[d.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([26])},y=new d.ProvideSolanaTransactionContextTask(a,c,r);await(0,e.expect)(y.run()).rejects.toThrow("err"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(6);const g=a.sendCommand.mock.calls[4][0];(0,e.expect)(g).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(g.args.kind).toBe("descriptor"),(0,e.expect)(g.args.isFirstMessage).toBe(!0),(0,e.expect)(g.args.swapSignatureTag).toBe(!0);const o=a.sendCommand.mock.calls[5][0];(0,e.expect)(o).toBeInstanceOf(O.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:[S("SIG_PID")]},r=D(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{SIG_PID:{data:i,signatures:{prod:"deadbeef",[d.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([240])},g=await new d.ProvideSolanaTransactionContextTask(a,c,r).run();(0,e.expect)(g).toStrictEqual(I.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("descriptor"),(0,e.expect)(o.args.dataHex).toBe(i),(0,e.expect)(o.args.signatureHex).toBe(i),(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(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:1234}),c=n.Keypair.generate(),y=n.Keypair.generate().publicKey,g=n.Keypair.generate().publicKey,o=(0,f.createTransferInstruction)(y,g,c.publicKey,42n,[],f.TOKEN_PROGRAM_ID),T=new n.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),A=new n.TransactionInstruction({programId:T,keys:[],data:H.Buffer.from("hi")}),{raw:x}=Q([p,o,A],[t,c],t),V=n.SystemProgram.programId.toBase58(),K=T.toBase58(),N=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[V]:{data:i,signatures:{[d.SWAP_MODE]:i}},[K]:{data:i,signatures:{[d.SWAP_MODE]:i}}}}],P={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:N,transactionBytes:x},_=await new d.ProvideSolanaTransactionContextTask(a,P,E.DefaultSolanaMessageNormaliser).run();(0,e.expect)(_).toStrictEqual(I.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 C=a.sendCommand.mock.calls[5][0];(0,e.expect)(C.args.kind).toBe("empty"),(0,e.expect)(C.args.isFirstMessage).toBe(!1),(0,e.expect)(C.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[6][0];(0,e.expect)(w.args.kind).toBe("descriptor"),(0,e.expect)(w.args.isFirstMessage).toBe(!1),(0,e.expect)(w.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(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:5678}),c=n.Keypair.generate().publicKey,y=n.Keypair.generate().publicKey,g=(0,f.getAssociatedTokenAddressSync)(y,c,!0,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,f.createAssociatedTokenAccountInstruction)(t.publicKey,g,c,y,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),T=new n.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),A=new n.TransactionInstruction({programId:T,keys:[],data:H.Buffer.from("hello")}),{raw:x}=F([p,o,A],[],t),V=n.SystemProgram.programId.toBase58(),K=f.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),N=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[V]:{data:i,signatures:{[d.SWAP_MODE]:i}},[K]:{data:i,signatures:{[d.SWAP_MODE]:i}}}}],P={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:N,transactionBytes:x},_=await new d.ProvideSolanaTransactionContextTask(a,P,E.DefaultSolanaMessageNormaliser).run();(0,e.expect)(_).toEqual(I.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const R=a.sendCommand.mock.calls[4][0];(0,e.expect)(R).toBeInstanceOf(O.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 C=a.sendCommand.mock.calls[5][0];(0,e.expect)(C).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(C.args.kind).toBe("descriptor"),(0,e.expect)(C.args.isFirstMessage).toBe(!1),(0,e.expect)(C.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[6][0];(0,e.expect)(w).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(w.args.kind).toBe("empty"),(0,e.expect)(w.args.isFirstMessage).toBe(!1),(0,e.expect)(w.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(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:7777}),c=n.Keypair.generate(),y=n.Keypair.generate().publicKey,g=n.Keypair.generate().publicKey,o=(0,f.getAssociatedTokenAddressSync)(y,g,!0,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),T=(0,f.createAssociatedTokenAccountInstruction)(t.publicKey,o,g,y,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),A=n.Keypair.generate().publicKey,x=(0,f.createTransferInstruction)(A,o,c.publicKey,9n,[],f.TOKEN_PROGRAM_ID),{raw:V}=F([p,T,x],[c],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:i,signatures:{[d.SWAP_MODE]:i}},[N]:{data:i,signatures:{[d.SWAP_MODE]:i}}}}],L={trustedNamePKICertificate:l,tlvDescriptor:m,loadersResults:P,transactionBytes:V},R=await new d.ProvideSolanaTransactionContextTask(a,L,E.DefaultSolanaMessageNormaliser).run();(0,e.expect)(R).toEqual(I.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const C=a.sendCommand.mock.calls[4][0];(0,e.expect)(C).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(C.args.kind).toBe("descriptor"),(0,e.expect)(C.args.isFirstMessage).toBe(!0),(0,e.expect)(C.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[5][0];(0,e.expect)(w).toBeInstanceOf(O.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 b=a.sendCommand.mock.calls[6][0];(0,e.expect)(b).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(b.args.kind).toBe("empty"),(0,e.expect)(b.args.isFirstMessage).toBe(!1),(0,e.expect)(b.args.swapSignatureTag).toBe(!0)})})});
2
2
  //# sourceMappingURL=ProvideTransactionContextTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/require-await */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n\nimport { SolanaContextTypes } from \"@ledgerhq/context-module/src/solanaToken/domain/SolanaTokenContext.js\";\nimport {\n CommandResultFactory,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { Buffer } from \"buffer\";\nimport { Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTLVTransactionInstructionDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand\";\nimport { ProvideTrustedDynamicDescriptorCommand } from \"@internal/app-binder/command/ProvideTrustedDynamicDescriptorCommand\";\nimport { DefaultSolanaMessageNormaliser } from \"@internal/app-binder/services/utils/DefaultSolanaMessageNormaliser\";\n\nimport {\n MODE,\n ProvideSolanaTransactionContextTask,\n} from \"./ProvideTransactionContextTask\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(0xaa));\n\nfunction makeSignedRawLegacy(\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 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 tx.sign(...uniq);\n return { raw: tx.serialize(), payer };\n}\n\nfunction makeSignedRawV0(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const messageV0 = new TransactionMessage({\n payerKey: payer.publicKey,\n recentBlockhash: DUMMY_BLOCKHASH,\n instructions: ixs,\n }).compileToV0Message(); // no ALTs -> offline-safe\n\n const vtx = new VersionedTransaction(messageV0);\n vtx.sign([payer, ...signers]);\n return { raw: vtx.serialize(), payer };\n}\n\nconst makeKey = (base58: string) => ({ toBase58: () => base58 });\n\nconst buildNormaliser = (message: any) =>\n ({\n normaliseMessage: vi.fn(async () => message),\n }) as const;\n\ndescribe(\"ProvideSolanaTransactionContextTask (merged)\", () => {\n let api: { sendCommand: Mock };\n const success = CommandResultFactory({ data: undefined });\n\n const baseCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 1,\n } as const;\n const tlvDescriptor = new Uint8Array([0xaa, 0xbb, 0xcc]);\n\n const tokenCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 2,\n } as const;\n\n const tokenDescriptor = {\n data: \"f0cacc1a\",\n signature: \"01020304\",\n } as const;\n\n const SIG = \"f0cacc1a\";\n\n beforeEach(() => {\n vi.resetAllMocks();\n api = {\n sendCommand: vi.fn(),\n };\n });\n\n // basic context\n describe(\"basic context\", () => {\n it(\"sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // LoadCertificateCommand (trusted name PKI)\n .mockResolvedValueOnce(success); // ProvideTLVDescriptorCommand\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xf0]), // unused in this path\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n\n const first = api.sendCommand.mock.calls[0]![0]!;\n expect(first).toBeInstanceOf(LoadCertificateCommand);\n expect(first.args.certificate).toStrictEqual(baseCert.payload);\n expect(first.args.keyUsage).toBe(baseCert.keyUsageNumber);\n\n const second = api.sendCommand.mock.calls[1]![0]!;\n expect(second).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(second.args.payload).toStrictEqual(tlvDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand\", async () => {\n // given\n api.sendCommand.mockRejectedValueOnce(new Error(\"oupsy\"));\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"oupsy\");\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)\", async () => {\n // given: include an ERROR loader which should be ignored\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n { type: SolanaContextTypes.ERROR, error: { message: \"err\" } as any },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n });\n });\n\n // basic context + token metadata\n\n describe(\"basic context + token\", () => {\n it(\"when token metadata present, sends token certificate then dynamic descriptor\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI certificate\n .mockResolvedValueOnce(success) // TLV descriptor\n .mockResolvedValueOnce(success) // token metadata certificate\n .mockResolvedValueOnce(success); // dynamic descriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: tokenDescriptor,\n },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]), // unused in this path\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n expect(third.args.certificate).toStrictEqual(tokenCert.payload);\n expect(third.args.keyUsage).toBe(tokenCert.keyUsageNumber);\n\n const fourth = api.sendCommand.mock.calls[3]![0]!;\n expect(fourth).toBeInstanceOf(ProvideTrustedDynamicDescriptorCommand);\n expect(fourth.args.data).toBe(tokenDescriptor.data);\n expect(fourth.args.signature).toBe(tokenDescriptor.signature);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token payload is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: undefined,\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token certificate is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: undefined,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws a mapped error when sending token certificate returns a CommandErrorResult\", async () => {\n // given\n const errorResult = CommandResultFactory({\n error: { _tag: \"SomeError\", errorCode: 0x6a80, message: \"bad\" },\n });\n\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(errorResult); // token certificate -> error\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when + then\n await expect(task.run()).rejects.toThrow(\n \"[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required\",\n );\n\n // ensure the dynamic descriptor was NOT attempted\n expect(api.sendCommand).toHaveBeenCalledTimes(3);\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n });\n\n it(\"does not send swap APDUs when SOLANA_LIFI context is missing (token present)\", async () => {\n // given: base + token succeed, but no LIFI in loadersResults\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success); // token dyn desc\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n // no SOLANA_LIFI entry\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n { normaliseMessage: vi.fn() } as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token only\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n expect(api.sendCommand.mock.calls[2]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[3]![0]!).toBeInstanceOf(\n ProvideTrustedDynamicDescriptorCommand,\n );\n });\n });\n\n // basic context + token + lifi (swap)\n describe(\"basic context + token + lifi\", () => {\n it(\"sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token dyn desc\n .mockResolvedValue(success); // swap APDUs\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 },\n { programIdIndex: 1 },\n { programIdIndex: 2 },\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.dataHex).toBe(SIG);\n expect(c2.args.signatureHex).toBe(SIG);\n\n expect((normaliser as any).normaliseMessage).toHaveBeenCalledOnce();\n });\n\n it(\"sends empty when descriptor exists but signatures[MODE] is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token dyn desc\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"ONLY_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n ONLY_PID: {\n data: SIG,\n signatures: {\n // no [MODE] key\n },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n });\n\n it(\"sends empty when programId is missing for an instruction\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token dyn desc\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 5 }], // out-of-range\n allKeys: [makeKey(\"X\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n { type: SolanaContextTypes.SOLANA_LIFI, payload: {} },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token dyn desc\n .mockResolvedValueOnce(success) // 1st swap ok\n .mockRejectedValueOnce(new Error(\"err\")); // 2nd swap fails\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 }, // descriptor\n { programIdIndex: 1 }, // empty -> rejects\n { programIdIndex: 2 }, // not reached\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"err\");\n // 2 base + 2 token + 2 swap (failed on 2nd)\n expect(api.sendCommand).toHaveBeenCalledTimes(6);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n });\n\n it(\"uses signatures[MODE] specifically when present\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token dyn desc\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"SIG_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n SIG_PID: {\n data: SIG,\n signatures: { prod: \"deadbeef\", [MODE]: SIG },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n });\n\n it(\"parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token dyn desc\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const dest1 = Keypair.generate().publicKey;\n const ix1 = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest1,\n lamports: 1234,\n });\n\n const owner = Keypair.generate();\n const srcToken = Keypair.generate().publicKey;\n const dstToken = Keypair.generate().publicKey;\n const ix2 = createTransferInstruction(\n srcToken,\n dstToken,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const ix3 = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hi\"),\n });\n\n const { raw } = makeSignedRawLegacy(\n [ix1, ix2, ix3],\n [payer, owner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const MEMO_PID = MEMO_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [MODE]: SIG } },\n // Tokenkeg missing -> empty\n [MEMO_PID]: { data: SIG, signatures: { [MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0.args.kind).toBe(\"descriptor\");\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1.args.kind).toBe(\"empty\");\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2.args.kind).toBe(\"descriptor\");\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token dyn desc\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 5_678,\n });\n\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 const ataIx = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const memoIx = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hello\"),\n });\n\n // IMPORTANT: sign only with the payer (no PublicKey in signers array)\n const { raw } = makeSignedRawV0([sysIx, ataIx, memoIx], [], payer);\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [MODE]: SIG } },\n // Memo intentionally missing -> empty\n },\n },\n ];\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const res = await task.run();\n\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Memo missing\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token dyn desc\n .mockResolvedValue(success); // swap APDUs\n\n const payer = Keypair.generate();\n\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 7_777,\n });\n\n const tokenOwner = Keypair.generate(); // owner of the source SPL token account (signer)\n const mint = Keypair.generate().publicKey;\n\n const recipientOwner = Keypair.generate().publicKey; // unfunded account (no ATA yet)\n const recipientATA = getAssociatedTokenAddressSync(\n mint,\n recipientOwner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const createAtaIx = createAssociatedTokenAccountInstruction(\n payer.publicKey, // funder\n recipientATA, // ata to be created\n recipientOwner, // owner of the ATA\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const srcTokenAcc = Keypair.generate().publicKey; // pretend this is an existing token account\n const transferIx = createTransferInstruction(\n srcTokenAcc,\n recipientATA,\n tokenOwner.publicKey, // authority of srcTokenAcc (we will sign with tokenOwner)\n 9n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n // sign v0 with payer + tokenOwner (NO PublicKey objects in the signers array)\n const { raw } = makeSignedRawV0(\n [sysIx, createAtaIx, transferIx],\n [tokenOwner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [MODE]: SIG } },\n // Token Program intentionally missing -> \"empty\"\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n // when\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const res = await task.run();\n\n // then\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Token Program missing\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_SolanaTokenContext", "import_device_management_kit", "import_spl_token", "import_web3", "import_bs58", "import_buffer", "import_purify_ts", "import_vitest", "import_ProvideTLVDescriptorCommand", "import_ProvideTLVTransactionInstructionDescriptorCommand", "import_ProvideTrustedDynamicDescriptorCommand", "import_DefaultSolanaMessageNormaliser", "import_ProvideTransactionContextTask", "DUMMY_BLOCKHASH", "bs58", "makeSignedRawLegacy", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniq", "kp", "k", "makeSignedRawV0", "messageV0", "vtx", "makeKey", "base58", "buildNormaliser", "message", "api", "success", "baseCert", "tlvDescriptor", "tokenCert", "tokenDescriptor", "SIG", "context", "result", "first", "second", "task", "loadersResults", "third", "fourth", "errorResult", "normaliser", "c0", "c1", "c2", "dest1", "ix1", "owner", "srcToken", "dstToken", "ix2", "MEMO_PROGRAM_ID", "ix3", "raw", "SYSTEM_PID", "MEMO_PID", "sysDest", "sysIx", "mint", "ata", "ataIx", "memoIx", "ATA_PID", "res", "tokenOwner", "recipientOwner", "recipientATA", "createAtaIx", "srcTokenAcc", "transferIx"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/require-await */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n\nimport { SolanaContextTypes } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { Buffer } from \"buffer\";\nimport { Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTLVTransactionInstructionDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand\";\nimport { DefaultSolanaMessageNormaliser } from \"@internal/app-binder/services/utils/DefaultSolanaMessageNormaliser\";\n\nimport {\n ProvideSolanaTransactionContextTask,\n SWAP_MODE,\n} from \"./ProvideTransactionContextTask\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(0xaa));\n\nfunction makeSignedRawLegacy(\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 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 tx.sign(...uniq);\n return { raw: tx.serialize(), payer };\n}\n\nfunction makeSignedRawV0(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const messageV0 = new TransactionMessage({\n payerKey: payer.publicKey,\n recentBlockhash: DUMMY_BLOCKHASH,\n instructions: ixs,\n }).compileToV0Message(); // no ALTs -> offline-safe\n\n const vtx = new VersionedTransaction(messageV0);\n vtx.sign([payer, ...signers]);\n return { raw: vtx.serialize(), payer };\n}\n\nconst makeKey = (base58: string) => ({ toBase58: () => base58 });\n\nconst buildNormaliser = (message: any) =>\n ({\n normaliseMessage: vi.fn(async () => message),\n }) as const;\n\ndescribe(\"ProvideSolanaTransactionContextTask (merged)\", () => {\n let api: { sendCommand: Mock };\n const success = CommandResultFactory({ data: undefined });\n\n const baseCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 1,\n } as const;\n const tlvDescriptor = new Uint8Array([0xaa, 0xbb, 0xcc]);\n\n const tokenCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 2,\n } as const;\n\n const tokenDescriptor = {\n data: \"f0cacc1a\",\n signature: \"01020304\",\n } as const;\n\n const SIG = \"f0cacc1a\";\n\n beforeEach(() => {\n vi.resetAllMocks();\n api = {\n sendCommand: vi.fn(),\n };\n });\n\n // basic context\n describe(\"basic context\", () => {\n it(\"sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // LoadCertificateCommand (trusted name PKI)\n .mockResolvedValueOnce(success); // ProvideTLVDescriptorCommand\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xf0]), // unused in this path\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n\n const first = api.sendCommand.mock.calls[0]![0]!;\n expect(first).toBeInstanceOf(LoadCertificateCommand);\n expect(first.args.certificate).toStrictEqual(baseCert.payload);\n expect(first.args.keyUsage).toBe(baseCert.keyUsageNumber);\n\n const second = api.sendCommand.mock.calls[1]![0]!;\n expect(second).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(second.args.payload).toStrictEqual(tlvDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand\", async () => {\n // given\n api.sendCommand.mockRejectedValueOnce(new Error(\"oupsy\"));\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"oupsy\");\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)\", async () => {\n // given: include an ERROR loader which should be ignored\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n { type: SolanaContextTypes.ERROR, error: { message: \"err\" } as any },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n });\n });\n\n // basic context + token metadata\n\n describe(\"basic context + token\", () => {\n it(\"when token metadata present, sends token certificate then TLV transaction-instruction descriptor\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI certificate\n .mockResolvedValueOnce(success) // TLV descriptor\n .mockResolvedValueOnce(success) // token metadata certificate\n .mockResolvedValueOnce(success); // token descriptor via TLVTransactionInstructionDescriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: tokenDescriptor,\n },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]), // unused in this path\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n expect(third.args.certificate).toStrictEqual(tokenCert.payload);\n expect(third.args.keyUsage).toBe(tokenCert.keyUsageNumber);\n\n const fourth = api.sendCommand.mock.calls[3]![0]!;\n expect(fourth).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(fourth.args.kind).toBe(\"descriptor\");\n expect(fourth.args.dataHex).toBe(tokenDescriptor.data);\n expect(fourth.args.signatureHex).toBe(tokenDescriptor.signature);\n expect(fourth.args.isFirstMessage).toBe(true);\n expect(fourth.args.swapSignatureTag).toBe(false);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token payload is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: undefined,\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token certificate is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: undefined,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws a mapped error when sending token certificate returns a CommandErrorResult\", async () => {\n // given\n const errorResult = CommandResultFactory({\n error: { _tag: \"SomeError\", errorCode: 0x6a80, message: \"bad\" },\n });\n\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(errorResult); // token certificate -> error\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when + then\n await expect(task.run()).rejects.toThrow(\n \"[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required\",\n );\n\n // ensure the TLVTransactionInstructionDescriptor was NOT attempted\n expect(api.sendCommand).toHaveBeenCalledTimes(3);\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n });\n\n it(\"does not send swap APDUs when SOLANA_LIFI context is missing (token present)\", async () => {\n // given: base + token succeed, but no LIFI in loadersResults\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success); // token TLVTransactionInstructionDescriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n // no SOLANA_LIFI entry\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n { normaliseMessage: vi.fn() } as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token only\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n expect(api.sendCommand.mock.calls[2]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n const tokenCmd = api.sendCommand.mock.calls[3]![0]!;\n expect(tokenCmd).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(tokenCmd.args.swapSignatureTag).toBe(false);\n expect(tokenCmd.args.isFirstMessage).toBe(true);\n });\n });\n\n // basic context + token + lifi (swap)\n describe(\"basic context + token + lifi\", () => {\n it(\"sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success); // swap APDUs\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 },\n { programIdIndex: 1 },\n { programIdIndex: 2 },\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.dataHex).toBe(SIG);\n expect(c2.args.signatureHex).toBe(SIG);\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n\n expect((normaliser as any).normaliseMessage).toHaveBeenCalledOnce();\n });\n\n it(\"sends empty when descriptor exists but signatures[SWAP_MODE] is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"ONLY_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n ONLY_PID: {\n data: SIG,\n signatures: {\n // no [SWAP_MODE] key\n },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"sends empty when programId is missing for an instruction\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 5 }], // out-of-range\n allKeys: [makeKey(\"X\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n { type: SolanaContextTypes.SOLANA_LIFI, payload: {} },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValueOnce(success) // 1st swap ok\n .mockRejectedValueOnce(new Error(\"err\")); // 2nd swap fails\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 }, // descriptor\n { programIdIndex: 1 }, // empty -> rejects\n { programIdIndex: 2 }, // not reached\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"err\");\n // 2 base + 2 token + 2 swap (failed on 2nd)\n expect(api.sendCommand).toHaveBeenCalledTimes(6);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n });\n\n it(\"uses signatures[SWAP_MODE] specifically when present\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"SIG_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n SIG_PID: {\n data: SIG,\n signatures: { prod: \"deadbeef\", [SWAP_MODE]: SIG },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const dest1 = Keypair.generate().publicKey;\n const ix1 = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest1,\n lamports: 1234,\n });\n\n const owner = Keypair.generate();\n const srcToken = Keypair.generate().publicKey;\n const dstToken = Keypair.generate().publicKey;\n const ix2 = createTransferInstruction(\n srcToken,\n dstToken,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const ix3 = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hi\"),\n });\n\n const { raw } = makeSignedRawLegacy(\n [ix1, ix2, ix3],\n [payer, owner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const MEMO_PID = MEMO_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Tokenkeg missing -> empty\n [MEMO_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 5_678,\n });\n\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 const ataIx = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const memoIx = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hello\"),\n });\n\n // IMPORTANT: sign only with the payer (no PublicKey in signers array)\n const { raw } = makeSignedRawV0([sysIx, ataIx, memoIx], [], payer);\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Memo intentionally missing -> empty\n },\n },\n ];\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const res = await task.run();\n\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Memo missing\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success); // swap APDUs\n\n const payer = Keypair.generate();\n\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 7_777,\n });\n\n const tokenOwner = Keypair.generate(); // owner of the source SPL token account (signer)\n const mint = Keypair.generate().publicKey;\n\n const recipientOwner = Keypair.generate().publicKey; // unfunded account (no ATA yet)\n const recipientATA = getAssociatedTokenAddressSync(\n mint,\n recipientOwner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const createAtaIx = createAssociatedTokenAccountInstruction(\n payer.publicKey, // funder\n recipientATA, // ata to be created\n recipientOwner, // owner of the ATA\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const srcTokenAcc = Keypair.generate().publicKey; // pretend this is an existing token account\n const transferIx = createTransferInstruction(\n srcTokenAcc,\n recipientATA,\n tokenOwner.publicKey, // authority of srcTokenAcc (we will sign with tokenOwner)\n 9n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n // sign v0 with payer + tokenOwner (NO PublicKey objects in the signers array)\n const { raw } = makeSignedRawV0(\n [sysIx, createAtaIx, transferIx],\n [tokenOwner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Token Program intentionally missing -> \"empty\"\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n // when\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const res = await task.run();\n\n // then\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Token Program missing\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_context_module", "import_device_management_kit", "import_spl_token", "import_web3", "import_bs58", "import_buffer", "import_purify_ts", "import_vitest", "import_ProvideTLVDescriptorCommand", "import_ProvideTLVTransactionInstructionDescriptorCommand", "import_DefaultSolanaMessageNormaliser", "import_ProvideTransactionContextTask", "DUMMY_BLOCKHASH", "bs58", "makeSignedRawLegacy", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniq", "kp", "k", "makeSignedRawV0", "messageV0", "vtx", "makeKey", "base58", "buildNormaliser", "message", "api", "success", "baseCert", "tlvDescriptor", "tokenCert", "tokenDescriptor", "SIG", "context", "result", "first", "second", "task", "loadersResults", "third", "fourth", "errorResult", "tokenCmd", "normaliser", "c0", "c1", "c2", "dest1", "ix1", "owner", "srcToken", "dstToken", "ix2", "MEMO_PROGRAM_ID", "ix3", "raw", "SYSTEM_PID", "MEMO_PID", "sysDest", "sysIx", "mint", "ata", "ataIx", "memoIx", "ATA_PID", "res", "tokenOwner", "recipientOwner", "recipientATA", "createAtaIx", "srcTokenAcc", "transferIx"]
7
7
  }
@@ -1,39 +1,4 @@
1
1
  {
2
- "name": "@ledgerhq/device-signer-kit-solana",
3
- "version": "1.4.1",
4
- "private": false,
5
- "license": "Apache-2.0",
6
- "exports": {
7
- ".": {
8
- "types": "./lib/types/index.d.ts",
9
- "import": "./lib/esm/index.js",
10
- "require": "./lib/cjs/index.js"
11
- },
12
- "./*": {
13
- "types": "./lib/types/*",
14
- "import": "./lib/esm/*",
15
- "require": "./lib/cjs/*"
16
- }
17
- },
18
- "files": [
19
- "./lib"
20
- ],
21
- "scripts": {
22
- "prebuild": "rimraf lib",
23
- "build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
24
- "dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
25
- "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
26
- "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\"",
27
- "lint": "eslint",
28
- "lint:fix": "pnpm lint --fix",
29
- "postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
30
- "prettier": "prettier . --check",
31
- "prettier:fix": "prettier . --write",
32
- "typecheck": "tsc --noEmit",
33
- "test": "vitest run",
34
- "test:watch": "vitest",
35
- "test:coverage": "vitest run --coverage"
36
- },
37
2
  "dependencies": {
38
3
  "@ledgerhq/context-module": "workspace:*",
39
4
  "@ledgerhq/signer-utils": "workspace:*",
@@ -58,7 +23,46 @@
58
23
  "rxjs": "catalog:",
59
24
  "ts-node": "catalog:"
60
25
  },
26
+ "exports": {
27
+ ".": {
28
+ "import": "./lib/esm/index.js",
29
+ "require": "./lib/cjs/index.js",
30
+ "types": "./lib/types/index.d.ts"
31
+ },
32
+ "./*": {
33
+ "import": "./lib/esm/*",
34
+ "require": "./lib/cjs/*",
35
+ "types": "./lib/types/*"
36
+ }
37
+ },
38
+ "files": [
39
+ "./lib"
40
+ ],
41
+ "license": "Apache-2.0",
42
+ "name": "@ledgerhq/device-signer-kit-solana",
61
43
  "peerDependencies": {
62
44
  "@ledgerhq/device-management-kit": "workspace:*"
63
- }
45
+ },
46
+ "private": false,
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "https://github.com/LedgerHQ/device-sdk-ts.git"
50
+ },
51
+ "scripts": {
52
+ "build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
53
+ "dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
54
+ "lint": "eslint",
55
+ "lint:fix": "pnpm lint --fix",
56
+ "postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
57
+ "prebuild": "rimraf lib",
58
+ "prettier": "prettier . --check",
59
+ "prettier:fix": "prettier . --write",
60
+ "test": "vitest run",
61
+ "test:coverage": "vitest run --coverage",
62
+ "test:watch": "vitest",
63
+ "typecheck": "tsc --noEmit",
64
+ "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
65
+ "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
66
+ },
67
+ "version": "0.0.0-dsdk-938-release-automation-4-20251201132435"
64
68
  }
@@ -1,2 +1,2 @@
1
- var e=(n=>(n.OPEN_APP="signer.sol.steps.openApp",n.GET_APP_CONFIG="signer.sol.steps.getAppConfig",n.INSPECT_TRANSACTION="signer.sol.steps.inspectTransaction",n.BUILD_TRANSACTION_CONTEXT="signer.sol.steps.buildTransactionContext",n.PROVIDE_TRANSACTION_CONTEXT="signer.sol.steps.provideTransactionContext",n.SIGN_TRANSACTION="signer.sol.steps.signTransaction",n))(e||{});export{e as SignTransactionDAStateStep};
1
+ const t=Object.freeze({OPEN_APP:"signer.sol.steps.openApp",GET_APP_CONFIG:"signer.sol.steps.getAppConfig",INSPECT_TRANSACTION:"signer.sol.steps.inspectTransaction",BUILD_TRANSACTION_CONTEXT:"signer.sol.steps.buildTransactionContext",PROVIDE_TRANSACTION_CONTEXT:"signer.sol.steps.provideTransactionContext",SIGN_TRANSACTION:"signer.sol.steps.signTransaction"});export{t as signTransactionDAStateSteps};
2
2
  //# sourceMappingURL=SignTransactionDeviceActionTypes.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/app-binder/SignTransactionDeviceActionTypes.ts"],
4
- "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport enum SignTransactionDAStateStep {\n OPEN_APP = \"signer.sol.steps.openApp\",\n GET_APP_CONFIG = \"signer.sol.steps.getAppConfig\",\n INSPECT_TRANSACTION = \"signer.sol.steps.inspectTransaction\",\n BUILD_TRANSACTION_CONTEXT = \"signer.sol.steps.buildTransactionContext\",\n PROVIDE_TRANSACTION_CONTEXT = \"signer.sol.steps.provideTransactionContext\",\n SIGN_TRANSACTION = \"signer.sol.steps.signTransaction\",\n}\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly transactionOptions?: SolanaTransactionOptionalConfig;\n readonly contextModule: ContextModule;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n step: SignTransactionDAStateStep;\n};\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
5
- "mappings": "AAkBO,IAAKA,OACVA,EAAA,SAAW,2BACXA,EAAA,eAAiB,gCACjBA,EAAA,oBAAsB,sCACtBA,EAAA,0BAA4B,2CAC5BA,EAAA,4BAA8B,6CAC9BA,EAAA,iBAAmB,mCANTA,OAAA",
6
- "names": ["SignTransactionDAStateStep"]
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport const signTransactionDAStateSteps = Object.freeze({\n OPEN_APP: \"signer.sol.steps.openApp\",\n GET_APP_CONFIG: \"signer.sol.steps.getAppConfig\",\n INSPECT_TRANSACTION: \"signer.sol.steps.inspectTransaction\",\n BUILD_TRANSACTION_CONTEXT: \"signer.sol.steps.buildTransactionContext\",\n PROVIDE_TRANSACTION_CONTEXT: \"signer.sol.steps.provideTransactionContext\",\n SIGN_TRANSACTION: \"signer.sol.steps.signTransaction\",\n} as const);\n\nexport type SignTransactionDAStateStep =\n (typeof signTransactionDAStateSteps)[keyof typeof signTransactionDAStateSteps];\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly transactionOptions?: SolanaTransactionOptionalConfig;\n readonly contextModule: ContextModule;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n step: SignTransactionDAStateStep;\n};\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
5
+ "mappings": "AAkBO,MAAMA,EAA8B,OAAO,OAAO,CACvD,SAAU,2BACV,eAAgB,gCAChB,oBAAqB,sCACrB,0BAA2B,2CAC3B,4BAA6B,6CAC7B,iBAAkB,kCACpB,CAAU",
6
+ "names": ["signTransactionDAStateSteps"]
7
7
  }