@ledgerhq/device-signer-kit-solana 0.0.0-e2e-speculos-20250908084414 → 0.0.0-fix-v0-transaction-unfunded-20250918072642

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 (90) hide show
  1. package/README.md +17 -7
  2. package/lib/cjs/api/SignerSolana.js +1 -1
  3. package/lib/cjs/api/SignerSolana.js.map +1 -1
  4. package/lib/cjs/api/SolanaTools.js +1 -1
  5. package/lib/cjs/api/SolanaTools.js.map +1 -1
  6. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +1 -1
  7. package/lib/cjs/api/index.js +1 -1
  8. package/lib/cjs/api/index.js.map +2 -2
  9. package/lib/cjs/api/model/TransactionOptions.js +1 -1
  10. package/lib/cjs/api/model/TransactionOptions.js.map +1 -1
  11. package/lib/cjs/api/model/TransactionResolutionContext.js +2 -0
  12. package/lib/cjs/api/model/TransactionResolutionContext.js.map +7 -0
  13. package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
  14. package/lib/cjs/internal/DefaultSignerSolana.js.map +3 -3
  15. package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
  16. package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +2 -2
  17. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
  18. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +2 -2
  19. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  20. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +2 -2
  21. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  22. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
  23. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -3
  24. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
  25. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +1 -1
  26. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +3 -3
  27. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  28. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  29. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  30. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +1 -1
  31. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  32. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
  33. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  34. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +2 -2
  35. package/lib/cjs/package.json +1 -1
  36. package/lib/esm/api/index.js +1 -1
  37. package/lib/esm/api/index.js.map +2 -2
  38. package/lib/esm/api/model/TransactionResolutionContext.js +1 -0
  39. package/lib/esm/api/model/TransactionResolutionContext.js.map +7 -0
  40. package/lib/esm/internal/DefaultSignerSolana.js +1 -1
  41. package/lib/esm/internal/DefaultSignerSolana.js.map +3 -3
  42. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  43. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +2 -2
  44. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  45. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +2 -2
  46. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  47. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +2 -2
  48. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  49. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
  50. package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -3
  51. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
  52. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +1 -1
  53. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +3 -3
  54. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  55. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  56. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  57. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +1 -1
  58. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  59. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
  60. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  61. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +2 -2
  62. package/lib/esm/package.json +1 -1
  63. package/lib/types/api/SignerSolana.d.ts +2 -2
  64. package/lib/types/api/SignerSolana.d.ts.map +1 -1
  65. package/lib/types/api/SolanaTools.d.ts +1 -2
  66. package/lib/types/api/SolanaTools.d.ts.map +1 -1
  67. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +2 -1
  68. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  69. package/lib/types/api/index.d.ts +0 -1
  70. package/lib/types/api/index.d.ts.map +1 -1
  71. package/lib/types/api/model/TransactionOptions.d.ts +5 -6
  72. package/lib/types/api/model/TransactionOptions.d.ts.map +1 -1
  73. package/lib/types/api/model/TransactionResolutionContext.d.ts +8 -0
  74. package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -0
  75. package/lib/types/internal/DefaultSignerSolana.d.ts +2 -1
  76. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  77. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +2 -1
  78. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  79. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +3 -0
  80. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  81. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +28 -3
  82. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
  83. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts +23 -0
  84. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts.map +1 -0
  85. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +2 -2
  86. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
  87. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts +2 -3
  88. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts.map +1 -1
  89. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  90. package/package.json +9 -9
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),t=require("vitest"),m=require("../../app-binder/device-action/__test-utils__/testDeviceActionStates"),c=require("../../app-binder/services/TransactionInspector"),f=require("./__test-utils__/makeInternalApi"),A=require("./SignTransactionDeviceAction");const v="44'/501'/0'/0'",y=new Uint8Array([222,173,190,239]),T={getSolanaContext:t.vi.fn(),getContext:t.vi.fn(),getContexts:t.vi.fn(),getTypedDataFilters:t.vi.fn(),getWeb3Checks:t.vi.fn()};let i,u,d,S,g,l;function D(){return{getAppConfig:u,buildContext:d,provideContext:S,signTransaction:g,inspectTransaction:l}}(0,t.describe)("SignTransactionDeviceAction (Solana)",()=>{(0,t.beforeEach)(()=>{i=(0,f.makeDeviceActionInternalApiMock)(),u=t.vi.fn(),d=t.vi.fn(),S=t.vi.fn(),g=t.vi.fn(),l=t.vi.fn().mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL,data:{tokenAddress:null,createATA:!1}})}),(0,t.it)("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL});const n={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(n),S.mockResolvedValue(r.Nothing);const a=new Uint8Array([170,187]);g.mockResolvedValue((0,e.CommandResultFactory)({data:(0,r.Just)(a)}));const p=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:T}});t.vi.spyOn(p,"extractDependencies").mockReturnValue(D());const k=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,m.testDeviceActionStates)(p,k,i,{onDone:o,onError:s})})),(0,t.it)("failure in provideContext still signs",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),S.mockResolvedValue((0,r.Just)((0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("ctxErr")})));const n=new Uint8Array([254]);g.mockResolvedValue((0,e.CommandResultFactory)({data:(0,r.Just)(n)}));const a=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:T}});t.vi.spyOn(a,"extractDependencies").mockReturnValue(D());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:n,status:e.DeviceActionStatus.Completed}];(0,m.testDeviceActionStates)(a,p,i,{onDone:o,onError:s})})),(0,t.it)("buildContext throws \u2192 error",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL}),d.mockRejectedValue(new e.InvalidStatusWordError("bldErr"));const n=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:T}});t.vi.spyOn(n,"extractDependencies").mockReturnValue(D());const a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:expect.anything(),status:e.DeviceActionStatus.Error}];(0,m.testDeviceActionStates)(n,a,i,{onDone:o,onError:s})}))});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),t=require("vitest"),m=require("../../app-binder/device-action/__test-utils__/testDeviceActionStates"),c=require("../../app-binder/services/TransactionInspector"),f=require("./__test-utils__/makeInternalApi"),A=require("./SignTransactionDeviceAction");const v="44'/501'/0'/0'",y=new Uint8Array([222,173,190,239]),T={getSolanaContext:t.vi.fn(),getContext:t.vi.fn(),getContexts:t.vi.fn(),getTypedDataFilters:t.vi.fn(),getWeb3Checks:t.vi.fn()};let i,u,d,S,g,l;function D(){return{getAppConfig:u,buildContext:d,provideContext:S,signTransaction:g,inspectTransaction:l}}(0,t.describe)("SignTransactionDeviceAction (Solana)",()=>{(0,t.beforeEach)(()=>{i=(0,f.makeDeviceActionInternalApiMock)(),u=t.vi.fn(),d=t.vi.fn(),S=t.vi.fn(),g=t.vi.fn(),l=t.vi.fn().mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL,data:{tokenAddress:null,createATA:!1}})}),(0,t.it)("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL});const n={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(n),S.mockResolvedValue(r.Nothing);const a=new Uint8Array([170,187]);g.mockResolvedValue((0,e.CommandResultFactory)({data:(0,r.Just)(a)}));const p=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,transactionOptions:{skipOpenApp:!0},contextModule:T}});t.vi.spyOn(p,"extractDependencies").mockReturnValue(D());const k=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,m.testDeviceActionStates)(p,k,i,{onDone:o,onError:s})})),(0,t.it)("failure in provideContext still signs",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),S.mockResolvedValue((0,r.Just)((0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("ctxErr")})));const n=new Uint8Array([254]);g.mockResolvedValue((0,e.CommandResultFactory)({data:(0,r.Just)(n)}));const a=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,transactionOptions:{skipOpenApp:!0},contextModule:T}});t.vi.spyOn(a,"extractDependencies").mockReturnValue(D());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:n,status:e.DeviceActionStatus.Completed}];(0,m.testDeviceActionStates)(a,p,i,{onDone:o,onError:s})})),(0,t.it)("buildContext throws \u2192 error",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL}),d.mockRejectedValue(new e.InvalidStatusWordError("bldErr"));const n=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,transactionOptions:{skipOpenApp:!0},contextModule:T}});t.vi.spyOn(n,"extractDependencies").mockReturnValue(D());const a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:expect.anything(),status:e.DeviceActionStatus.Error}];(0,m.testDeviceActionStates)(n,a,i,{onDone:o,onError:s})}))});
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.test.ts"],
4
- "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true, // always skip open\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
- "mappings": "aACA,IAAAA,EASO,2CACPC,EAA8B,qBAC9BC,EAA6C,kBAO7CC,EAAuC,oFACvCC,EAAuC,8DAGvCC,EAAgD,4CAChDC,EAA4C,yCAE5C,MAAMC,EAAoB,iBACpBC,EAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAEnDC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,EACxB,WAAY,KAAG,GAAG,EAClB,YAAa,KAAG,GAAG,EACnB,oBAAqB,KAAG,GAAG,EAC3B,cAAe,KAAG,GAAG,CACvB,EAEA,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EAEJ,SAASC,GAAc,CACrB,MAAO,CACL,aAAcL,EACd,aAAcC,EACd,eAAgBC,EAChB,gBAAiBC,EACjB,mBAAoBC,CACtB,CACF,IAEA,YAAS,uCAAwC,IAAM,IACrD,cAAW,IAAM,CACfL,KAAU,mCAAgC,EAC1CC,EAAmB,KAAG,GAAG,EACzBC,EAAmB,KAAG,GAAG,EACzBC,EAAqB,KAAG,GAAG,EAC3BC,EAAW,KAAG,GAAG,EACjBC,EAAyB,KAAG,GAAG,EAAE,kBAAkB,CACjD,gBAAiB,yBAAuB,IACxC,KAAM,CAAE,aAAc,KAAM,UAAW,EAAM,CAC/C,CAAC,CACH,CAAC,KAED,MAAG,8EAA+E,IAChF,IAAI,QAAc,CAACE,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEI,EAAuB,kBAAkB,CACvC,gBAAiB,yBAAuB,GAC1C,CAAC,EAED,MAAMI,EAAgC,CACpC,WAAY,IAAI,WAAW,CAAC,CAAC,CAAC,EAC9B,eAAgB,CAAE,eAAgB,EAAG,QAAS,IAAI,WAAW,CAAC,CAAI,CAAC,CAAE,EACrE,UAAW,OACX,cAAe,CAAE,aAAc,GAAI,MAAO,GAAI,SAAU,EAAG,CAC7D,EACAP,EAAiB,kBAAkBO,CAAG,EACtCN,EAAmB,kBAAkB,SAAO,EAE5C,MAAMO,EAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAC7CN,EAAS,qBACP,wBAAqB,CAAE,QAAM,QAAKM,CAAS,CAAE,CAAC,CAChD,EAEA,MAAMC,EAAS,IAAI,8BAA4B,CAC7C,MAAO,CACL,eAAgBd,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACD,KAAG,MAAMY,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CAAE,OAAQF,EAAW,OAAQ,qBAAmB,SAAU,CAC5D,KAMA,0BAKEC,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,KAEJ,MAAG,wCAAyC,IAC1C,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEI,EAAuB,kBAAkB,CACvC,gBAAiB,yBAAuB,GAC1C,CAAC,EAEDH,EAAiB,kBAAkB,CACjC,WAAY,IAAI,WAAW,CAAC,CAAC,CAAC,EAC9B,eAAgB,CAAE,eAAgB,EAAG,QAAS,IAAI,UAAa,EAC/D,UAAW,OACX,cAAe,CAAE,aAAc,GAAI,MAAO,GAAI,SAAU,EAAG,CAC7D,CAAC,EACDC,EAAmB,qBACjB,WACE,wBAAqB,CAAE,MAAO,IAAI,yBAAuB,QAAQ,CAAE,CAAC,CACtE,CACF,EACA,MAAMU,EAAM,IAAI,WAAW,CAAC,GAAI,CAAC,EACjCT,EAAS,qBAAkB,wBAAqB,CAAE,QAAM,QAAKS,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMF,EAAS,IAAI,8BAA4B,CAC7C,MAAO,CACL,eAAgBd,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACD,KAAG,MAAMY,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CAAE,OAAQC,EAAK,OAAQ,qBAAmB,SAAU,CACtD,KAMA,0BAKEF,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,KAEJ,MAAG,mCAA+B,IAChC,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEI,EAAuB,kBAAkB,CACvC,gBAAiB,yBAAuB,GAC1C,CAAC,EAEDH,EAAiB,kBAAkB,IAAI,yBAAuB,QAAQ,CAAC,EAEvE,MAAMS,EAAS,IAAI,8BAA4B,CAC7C,MAAO,CACL,eAAgBd,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACD,KAAG,MAAMY,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,IACnD,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,MAAO,OAAO,SAAS,EACvB,OAAQ,qBAAmB,KAC7B,CACF,KAMA,0BAKED,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,CACN,CAAC",
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_testDeviceActionStates", "import_TransactionInspector", "import_makeInternalApi", "import_SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "sig"]
7
7
  }
@@ -1,4 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var I=(c,e)=>{for(var s in e)d(c,s,{get:e[s],enumerable:!0})},f=(c,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of T(e))!A.call(c,a)&&a!==s&&d(c,a,{get:()=>e[a],enumerable:!(n=m(e,a))||n.enumerable});return c};var g=c=>f(d({},"__esModule",{value:!0}),c);var b={};I(b,{SolanaTransactionTypes:()=>y,TransactionInspector:()=>k});module.exports=g(b);var r=require("@solana/spl-token"),i=require("@solana/web3.js"),p=require("buffer"),y=(s=>(s.STANDARD="Standard",s.SPL="SPL",s))(y||{});class k{constructor(e){this.rawTransactionBytes=e}inspectTransactionType(){try{const e=this.extractMessage(this.rawTransactionBytes);for(const s of e.compiledInstructions){const n=e.staticAccountKeys[s.programIdIndex];if(!n.equals(r.TOKEN_PROGRAM_ID))continue;const a=new i.TransactionInstruction({programId:n,keys:s.accountKeyIndexes.map(t=>({pubkey:e.staticAccountKeys[t],isSigner:e.isAccountSigner(t),isWritable:e.isAccountWritable(t)})),data:p.Buffer.from(s.data)});switch(a.data[0]){case r.TokenInstruction.Transfer:{const{keys:{destination:t}}=(0,r.decodeTransferInstruction)(a);return{transactionType:"SPL",data:{tokenAddress:t.pubkey.toBase58()}}}case r.TokenInstruction.TransferChecked:{const{keys:{destination:t}}=(0,r.decodeTransferCheckedInstruction)(a);return{transactionType:"SPL",data:{tokenAddress:t.pubkey.toBase58()}}}case r.TokenInstruction.InitializeAccount:{const{keys:{account:t,mint:o}}=(0,r.decodeInitializeAccountInstruction)(a);return{transactionType:"SPL",data:{createATA:{address:t.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}}}}default:continue}}return{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}extractMessage(e){const s=[];try{return i.VersionedTransaction.deserialize(e).message}catch(n){s.push(n.message)}try{return i.VersionedMessage.deserialize(e)}catch(n){s.push(n.message)}try{const n=i.Transaction.from(e),a=[n.feePayer,...n.instructions.flatMap(t=>t.keys.map(o=>o.pubkey))],u=Array.from(new Map(a.filter(Boolean).map(t=>[t.toBase58(),t])).values());return{compiledInstructions:n.instructions.map(t=>({programIdIndex:u.findIndex(o=>o.equals(t.programId)),accountKeyIndexes:t.keys.map(o=>u.findIndex(l=>l.equals(o.pubkey))),data:t.data})),staticAccountKeys:u,isAccountSigner:t=>n.signatures.some(o=>o.publicKey.equals(u[t])),isAccountWritable:()=>!0}}catch(n){s.push(n.message)}throw new Error(`Invalid transaction payload \u2013 all deserializers failed:
2
- `+s.map((n,a)=>`${a+1}) ${n}`).join(`
3
- `))}}0&&(module.exports={SolanaTransactionTypes,TransactionInspector});
1
+ "use strict";var A=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var L=(o,s)=>{for(var r in s)A(o,r,{get:s[r],enumerable:!0})},h=(o,s,r,n)=>{if(s&&typeof s=="object"||typeof s=="function")for(let a of x(s))!S.call(o,a)&&a!==r&&A(o,a,{get:()=>s[a],enumerable:!(n=k(s,a))||n.enumerable});return o};var R=o=>h(A({},"__esModule",{value:!0}),o);var v={};L(v,{SolanaTransactionTypes:()=>g,TransactionInspector:()=>U});module.exports=R(v);var y=require("@solana/spl-token"),c=require("@solana/web3.js"),f=require("buffer"),I=require("../../app-binder/services/utils/transactionDecoders"),g=(r=>(r.STANDARD="Standard",r.SPL="SPL",r))(g||{});const D="https://api.mainnet-beta.solana.com/",M=o=>new c.Connection(o,{commitment:"confirmed"}),T=o=>!!o&&(o.equals(y.ASSOCIATED_TOKEN_PROGRAM_ID)||o.equals(y.TOKEN_PROGRAM_ID)||o.equals(y.TOKEN_2022_PROGRAM_ID));class U{constructor(s,r,n,a){this.rawTransactionBytes=s;this.tokenAddress=r;this.createATA=n;this.injectedRPCURL=a}async inspectTransactionType(){try{const s=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA)return{transactionType:s.compiledInstructions.some(i=>T(s.allKeys[i.programIdIndex]))?"SPL":"Standard",data:{...this.tokenAddress?{tokenAddress:this.tokenAddress}:{},...this.createATA?{createATA:this.createATA}:{}}};let r=!1,n={};for(const a of s.compiledInstructions){const i=s.allKeys[a.programIdIndex];if(!i)continue;T(i)&&(r=!0);const p=a.accountKeyIndexes.map(e=>s.allKeys[e]).filter(e=>!!e),l=new c.TransactionInstruction({programId:i,keys:p.map(e=>({pubkey:e,isSigner:!1,isWritable:!1})),data:f.Buffer.from(a.data)}),u={programId:i,ixMeta:a,message:s,instruction:l};for(const e of I.DECODERS){if(!e.when(u))continue;const t=e.decode(u);t&&(t.createATA&&!n.createATA?n={...n,createATA:t.createATA}:t.tokenAddress&&!n.tokenAddress&&!n.createATA&&(n={...n,tokenAddress:t.tokenAddress}))}}return n.createATA?{transactionType:"SPL",data:n}:n.tokenAddress?{transactionType:"SPL",data:n}:r?{transactionType:"SPL",data:{}}:{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(s){const r=this.tryDeserialiseVersioned(s);if(r){const e=r.message,t=await this.resolveLookedUpAddressesFromMessage(e),K=[...e.staticAccountKeys,...t?.writable??[],...t?.readonly??[]];return{compiledInstructions:e.compiledInstructions.map(d=>{const b=d,P=Array.from(b.accounts??d.accountKeyIndexes??[]);let m;return d.data instanceof Uint8Array?m=d.data:typeof d.data=="string"?m=f.Buffer.from(d.data,"base64"):m=Uint8Array.from(d.data??[]),{programIdIndex:d.programIdIndex,accountKeyIndexes:P,data:m}}),allKeys:K}}const n=c.Transaction.from(s),a=new Map,i=e=>{if(!e)return;const t=e.toBase58();a.has(t)||a.set(t,e)};i(n.feePayer??null);for(const e of n.instructions){i(e.programId);for(const t of e.keys)i(t.pubkey)}const p=Array.from(a.values()),l=new Map(p.map((e,t)=>[e.toBase58(),t]));return{compiledInstructions:n.instructions.map(e=>({programIdIndex:l.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(t=>l.get(t.pubkey.toBase58())??-1),data:e.data})),allKeys:p}}tryDeserialiseVersioned(s){try{return c.VersionedTransaction.deserialize(s)}catch{try{return{message:c.VersionedMessage.deserialize(s)}}catch{return null}}}async resolveLookedUpAddressesFromMessage(s){const r=s.addressTableLookups??[];if(!r.length)return;const n=[],a=[];for(const i of r){const l=(await M(this.injectedRPCURL||D).getAddressLookupTable(i.accountKey)).value;if(!l)continue;const u=l.state.addresses;for(const e of i.writableIndexes??[]){const t=u[e];t&&n.push(t)}for(const e of i.readonlyIndexes??[]){const t=u[e];t&&a.push(t)}}return{writable:n,readonly:a}}}0&&(module.exports={SolanaTransactionTypes,TransactionInspector});
4
2
  //# sourceMappingURL=TransactionInspector.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
4
- "sourcesContent": ["import {\n decodeInitializeAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferInstruction,\n TOKEN_PROGRAM_ID,\n TokenInstruction,\n} from \"@solana/spl-token\";\nimport {\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n };\n}\n\nexport class TransactionInspector {\n constructor(private readonly rawTransactionBytes: Uint8Array) {}\n\n public inspectTransactionType(): TxInspectorResult {\n try {\n const message = this.extractMessage(this.rawTransactionBytes);\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.staticAccountKeys[ixMeta.programIdIndex]!;\n if (!programId.equals(TOKEN_PROGRAM_ID)) continue;\n\n const instruction = new TransactionInstruction({\n programId,\n keys: ixMeta.accountKeyIndexes.map((i) => ({\n pubkey: message.staticAccountKeys[i]!,\n isSigner: message.isAccountSigner(i),\n isWritable: message.isAccountWritable(i),\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const instructionType = instruction.data[0];\n switch (instructionType) {\n case TokenInstruction.Transfer: {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: destination.pubkey.toBase58() },\n };\n }\n case TokenInstruction.TransferChecked: {\n const {\n keys: { destination },\n } = decodeTransferCheckedInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: destination.pubkey.toBase58() },\n };\n }\n case TokenInstruction.InitializeAccount: {\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n },\n };\n }\n default:\n continue;\n }\n }\n\n return {\n transactionType: SolanaTransactionTypes.STANDARD,\n data: {},\n };\n } catch {\n return {\n transactionType: SolanaTransactionTypes.STANDARD,\n data: {},\n };\n }\n }\n\n private extractMessage(rawBytes: Uint8Array): VersionedMessage {\n const errors: string[] = [];\n try {\n return VersionedTransaction.deserialize(rawBytes).message;\n } catch (e) {\n errors.push((e as Error).message);\n }\n\n try {\n return VersionedMessage.deserialize(rawBytes);\n } catch (e) {\n errors.push((e as Error).message);\n }\n\n try {\n const tx = Transaction.from(rawBytes);\n const allKeys = [\n tx.feePayer,\n ...tx.instructions.flatMap((ix) => ix.keys.map((k) => k.pubkey)),\n ];\n\n const staticAccountKeys = Array.from(\n new Map(\n (allKeys.filter(Boolean) as PublicKey[]).map((pk) => [\n pk.toBase58(),\n pk,\n ]),\n ).values(),\n );\n\n interface CustomCompiledInstruction {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n }\n\n return {\n compiledInstructions: tx.instructions.map(\n (ix): CustomCompiledInstruction => ({\n programIdIndex: staticAccountKeys.findIndex((k) =>\n k.equals(ix.programId),\n ),\n accountKeyIndexes: ix.keys.map((k) =>\n staticAccountKeys.findIndex((s) => s.equals(k.pubkey)),\n ),\n data: ix.data,\n }),\n ),\n staticAccountKeys,\n isAccountSigner: (i: number) =>\n tx.signatures.some((sig) =>\n sig.publicKey.equals(staticAccountKeys[i]!),\n ),\n isAccountWritable: () => true,\n } as unknown as VersionedMessage;\n } catch (e) {\n errors.push((e as Error).message);\n }\n\n throw new Error(\n \"Invalid transaction payload \u2013 all deserializers failed:\\n\" +\n errors.map((m, i) => `${i + 1}) ${m}`).join(\"\\n\"),\n );\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["TransactionInspector_exports", "__export", "SolanaTransactionTypes", "TransactionInspector", "__toCommonJS", "import_spl_token", "import_web3", "import_buffer", "rawTransactionBytes", "message", "ixMeta", "programId", "instruction", "i", "destination", "account", "mint", "rawBytes", "errors", "e", "tx", "allKeys", "ix", "k", "staticAccountKeys", "pk", "s", "sig", "m"]
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n createATA?: { address: string; mintAddress: string };\n };\n}\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nconst RPC_URL = \"https://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = (RPCURL: string) =>\n new Connection(RPCURL, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n constructor(\n private readonly rawTransactionBytes: Uint8Array,\n private readonly tokenAddress?: string | undefined,\n private readonly createATA?:\n | {\n address: string;\n mintAddress: string;\n }\n | undefined,\n private readonly injectedRPCURL?: string | undefined,\n ) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = await this.normaliseMessage(this.rawTransactionBytes);\n\n // fast path when transaction resolution is provided\n if (this.tokenAddress || this.createATA) {\n const looksSPL = message.compiledInstructions.some((ix) =>\n isSPLProgramId(message.allKeys[ix.programIdIndex]),\n );\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data: {\n ...(this.tokenAddress ? { tokenAddress: this.tokenAddress } : {}),\n ...(this.createATA ? { createATA: this.createATA } : {}),\n },\n };\n }\n\n // accumulate best data across all instructions\n let sawSPL = false;\n let best: TxInspectorResult[\"data\"] = {};\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue; // unresolved index, skip\n if (isSPLProgramId(programId)) sawSPL = true;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((pk) => ({\n pubkey: pk,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (!data) continue;\n\n // prefer createATA (needed when destination ATA doesn\u2019t exist yet)\n if (data.createATA && !best.createATA) {\n best = { ...best, createATA: data.createATA };\n } else if (\n data.tokenAddress &&\n !best.tokenAddress &&\n !best.createATA\n ) {\n best = { ...best, tokenAddress: data.tokenAddress };\n }\n }\n }\n\n if (best.createATA)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (best.tokenAddress)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (sawSPL)\n return { transactionType: SolanaTransactionTypes.SPL, data: {} }; // we should nbever reach here, in case we do tx will fall back to blind sign\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * Normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * For v0, auto-fetch looked-up addresses from ALT(s) via the connection.\n */\n private async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = await this.resolveLookedUpAddressesFromMessage(msg);\n\n const allKeys: PublicKey[] = [\n ...msg.staticAccountKeys,\n ...(lookedUp?.writable ?? []),\n ...(lookedUp?.readonly ?? []),\n ];\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => {\n const ixWithAccounts = ix as typeof ix & { accounts?: number[] };\n\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? ix.accountKeyIndexes ?? [],\n ) as number[];\n\n let data: Uint8Array;\n if (ix.data instanceof Uint8Array) {\n data = ix.data;\n } else if (typeof ix.data === \"string\") {\n data = Buffer.from(ix.data, \"base64\"); // v0 encodes instruction data as base64\n } else {\n data = Uint8Array.from(ix.data ?? []);\n }\n\n return {\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // legacy (no ALTs)\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const key of ix.keys) add(key.pubkey);\n }\n\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (key) => indexByB58.get(key.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n\n /**\n * For v0, fetch looked-up addresses from ALT(s) via the connection\n */\n private async resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n ): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n for (const lu of lookups) {\n const res = await defaultConnection(\n this.injectedRPCURL || RPC_URL,\n ).getAddressLookupTable(lu.accountKey);\n const table = res.value;\n if (!table) continue;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }\n\n return { writable, readonly };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TransactionInspector_exports", "__export", "SolanaTransactionTypes", "TransactionInspector", "__toCommonJS", "import_spl_token", "import_web3", "import_buffer", "import_transactionDecoders", "RPC_URL", "defaultConnection", "RPCURL", "isSPLProgramId", "pid", "rawTransactionBytes", "tokenAddress", "createATA", "injectedRPCURL", "message", "ix", "sawSPL", "best", "ixMeta", "programId", "resolvedKeys", "i", "k", "instruction", "pk", "ctx", "decoder", "data", "rawBytes", "versionedTX", "msg", "lookedUp", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "key", "indexByB58", "lookups", "writable", "readonly", "lu", "table", "addrs"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var T=Object.create;var d=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var f=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var m=(e,t,r,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of A(t))!g.call(e,n)&&n!==r&&d(e,n,{get:()=>t[n],enumerable:!(c=b(t,n))||c.enumerable});return e};var K=(e,t,r)=>(r=e!=null?T(f(e)):{},m(t||!e||!e.__esModule?d(r,"default",{value:e,enumerable:!0}):r,e));var p=require("@solana/spl-token"),a=require("@solana/web3.js"),u=K(require("bs58")),s=require("vitest"),o=require("./TransactionInspector");const l=u.default.encode(new Uint8Array(32).fill(1));(0,s.describe)("TransactionInspector",()=>{(0,s.it)("falls back to STANDARD for a plain SystemProgram transfer",()=>{const e=a.Keypair.generate(),t=a.Keypair.generate().publicKey,r=new a.Transaction().add(a.SystemProgram.transfer({fromPubkey:e.publicKey,toPubkey:t,lamports:1e3}));r.recentBlockhash=l,r.feePayer=e.publicKey,r.sign(e);const c=r.serialize(),n=new o.TransactionInspector(c).inspectTransactionType();(0,s.expect)(n.transactionType).toBe(o.SolanaTransactionTypes.STANDARD),(0,s.expect)(n.data).toEqual({})}),(0,s.it)("detects an SPL Transfer and returns the destination address",()=>{const e=a.Keypair.generate(),t=a.Keypair.generate().publicKey,r=a.Keypair.generate().publicKey,c=e.publicKey,n=new a.Transaction().add((0,p.createTransferInstruction)(t,r,c,42n,[],p.TOKEN_PROGRAM_ID));n.recentBlockhash=l,n.feePayer=e.publicKey,n.sign(e);const i=new o.TransactionInspector(n.serialize()).inspectTransactionType();(0,s.expect)(i.transactionType).toBe(o.SolanaTransactionTypes.SPL),(0,s.expect)(i.data.tokenAddress).toBe(r.toBase58())}),(0,s.it)("detects an SPL TransferChecked and returns the destination address",()=>{const e=a.Keypair.generate(),t=a.Keypair.generate().publicKey,r=a.Keypair.generate().publicKey,c=a.Keypair.generate().publicKey,n=e.publicKey,i=new a.Transaction().add((0,p.createTransferCheckedInstruction)(r,t,c,n,123n,0,[],p.TOKEN_PROGRAM_ID));i.recentBlockhash=l,i.feePayer=e.publicKey,i.sign(e);const y=new o.TransactionInspector(i.serialize()).inspectTransactionType();(0,s.expect)(y.transactionType).toBe(o.SolanaTransactionTypes.SPL),(0,s.expect)(y.data.tokenAddress).toBe(c.toBase58())}),(0,s.it)("detects an SPL InitializeAccount and returns the new ATA and mint",()=>{const e=a.Keypair.generate(),t=a.Keypair.generate().publicKey,r=a.Keypair.generate().publicKey,c=e.publicKey,n=new a.Transaction().add((0,p.createInitializeAccountInstruction)(r,t,c,p.TOKEN_PROGRAM_ID));n.recentBlockhash=l,n.feePayer=e.publicKey,n.sign(e);const i=new o.TransactionInspector(n.serialize()).inspectTransactionType();(0,s.expect)(i.transactionType).toBe(o.SolanaTransactionTypes.SPL),(0,s.expect)(i.data.createATA).toEqual({address:r.toBase58(),mintAddress:t.toBase58()})}),(0,s.it)("falls back to STANDARD if the payload is unparseable",()=>{const e=new Uint8Array([0,1,2,3,4,5]),t=new o.TransactionInspector(e).inspectTransactionType();(0,s.expect)(t.transactionType).toBe(o.SolanaTransactionTypes.STANDARD),(0,s.expect)(t.data).toEqual({})})});
1
+ "use strict";var w=Object.create;var T=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var m=(e,n,c,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of b(n))!B.call(e,r)&&r!==c&&T(e,r,{get:()=>n[r],enumerable:!(o=g(n,r))||o.enumerable});return e};var S=(e,n,c)=>(c=e!=null?w(K(e)):{},m(n||!e||!e.__esModule?T(c,"default",{value:e,enumerable:!0}):c,e));var s=require("@solana/spl-token"),t=require("@solana/web3.js"),A=S(require("bs58")),a=require("vitest"),i=require("./TransactionInspector");const P=A.default.encode(new Uint8Array(32).fill(170));function p(e,n,c){const o=c??n[0]??t.Keypair.generate(),r=new t.Transaction;r.recentBlockhash=P,r.feePayer=o.publicKey,r.add(...e);const u=new Set,d=[o,...n].filter(y=>{const l=y.publicKey.toBase58();return u.has(l)?!1:(u.add(l),!0)});return r.sign(...d),{raw:r.serialize(),payer:o}}(0,a.describe)("TransactionInspector",()=>{(0,a.it)("falls back to STANDARD for a plain SystemProgram transfer",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.SystemProgram.transfer({fromPubkey:e.publicKey,toPubkey:n,lamports:1e3}),{raw:o}=p([c],[e],e),r=await new i.TransactionInspector(o).inspectTransactionType();(0,a.expect)(r.transactionType).toBe(i.SolanaTransactionTypes.STANDARD),(0,a.expect)(r.data).toEqual({})}),(0,a.it)("detects an SPL Transfer and returns the destination address",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=(0,s.createTransferInstruction)(n,c,e.publicKey,42n,[],s.TOKEN_PROGRAM_ID),{raw:r}=p([o],[e],e),u=await new i.TransactionInspector(r).inspectTransactionType();(0,a.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(u.data.tokenAddress).toBe(c.toBase58())}),(0,a.it)("detects an SPL TransferChecked and returns the destination address",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=t.Keypair.generate().publicKey,r=(0,s.createTransferCheckedInstruction)(c,n,o,e.publicKey,123n,0,[],s.TOKEN_PROGRAM_ID),{raw:u}=p([r],[e],e),d=await new i.TransactionInspector(u).inspectTransactionType();(0,a.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(d.data.tokenAddress).toBe(o.toBase58())}),(0,a.it)("detects InitializeAccount and returns the new account and mint",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=t.Keypair.generate().publicKey,r=(0,s.createInitializeAccountInstruction)(c,n,o,s.TOKEN_PROGRAM_ID),{raw:u}=p([r],[e],e),d=await new i.TransactionInspector(u).inspectTransactionType();(0,a.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(d.data.createATA).toEqual({address:c.toBase58(),mintAddress:n.toBase58()})}),(0,a.it)("detects InitializeAccount2 and returns the new account and mint",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=t.Keypair.generate().publicKey,r=(0,s.createInitializeAccount2Instruction)(c,n,o,s.TOKEN_PROGRAM_ID),{raw:u}=p([r],[e],e),d=await new i.TransactionInspector(u).inspectTransactionType();(0,a.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(d.data.createATA).toEqual({address:c.toBase58(),mintAddress:n.toBase58()})}),(0,a.it)("detects InitializeAccount3 and returns the new account and mint",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=(0,s.createInitializeAccount3Instruction)(c,n,s.TOKEN_PROGRAM_ID),{raw:r}=p([o],[e],e),u=await new i.TransactionInspector(r).inspectTransactionType();(0,a.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(u.data.createATA).toEqual({address:c.toBase58(),mintAddress:n.toBase58()})}),(0,a.it)("detects ATA creation via Associated Token Program (classic TOKEN program)",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=(0,s.getAssociatedTokenAddressSync)(c,n,!0,s.TOKEN_PROGRAM_ID,s.ASSOCIATED_TOKEN_PROGRAM_ID),r=(0,s.createAssociatedTokenAccountInstruction)(e.publicKey,o,n,c,s.TOKEN_PROGRAM_ID,s.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([r],[e],e),d=await new i.TransactionInspector(u).inspectTransactionType();(0,a.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(d.data.createATA).toEqual({address:n.toBase58(),mintAddress:c.toBase58()})}),(0,a.it)("detects ATA creation via Associated Token Program (TOKEN-2022 program)",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=(0,s.getAssociatedTokenAddressSync)(c,n,!0,s.TOKEN_2022_PROGRAM_ID,s.ASSOCIATED_TOKEN_PROGRAM_ID),r=(0,s.createAssociatedTokenAccountInstruction)(e.publicKey,o,n,c,s.TOKEN_2022_PROGRAM_ID,s.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([r],[e],e),d=await new i.TransactionInspector(u).inspectTransactionType();(0,a.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(d.data.createATA).toEqual({address:n.toBase58(),mintAddress:c.toBase58()})}),(0,a.it)("detects CloseAccount and returns the closed token account",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=(0,s.createCloseAccountInstruction)(n,c,e.publicKey),{raw:r}=p([o],[e],e),u=await new i.TransactionInspector(r).inspectTransactionType();(0,a.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(u.data.tokenAddress).toBe(n.toBase58())}),(0,a.it)("detects SyncNative and returns the WSOL account",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=(0,s.createSyncNativeInstruction)(n,s.TOKEN_PROGRAM_ID),{raw:o}=p([c],[e],e),r=await new i.TransactionInspector(o).inspectTransactionType();(0,a.expect)(r.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(r.data.tokenAddress).toBe(n.toBase58())}),(0,a.it)("marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)",async()=>{const e=t.Keypair.generate(),n=new t.TransactionInstruction({programId:s.TOKEN_PROGRAM_ID,keys:[],data:Buffer.from([])}),{raw:c}=p([n],[e],e),o=await new i.TransactionInspector(c).inspectTransactionType();(0,a.expect)(o.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(o.data).toEqual({})}),(0,a.it)("falls back to STANDARD if the payload is unparseable",async()=>{const e=new Uint8Array([171,173,190,239]),n=await new i.TransactionInspector(e).inspectTransactionType();(0,a.expect)(n.transactionType).toBe(i.SolanaTransactionTypes.STANDARD),(0,a.expect)(n.data).toEqual({})}),(0,a.it)("fast path: tokenAddress override + SPL instruction, SPL and returns override",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=(0,s.createTransferInstruction)(n,c,e.publicKey,1n,[],s.TOKEN_PROGRAM_ID),{raw:r}=p([o],[e],e),u=t.Keypair.generate().publicKey.toBase58(),d=await new i.TransactionInspector(r,u).inspectTransactionType();(0,a.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(d.data.tokenAddress).toBe(u)}),(0,a.it)("fast path: createATA override + ATA instruction, SPL and returns override",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=(0,s.getAssociatedTokenAddressSync)(c,n,!0,s.TOKEN_PROGRAM_ID,s.ASSOCIATED_TOKEN_PROGRAM_ID),r=(0,s.createAssociatedTokenAccountInstruction)(e.publicKey,o,n,c,s.TOKEN_PROGRAM_ID,s.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([r],[e],e),d={address:t.Keypair.generate().publicKey.toBase58(),mintAddress:t.Keypair.generate().publicKey.toBase58()},y=await new i.TransactionInspector(u,void 0,d).inspectTransactionType();(0,a.expect)(y.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(y.data.createATA).toEqual(d)}),(0,a.it)("fast path: both overrides + SPL instruction, SPL and returns both",async()=>{const e=t.Keypair.generate(),n=t.Keypair.generate().publicKey,c=t.Keypair.generate().publicKey,o=(0,s.createTransferInstruction)(n,c,e.publicKey,7n,[],s.TOKEN_PROGRAM_ID),{raw:r}=p([o],[e],e),u=t.Keypair.generate().publicKey.toBase58(),d={address:t.Keypair.generate().publicKey.toBase58(),mintAddress:t.Keypair.generate().publicKey.toBase58()},y=await new i.TransactionInspector(r,u,d).inspectTransactionType();(0,a.expect)(y.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,a.expect)(y.data.tokenAddress).toBe(u),(0,a.expect)(y.data.createATA).toEqual(d)})});
2
2
  //# sourceMappingURL=TransactionInspector.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.test.ts"],
4
- "sourcesContent": ["import {\n createInitializeAccountInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { Keypair, SystemProgram, Transaction } from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(1));\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", () => {\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const tx = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n }),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const raw = tx.serialize();\n const result = new TransactionInspector(raw).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", () => {\n const payer = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createTransferInstruction(\n source,\n destination,\n owner,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL InitializeAccount and returns the new ATA and mint\", () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", () => {\n const garbage = new Uint8Array([0, 1, 2, 3, 4, 5]);\n const result = new TransactionInspector(garbage).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_spl_token", "import_web3", "import_bs58", "import_vitest", "import_TransactionInspector", "DUMMY_BLOCKHASH", "bs58", "payer", "dest", "tx", "raw", "result", "source", "destination", "owner", "mint", "newAccount", "garbage"]
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n createInitializeAccount2Instruction,\n createInitializeAccount3Instruction,\n createInitializeAccountInstruction,\n createSyncNativeInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(0xaa));\n\nfunction makeSignedRawTx(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniqueSigners = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniqueSigners);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", async () => {\n // given\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const ix = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n });\n\n const { raw } = makeSignedRawTx([ix], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const ix = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([ix], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", async () => {\n // given\n const owner = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const ix = createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner.publicKey,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([ix], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects InitializeAccount and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const ix = createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([ix], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount2 and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const ix = createInitializeAccount2Instruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([ix], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount3 and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n\n const ix = createInitializeAccount3Instruction(\n newAccount,\n mint,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([ix], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (classic TOKEN program)\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const ix = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([ix], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (TOKEN-2022 program)\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata22 = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const ix = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata22,\n owner,\n mint,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([ix], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects CloseAccount and returns the closed token account\", async () => {\n // given\n const owner = Keypair.generate();\n const account = Keypair.generate().publicKey;\n const dest = Keypair.generate().publicKey;\n\n const ix = createCloseAccountInstruction(account, dest, owner.publicKey);\n\n const { raw } = makeSignedRawTx([ix], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"detects SyncNative and returns the WSOL account\", async () => {\n // given\n const payer = Keypair.generate();\n const account = Keypair.generate().publicKey;\n\n const ix = createSyncNativeInstruction(account, TOKEN_PROGRAM_ID);\n\n const { raw } = makeSignedRawTx([ix], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)\", async () => {\n // given\n const payer = Keypair.generate();\n const bogusIx = new TransactionInstruction({\n programId: TOKEN_PROGRAM_ID,\n keys: [],\n data: Buffer.from([]),\n });\n\n const { raw } = makeSignedRawTx([bogusIx], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data).toEqual({});\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", async () => {\n // given\n const garbage = new Uint8Array([0xab, 0xad, 0xbe, 0xef]);\n\n // when\n const result = await new TransactionInspector(\n garbage,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"fast path: tokenAddress override + SPL instruction, SPL and returns override\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const ix = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 1n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([ix], [owner], owner);\n\n const overrideToken = Keypair.generate().publicKey.toBase58();\n\n // when\n const result = await new TransactionInspector(\n raw,\n overrideToken,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(overrideToken);\n });\n\n it(\"fast path: createATA override + ATA instruction, SPL and returns override\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const ix = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([ix], [payer], payer);\n\n const overrideATA = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n // when\n const result = await new TransactionInspector(\n raw,\n undefined,\n overrideATA,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual(overrideATA);\n });\n\n it(\"fast path: both overrides + SPL instruction, SPL and returns both\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const ix = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 7n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([ix], [owner], owner);\n\n const tokenOverride = Keypair.generate().publicKey.toBase58();\n const ataOverride = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n // when\n const result = await new TransactionInspector(\n raw,\n tokenOverride,\n ataOverride,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(tokenOverride);\n expect(result.data.createATA).toEqual(ataOverride);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_spl_token", "import_web3", "import_bs58", "import_vitest", "import_TransactionInspector", "DUMMY_BLOCKHASH", "bs58", "makeSignedRawTx", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniqueSigners", "kp", "k", "dest", "ix", "raw", "result", "owner", "source", "destination", "mint", "newAccount", "ata", "ata22", "account", "bogusIx", "garbage", "overrideToken", "overrideATA", "tokenOverride", "ataOverride"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var k=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var T=(e,n)=>{for(var s in n)k(e,s,{get:n[s],enumerable:!0})},x=(e,n,s,d)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of B(n))!h.call(e,a)&&a!==s&&k(e,a,{get:()=>n[a],enumerable:!(d=b(n,a))||d.enumerable});return e};var w=e=>x(k({},"__esModule",{value:!0}),e);var q={};T(q,{DECODERS:()=>f});module.exports=w(q);var t=require("@solana/spl-token"),i=require("@solana/web3.js");const c=e=>e.equals(t.TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_2022_PROGRAM_ID),r=e=>{try{return e()}catch{return null}},f=[{when:({programId:e})=>e.equals(t.ASSOCIATED_TOKEN_PROGRAM_ID),decode:({ixMeta:e,message:n})=>{const s=e.accountKeyIndexes??[],d=o=>s[o]!==void 0?n.allKeys[s[o]]??null:null,a=d(1),u=d(3);if(!a||!u)return null;const l=s.map(o=>n.allKeys[o]).filter(o=>!!o),A=l.find(o=>o.equals(t.TOKEN_2022_PROGRAM_ID))??l.find(o=>o.equals(t.TOKEN_PROGRAM_ID))??null,p=o=>o.equals(i.SystemProgram.programId)||o.equals(t.TOKEN_PROGRAM_ID)||o.equals(t.TOKEN_2022_PROGRAM_ID)||o.equals(t.ASSOCIATED_TOKEN_PROGRAM_ID)||o.equals(i.SYSVAR_RENT_PUBKEY),I=l.filter(o=>!p(o)&&!o.equals(a)&&!o.equals(u)),y=(o,m)=>(0,t.getAssociatedTokenAddressSync)(u,o,!0,m,t.ASSOCIATED_TOKEN_PROGRAM_ID);if(A){for(const o of I)if(y(o,A).equals(a))return{createATA:{address:o.toBase58(),mintAddress:u.toBase58()}}}for(const o of I){if(y(o,t.TOKEN_PROGRAM_ID).equals(a))return{createATA:{address:o.toBase58(),mintAddress:u.toBase58()}};if(y(o,t.TOKEN_2022_PROGRAM_ID).equals(a))return{createATA:{address:o.toBase58(),mintAddress:u.toBase58()}}}return null}},{when:({programId:e})=>e.equals(t.TOKEN_2022_PROGRAM_ID),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{destination:s}}=(0,t.decodeTransferCheckedWithFeeInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{destination:s}}=(0,t.decodeTransferInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{destination:s}}=(0,t.decodeTransferCheckedInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:d}}=(0,t.decodeInitializeAccountInstruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:d}}=(0,t.decodeInitializeAccount2Instruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:d}}=(0,t.decodeInitializeAccount3Instruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeInitializeImmutableOwnerInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeCloseAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeSyncNativeInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeBurnCheckedInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeBurnInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeFreezeAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeThawAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>e.equals(t.ASSOCIATED_TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_2022_PROGRAM_ID),decode:()=>null}];0&&(module.exports={DECODERS});
2
+ //# sourceMappingURL=transactionDecoders.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/services/utils/transactionDecoders.ts"],
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeBurnCheckedInstruction,\n decodeBurnInstruction,\n decodeCloseAccountInstruction,\n decodeFreezeAccountInstruction,\n decodeInitializeAccount2Instruction,\n decodeInitializeAccount3Instruction,\n decodeInitializeAccountInstruction,\n decodeInitializeImmutableOwnerInstruction,\n decodeSyncNativeInstruction,\n decodeThawAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferCheckedWithFeeInstruction,\n decodeTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n type PublicKey,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n type TransactionInstruction,\n} from \"@solana/web3.js\";\n\nimport {\n type NormalizedCompiledIx,\n type NormalizedMessage,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/TransactionInspector\";\n\nexport type IxContext = {\n programId: PublicKey;\n ixMeta: NormalizedCompiledIx;\n message: NormalizedMessage;\n instruction: TransactionInstruction;\n};\n\nexport type Decoder = {\n when: (ctx: IxContext) => boolean;\n decode: (ctx: IxContext) => TxInspectorResult[\"data\"] | null;\n};\n\nconst isTokenProgramId = (pid: PublicKey) =>\n pid.equals(TOKEN_PROGRAM_ID) || pid.equals(TOKEN_2022_PROGRAM_ID);\n\nconst safe = <T>(fn: () => T): T | null => {\n try {\n return fn();\n } catch {\n return null;\n }\n};\n\nexport type CreateAtaExplanation = {\n ataFromIx: string;\n ownerFound?: string;\n mint: string;\n tokenProgramUsed: \"token\" | \"token2022\";\n derivedClassic?: string;\n derived2022?: string;\n matches: \"classic\" | \"token2022\" | \"neither\";\n};\n\nexport const DECODERS: Decoder[] = [\n // ATA creation (with derivation fallback)\n {\n when: ({ programId }) => programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID),\n decode: ({ ixMeta, message }) => {\n const idxs = ixMeta.accountKeyIndexes ?? [];\n const byIdx = (n: number) =>\n idxs[n] !== undefined ? (message.allKeys[idxs[n]] ?? null) : null;\n\n // canonical ATA ix layout: [payer, ata, owner, mint, system, tokenProgram, rent?]\n const ataPk = byIdx(1);\n const mintPk = byIdx(3);\n if (!ataPk || !mintPk) return null;\n\n const accs = idxs\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n // prefer token-2022 if present among ix accounts, else token classic\n const tokenProgInIx =\n accs.find((pk) => pk.equals(TOKEN_2022_PROGRAM_ID)) ??\n accs.find((pk) => pk.equals(TOKEN_PROGRAM_ID)) ??\n null;\n\n const isProgramOrSysvar = (pk: PublicKey) =>\n pk.equals(SystemProgram.programId) ||\n pk.equals(TOKEN_PROGRAM_ID) ||\n pk.equals(TOKEN_2022_PROGRAM_ID) ||\n pk.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pk.equals(SYSVAR_RENT_PUBKEY);\n\n // candidate owners: exclude programs/sysvars, the ATA itself, and the mint\n const ownerCandidates = accs.filter(\n (pk) =>\n !isProgramOrSysvar(pk) && !pk.equals(ataPk) && !pk.equals(mintPk),\n );\n\n const derive = (owner: PublicKey, tokenProg: PublicKey) =>\n getAssociatedTokenAddressSync(\n mintPk,\n owner,\n true, // allowOwnerOffCurve\n tokenProg,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n // try with the token program actually referenced in the ix (if any)\n if (tokenProgInIx) {\n for (const owner of ownerCandidates) {\n if (derive(owner, tokenProgInIx).equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n }\n }\n\n // fallback: try both classic and 2022 (covers odd wrappers/missing program acct)\n for (const owner of ownerCandidates) {\n const dClassic = derive(owner, TOKEN_PROGRAM_ID);\n if (dClassic.equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n const d22 = derive(owner, TOKEN_2022_PROGRAM_ID);\n if (d22.equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n }\n return null;\n },\n },\n\n // Token-2022 fee\u2019d transfer\n {\n when: ({ programId }) => programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferCheckedWithFeeInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n };\n }),\n },\n\n // Transfers\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction, programId);\n return { tokenAddress: destination.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferCheckedInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n };\n }),\n },\n\n // Account init\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount2Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount3Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeInitializeImmutableOwnerInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Lifecycle / WSOL\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeCloseAccountInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeSyncNativeInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Mint / Burn\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeBurnCheckedInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeBurnInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n\n // Freeze / Thaw\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeFreezeAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeThawAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n\n // LAST-RESORT: tag as SPL by program id only (when decoders can't run)\n {\n when: ({ programId }) =>\n programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: () => null,\n },\n];\n"],
5
+ "mappings": "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",
6
+ "names": ["transactionDecoders_exports", "__export", "DECODERS", "__toCommonJS", "import_spl_token", "import_web3", "isTokenProgramId", "pid", "safe", "fn", "programId", "ixMeta", "message", "idxs", "byIdx", "n", "ataPk", "mintPk", "accs", "i", "k", "tokenProgInIx", "pk", "isProgramOrSysvar", "ownerCandidates", "derive", "owner", "tokenProg", "instruction", "destination", "account", "mint"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var g=(n,t)=>{for(var o in t)i(n,o,{get:t[o],enumerable:!0})},C=(n,t,o,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of p(t))!u.call(n,e)&&e!==o&&i(n,e,{get:()=>t[e],enumerable:!(a=d(t,e))||a.enumerable});return n};var m=n=>C(i({},"__esModule",{value:!0}),n);var A={};g(A,{BuildTransactionContextTask:()=>f});module.exports=m(A);var c=require("@ledgerhq/device-management-kit"),l=require("../../app-binder/command/GetChallengeCommand");class f{constructor(t,o){this.api=t;this.args=o}async run(){const{contextModule:t,options:o}=this.args,a=this.api.getDeviceSessionState();let e;const s=await this.api.sendCommand(new l.GetChallengeCommand);return(0,c.isSuccessCommandResult)(s)&&(e=s.data.challenge),(await t.getSolanaContext({deviceModelId:a.deviceModelId,tokenAddress:o.tokenAddress,challenge:e,createATA:o.createATA})).caseOf({Left:r=>{throw r},Right:r=>({challenge:e,descriptor:r.descriptor,addressResult:{tokenAccount:r.tokenAccount,owner:r.owner,contract:r.contract},calCertificate:r.certificate})})}}0&&(module.exports={BuildTransactionContextTask});
1
+ "use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var C=(n,t)=>{for(var o in t)i(n,o,{get:t[o],enumerable:!0})},g=(n,t,o,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of u(t))!p.call(n,e)&&e!==o&&i(n,e,{get:()=>t[e],enumerable:!(a=d(t,e))||a.enumerable});return n};var m=n=>g(i({},"__esModule",{value:!0}),n);var A={};C(A,{BuildTransactionContextTask:()=>f});module.exports=m(A);var c=require("@ledgerhq/device-management-kit"),l=require("../../app-binder/command/GetChallengeCommand");class f{constructor(t,o){this.api=t;this.args=o}async run(){const{contextModule:t,options:o}=this.args,a=this.api.getDeviceSessionState();let e;const s=await this.api.sendCommand(new l.GetChallengeCommand);return(0,c.isSuccessCommandResult)(s)&&(e=s.data.challenge),(await t.getSolanaContext({deviceModelId:a.deviceModelId,tokenAddress:o.tokenAddress,challenge:e,createATA:o.createATA})).caseOf({Left:r=>{throw r},Right:r=>({challenge:e,descriptor:r.descriptor,addressResult:{tokenAccount:r.tokenAccount,owner:r.owner,contract:r.contract},calCertificate:r.certificate})})}}0&&(module.exports={BuildTransactionContextTask});
2
2
  //# sourceMappingURL=BuildTransactionContextTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.ts"],
4
- "sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionOptions } from \"@api/model/TransactionOptions\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n challenge: string | undefined;\n addressResult: {\n tokenAccount: string;\n owner: string;\n contract: string;\n };\n calCertificate: PkiCertificate;\n descriptor: Uint8Array;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionOptions;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {}\n\n async run(): Promise<SolanaBuildContextResult> {\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // get Solana context\n const contextResult = await contextModule.getSolanaContext({\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n challenge,\n descriptor: ctx.descriptor,\n addressResult: {\n tokenAccount: ctx.tokenAccount,\n owner: ctx.owner,\n contract: ctx.contract,\n },\n calCertificate: ctx.certificate,\n };\n },\n });\n }\n}\n"],
4
+ "sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n challenge: string | undefined;\n addressResult: {\n tokenAccount: string;\n owner: string;\n contract: string;\n };\n calCertificate: PkiCertificate;\n descriptor: Uint8Array;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionResolutionContext;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {}\n\n async run(): Promise<SolanaBuildContextResult> {\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // get Solana context\n const contextResult = await contextModule.getSolanaContext({\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n challenge,\n descriptor: ctx.descriptor,\n addressResult: {\n tokenAccount: ctx.tokenAccount,\n owner: ctx.owner,\n contract: ctx.contract,\n },\n calCertificate: ctx.certificate,\n };\n },\n });\n }\n}\n"],
5
5
  "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAGO,2CAGPC,EAAoC,4DAkB7B,MAAMH,CAA4B,CACvC,YACmBI,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAyC,CAC7C,KAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAI,KAAK,KAClCC,EAAc,KAAK,IAAI,sBAAsB,EAGnD,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAI,qBAAqB,EACzE,SAAI,0BAAuBA,CAAY,IACrCD,EAAYC,EAAa,KAAK,YAIV,MAAMJ,EAAc,iBAAiB,CACzD,cAAeE,EAAY,cAC3B,aAAcD,EAAQ,aACtB,UAAAE,EACA,UAAWF,EAAQ,SACrB,CAAC,GAEoB,OAAO,CAC1B,KAAOI,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,IACC,CACL,UAAAH,EACA,WAAYG,EAAI,WAChB,cAAe,CACb,aAAcA,EAAI,aAClB,MAAOA,EAAI,MACX,SAAUA,EAAI,QAChB,EACA,eAAgBA,EAAI,WACtB,EAEJ,CAAC,CACH,CACF",
6
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 t=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var u=(r,p)=>{for(var i in p)t(r,i,{get:p[i],enumerable:!0})},T=(r,p,i,e)=>{if(p&&typeof p=="object"||typeof p=="function")for(let n of l(p))!B.call(r,n)&&n!==i&&t(r,n,{get:()=>p[n],enumerable:!(e=A(p,n))||e.enumerable});return r};var k=r=>T(t({},"__esModule",{value:!0}),r),s=(r,p,i,e)=>{for(var n=e>1?void 0:e?A(p,i):p,m=r.length-1,c;m>=0;m--)(c=r[m])&&(n=(e?c(p,i,n):c(n))||n);return e&&n&&t(p,i,n),n},d=(r,p)=>(i,e)=>p(i,e,r);var y={};u(y,{SignTransactionUseCase:()=>o});module.exports=k(y);var a=require("inversify"),f=require("../../app-binder/di/appBinderTypes");let o=class{constructor(p){this.appBinder=p}execute(p,i,e){return this.appBinder.signTransaction({derivationPath:p,transaction:i,skipOpenApp:e?.skipOpenApp??!1})}};o=s([(0,a.injectable)(),d(0,(0,a.inject)(f.appBinderTypes.AppBinder))],o);0&&(module.exports={SignTransactionUseCase});
1
+ "use strict";var a=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var u=(n,r)=>{for(var p in r)a(n,p,{get:r[p],enumerable:!0})},A=(n,r,p,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of l(r))!B.call(n,o)&&o!==p&&a(n,o,{get:()=>r[o],enumerable:!(t=s(r,o))||t.enumerable});return n};var y=n=>A(a({},"__esModule",{value:!0}),n),T=(n,r,p,t)=>{for(var o=t>1?void 0:t?s(r,p):r,m=n.length-1,c;m>=0;m--)(c=n[m])&&(o=(t?c(r,p,o):c(o))||o);return t&&o&&a(r,p,o),o},d=(n,r)=>(p,t)=>r(p,t,n);var S={};u(S,{SignTransactionUseCase:()=>i});module.exports=y(S);var e=require("inversify"),f=require("../../app-binder/di/appBinderTypes");let i=class{constructor(r){this.appBinder=r}execute(r,p,t){return this.appBinder.signTransaction({derivationPath:r,transaction:p,solanaTransactionOptions:t})}};i=T([(0,e.injectable)(),d(0,(0,e.inject)(f.appBinderTypes.AppBinder))],i);0&&(module.exports={SignTransactionUseCase});
2
2
  //# sourceMappingURL=SignTransactionUseCase.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/use-cases/transaction/SignTransactionUseCase.ts"],
4
- "sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { Transaction } from \"@api/model/Transaction\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { SolanaAppBinder } from \"@internal/app-binder/SolanaAppBinder\";\n\n@injectable()\nexport class SignTransactionUseCase {\n constructor(\n @inject(appBinderTypes.AppBinder) private appBinder: SolanaAppBinder,\n ) {}\n\n execute(\n derivationPath: string,\n transaction: Transaction,\n options?: {\n skipOpenApp?: boolean;\n },\n ): SignTransactionDAReturnType {\n return this.appBinder.signTransaction({\n derivationPath,\n transaction,\n skipOpenApp: options?.skipOpenApp ?? false,\n });\n }\n}\n"],
5
- "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBAInCC,EAA+B,kDAIxB,IAAMC,EAAN,KAA6B,CAClC,YAC4CC,EAC1C,CAD0C,eAAAA,CACzC,CAEH,QACEC,EACAC,EACAC,EAG6B,CAC7B,OAAO,KAAK,UAAU,gBAAgB,CACpC,eAAAF,EACA,YAAAC,EACA,YAAaC,GAAS,aAAe,EACvC,CAAC,CACH,CACF,EAlBaJ,EAANK,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,iBAAe,SAAS,IAFvBN",
6
- "names": ["SignTransactionUseCase_exports", "__export", "SignTransactionUseCase", "__toCommonJS", "import_inversify", "import_appBinderTypes", "SignTransactionUseCase", "appBinder", "derivationPath", "transaction", "options", "__decorateClass", "__decorateParam"]
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { Transaction } from \"@api/model/Transaction\";\nimport { SolanaTransactionOptions } from \"@api/model/TransactionOptions\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { SolanaAppBinder } from \"@internal/app-binder/SolanaAppBinder\";\n\n@injectable()\nexport class SignTransactionUseCase {\n constructor(\n @inject(appBinderTypes.AppBinder) private appBinder: SolanaAppBinder,\n ) {}\n\n execute(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptions?: SolanaTransactionOptions,\n ): SignTransactionDAReturnType {\n return this.appBinder.signTransaction({\n derivationPath,\n transaction,\n solanaTransactionOptions,\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBAKnCC,EAA+B,kDAIxB,IAAMC,EAAN,KAA6B,CAClC,YAC4CC,EAC1C,CAD0C,eAAAA,CACzC,CAEH,QACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,UAAU,gBAAgB,CACpC,eAAAF,EACA,YAAAC,EACA,yBAAAC,CACF,CAAC,CACH,CACF,EAhBaJ,EAANK,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,iBAAe,SAAS,IAFvBN",
6
+ "names": ["SignTransactionUseCase_exports", "__export", "SignTransactionUseCase", "__toCommonJS", "import_inversify", "import_appBinderTypes", "SignTransactionUseCase", "appBinder", "derivationPath", "transaction", "solanaTransactionOptions", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var s=require("./SignTransactionUseCase");describe("GetAppConfigurationUseCase",()=>{const e=vi.fn(),i={signTransaction:e};let t;beforeEach(()=>{vi.clearAllMocks(),t=new s.SignTransactionUseCase(i)}),it("should return the config from the appBinder's getAppConfiguration method",()=>{e.mockReturnValue(new Uint8Array([66]));const n=t.execute("44'/501'/0'/0'",new Uint8Array([1,2,3,4]));expect(e).toHaveBeenCalledWith({derivationPath:"44'/501'/0'/0'",transaction:new Uint8Array([1,2,3,4]),skipOpenApp:!1,options:void 0}),expect(n).toEqual(new Uint8Array([66]))}),it("should forward skipOpenApp and TransactionOptions to appBinder.signTransaction",()=>{const n="44'/501'/1'/2'",a=new Uint8Array([170,187]),o={skipOpenApp:!0,tokenAddress:"someToken",createATA:{address:"someAddress",mintAddress:"mint"}};t.execute(n,a,o),expect(e).toHaveBeenCalledWith({derivationPath:n,transaction:a,skipOpenApp:!0})})});
1
+ "use strict";var s=require("./SignTransactionUseCase");describe("GetAppConfigurationUseCase",()=>{const n=vi.fn(),i={signTransaction:n};let t;beforeEach(()=>{vi.clearAllMocks(),t=new s.SignTransactionUseCase(i)}),it("should return the config from the appBinder's getAppConfiguration method",()=>{n.mockReturnValue(new Uint8Array([66]));const e=t.execute("44'/501'/0'/0'",new Uint8Array([1,2,3,4]));expect(n).toHaveBeenCalledWith({derivationPath:"44'/501'/0'/0'",transaction:new Uint8Array([1,2,3,4]),solanaTransactionOptions:void 0}),expect(e).toEqual(new Uint8Array([66]))}),it("should forward skipOpenApp and TransactionResolutionContext to appBinder.signTransaction",()=>{const e="44'/501'/1'/2'",a=new Uint8Array([170,187]),o={skipOpenApp:!0,transactionResolutionContext:{tokenAddress:"someToken",createATA:{address:"someAddress",mintAddress:"someMint"}}};t.execute(e,a,o),expect(n).toHaveBeenCalledWith({derivationPath:e,transaction:a,solanaTransactionOptions:o})})});
2
2
  //# sourceMappingURL=SignTransactionUseCase.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/use-cases/transaction/SignTransactionUseCase.test.ts"],
4
- "sourcesContent": ["import { type SolanaAppBinder } from \"@internal/app-binder/SolanaAppBinder\";\n\nimport { SignTransactionUseCase } from \"./SignTransactionUseCase\";\n\ndescribe(\"GetAppConfigurationUseCase\", () => {\n const signTransactionMock = vi.fn();\n const appBinderMock = {\n signTransaction: signTransactionMock,\n } as unknown as SolanaAppBinder;\n let useCase: SignTransactionUseCase;\n\n beforeEach(() => {\n vi.clearAllMocks();\n useCase = new SignTransactionUseCase(appBinderMock);\n });\n\n it(\"should return the config from the appBinder's getAppConfiguration method\", () => {\n // GIVEN\n signTransactionMock.mockReturnValue(new Uint8Array([0x042]));\n\n // WHEN\n const result = useCase.execute(\n \"44'/501'/0'/0'\",\n new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n );\n\n // THEN\n expect(signTransactionMock).toHaveBeenCalledWith({\n derivationPath: \"44'/501'/0'/0'\",\n transaction: new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n skipOpenApp: false,\n options: undefined,\n });\n expect(result).toEqual(new Uint8Array([0x042]));\n });\n\n it(\"should forward skipOpenApp and TransactionOptions to appBinder.signTransaction\", () => {\n // GIVEN\n const derivationPath = \"44'/501'/1'/2'\";\n const tx = new Uint8Array([0xaa, 0xbb]);\n const opts = {\n skipOpenApp: true,\n tokenAddress: \"someToken\",\n createATA: { address: \"someAddress\", mintAddress: \"mint\" },\n };\n\n // WHEN\n useCase.execute(derivationPath, tx, opts);\n\n // THEN\n expect(signTransactionMock).toHaveBeenCalledWith({\n derivationPath,\n transaction: tx,\n skipOpenApp: true,\n });\n });\n});\n"],
5
- "mappings": "aAEA,IAAAA,EAAuC,oCAEvC,SAAS,6BAA8B,IAAM,CAC3C,MAAMC,EAAsB,GAAG,GAAG,EAC5BC,EAAgB,CACpB,gBAAiBD,CACnB,EACA,IAAIE,EAEJ,WAAW,IAAM,CACf,GAAG,cAAc,EACjBA,EAAU,IAAI,yBAAuBD,CAAa,CACpD,CAAC,EAED,GAAG,2EAA4E,IAAM,CAEnFD,EAAoB,gBAAgB,IAAI,WAAW,CAAC,EAAK,CAAC,CAAC,EAG3D,MAAMG,EAASD,EAAQ,QACrB,iBACA,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,CACzC,EAGA,OAAOF,CAAmB,EAAE,qBAAqB,CAC/C,eAAgB,iBAChB,YAAa,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EACpD,YAAa,GACb,QAAS,MACX,CAAC,EACD,OAAOG,CAAM,EAAE,QAAQ,IAAI,WAAW,CAAC,EAAK,CAAC,CAAC,CAChD,CAAC,EAED,GAAG,iFAAkF,IAAM,CAEzF,MAAMC,EAAiB,iBACjBC,EAAK,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAChCC,EAAO,CACX,YAAa,GACb,aAAc,YACd,UAAW,CAAE,QAAS,cAAe,YAAa,MAAO,CAC3D,EAGAJ,EAAQ,QAAQE,EAAgBC,EAAIC,CAAI,EAGxC,OAAON,CAAmB,EAAE,qBAAqB,CAC/C,eAAAI,EACA,YAAaC,EACb,YAAa,EACf,CAAC,CACH,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import { type SolanaAppBinder } from \"@internal/app-binder/SolanaAppBinder\";\n\nimport { SignTransactionUseCase } from \"./SignTransactionUseCase\";\n\ndescribe(\"GetAppConfigurationUseCase\", () => {\n const signTransactionMock = vi.fn();\n const appBinderMock = {\n signTransaction: signTransactionMock,\n } as unknown as SolanaAppBinder;\n let useCase: SignTransactionUseCase;\n\n beforeEach(() => {\n vi.clearAllMocks();\n useCase = new SignTransactionUseCase(appBinderMock);\n });\n\n it(\"should return the config from the appBinder's getAppConfiguration method\", () => {\n // GIVEN\n signTransactionMock.mockReturnValue(new Uint8Array([0x042]));\n\n // WHEN\n const result = useCase.execute(\n \"44'/501'/0'/0'\",\n new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n );\n\n // THEN\n expect(signTransactionMock).toHaveBeenCalledWith({\n derivationPath: \"44'/501'/0'/0'\",\n transaction: new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n solanaTransactionOptions: undefined,\n });\n expect(result).toEqual(new Uint8Array([0x042]));\n });\n\n it(\"should forward skipOpenApp and TransactionResolutionContext to appBinder.signTransaction\", () => {\n // GIVEN\n const derivationPath = \"44'/501'/1'/2'\";\n const tx = new Uint8Array([0xaa, 0xbb]);\n const opts = {\n skipOpenApp: true,\n transactionResolutionContext: {\n tokenAddress: \"someToken\",\n createATA: { address: \"someAddress\", mintAddress: \"someMint\" },\n },\n };\n\n // WHEN\n useCase.execute(derivationPath, tx, opts);\n\n // THEN\n expect(signTransactionMock).toHaveBeenCalledWith({\n derivationPath,\n transaction: tx,\n solanaTransactionOptions: opts,\n });\n });\n});\n"],
5
+ "mappings": "aAEA,IAAAA,EAAuC,oCAEvC,SAAS,6BAA8B,IAAM,CAC3C,MAAMC,EAAsB,GAAG,GAAG,EAC5BC,EAAgB,CACpB,gBAAiBD,CACnB,EACA,IAAIE,EAEJ,WAAW,IAAM,CACf,GAAG,cAAc,EACjBA,EAAU,IAAI,yBAAuBD,CAAa,CACpD,CAAC,EAED,GAAG,2EAA4E,IAAM,CAEnFD,EAAoB,gBAAgB,IAAI,WAAW,CAAC,EAAK,CAAC,CAAC,EAG3D,MAAMG,EAASD,EAAQ,QACrB,iBACA,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,CACzC,EAGA,OAAOF,CAAmB,EAAE,qBAAqB,CAC/C,eAAgB,iBAChB,YAAa,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EACpD,yBAA0B,MAC5B,CAAC,EACD,OAAOG,CAAM,EAAE,QAAQ,IAAI,WAAW,CAAC,EAAK,CAAC,CAAC,CAChD,CAAC,EAED,GAAG,2FAA4F,IAAM,CAEnG,MAAMC,EAAiB,iBACjBC,EAAK,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAChCC,EAAO,CACX,YAAa,GACb,6BAA8B,CAC5B,aAAc,YACd,UAAW,CAAE,QAAS,cAAe,YAAa,UAAW,CAC/D,CACF,EAGAJ,EAAQ,QAAQE,EAAgBC,EAAIC,CAAI,EAGxC,OAAON,CAAmB,EAAE,qBAAqB,CAC/C,eAAAI,EACA,YAAaC,EACb,yBAA0BC,CAC5B,CAAC,CACH,CAAC,CACH,CAAC",
6
6
  "names": ["import_SignTransactionUseCase", "signTransactionMock", "appBinderMock", "useCase", "result", "derivationPath", "tx", "opts"]
7
7
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/device-signer-kit-solana",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "private": false,
5
5
  "license": "Apache-2.0",
6
6
  "exports": {
@@ -1,2 +1,2 @@
1
- import{SignerSolanaBuilder as t}from"./SignerSolanaBuilder";import{SolanaToolsBuilder as a}from"./SolanaToolsBuilder";export{t as SignerSolanaBuilder,a as SolanaToolsBuilder};
1
+ import{SignerSolanaBuilder as t}from"./SignerSolanaBuilder";import{SolanaToolsBuilder as n}from"./SolanaToolsBuilder";export{t as SignerSolanaBuilder,n as SolanaToolsBuilder};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/index.ts"],
4
- "sourcesContent": ["export type {\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue,\n GenerateTransactionDAOutput,\n GenerateTransactionDAReturnType,\n} from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nexport type {\n GetAddressDAError,\n GetAddressDAIntermediateValue,\n GetAddressDAOutput,\n GetAddressDAReturnType,\n} from \"@api/app-binder/GetAddressDeviceActionTypes\";\nexport type {\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue,\n GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nexport type {\n SignMessageDAError,\n SignMessageDAIntermediateValue,\n SignMessageDAOutput,\n} from \"@api/app-binder/SignMessageDeviceActionTypes\";\nexport type {\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAOutput,\n SignTransactionDAReturnType,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nexport type { Signature } from \"@api/model/Signature\";\nexport type { Transaction } from \"@api/model/Transaction\";\nexport type { TransactionOptions } from \"@api/model/TransactionOptions\";\nexport type { SignerSolana } from \"@api/SignerSolana\";\nexport { SignerSolanaBuilder } from \"@api/SignerSolanaBuilder\";\nexport type { SolanaTools } from \"@api/SolanaTools\";\nexport { SolanaToolsBuilder } from \"@api/SolanaToolsBuilder\";\n"],
5
- "mappings": "AAgCA,OAAS,uBAAAA,MAA2B,2BAEpC,OAAS,sBAAAC,MAA0B",
4
+ "sourcesContent": ["export type {\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue,\n GenerateTransactionDAOutput,\n GenerateTransactionDAReturnType,\n} from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nexport type {\n GetAddressDAError,\n GetAddressDAIntermediateValue,\n GetAddressDAOutput,\n GetAddressDAReturnType,\n} from \"@api/app-binder/GetAddressDeviceActionTypes\";\nexport type {\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue,\n GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nexport type {\n SignMessageDAError,\n SignMessageDAIntermediateValue,\n SignMessageDAOutput,\n} from \"@api/app-binder/SignMessageDeviceActionTypes\";\nexport type {\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAOutput,\n SignTransactionDAReturnType,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nexport type { Signature } from \"@api/model/Signature\";\nexport type { Transaction } from \"@api/model/Transaction\";\nexport type { SignerSolana } from \"@api/SignerSolana\";\nexport { SignerSolanaBuilder } from \"@api/SignerSolanaBuilder\";\nexport type { SolanaTools } from \"@api/SolanaTools\";\nexport { SolanaToolsBuilder } from \"@api/SolanaToolsBuilder\";\n"],
5
+ "mappings": "AA+BA,OAAS,uBAAAA,MAA2B,2BAEpC,OAAS,sBAAAC,MAA0B",
6
6
  "names": ["SignerSolanaBuilder", "SolanaToolsBuilder"]
7
7
  }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=TransactionResolutionContext.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,2 +1,2 @@
1
- import{useCasesTypes as n}from"./use-cases/di/useCasesTypes";import{makeContainer as s}from"./di";class p{_container;constructor({dmk:e,sessionId:t,contextModule:r}){this._container=s({dmk:e,sessionId:t,contextModule:r})}signTransaction(e,t){return this._container.get(n.SignTransactionUseCase).execute(e,t)}signMessage(e,t,r){return this._container.get(n.SignMessageUseCase).execute(e,t,r)}getAddress(e,t){return this._container.get(n.GetAddressUseCase).execute(e,t)}getAppConfiguration(){return this._container.get(n.GetAppConfigurationUseCase).execute()}}export{p as DefaultSignerSolana};
1
+ import{useCasesTypes as r}from"./use-cases/di/useCasesTypes";import{makeContainer as s}from"./di";class p{_container;constructor({dmk:e,sessionId:t,contextModule:n}){this._container=s({dmk:e,sessionId:t,contextModule:n})}signTransaction(e,t,n){return this._container.get(r.SignTransactionUseCase).execute(e,t,n)}signMessage(e,t,n){return this._container.get(r.SignMessageUseCase).execute(e,t,n)}getAddress(e,t){return this._container.get(r.GetAddressUseCase).execute(e,t)}getAppConfiguration(){return this._container.get(r.GetAppConfigurationUseCase).execute()}}export{p as DefaultSignerSolana};
2
2
  //# sourceMappingURL=DefaultSignerSolana.js.map