@ledgerhq/context-module 0.0.0-develop-20260706002934 → 0.0.0-develop-20260707161641

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 (47) hide show
  1. package/lib/cjs/package.json +1 -1
  2. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +1 -1
  3. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
  4. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +1 -1
  5. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +3 -3
  6. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  7. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js.map +2 -2
  8. package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js.map +1 -1
  9. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +1 -1
  10. package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
  11. package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
  12. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
  13. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
  14. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
  15. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
  16. package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js +1 -1
  17. package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js.map +1 -1
  18. package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
  19. package/lib/cjs/src/shared/model/ClearSignContext.js.map +2 -2
  20. package/lib/esm/package.json +1 -1
  21. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +1 -1
  22. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
  23. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +1 -1
  24. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +3 -3
  25. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  26. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js.map +2 -2
  27. package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +1 -1
  28. package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
  29. package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
  30. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
  31. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
  32. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
  33. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
  34. package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
  35. package/lib/esm/src/shared/model/ClearSignContext.js.map +2 -2
  36. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts +5 -0
  37. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts.map +1 -1
  38. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts +2 -1
  39. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts.map +1 -1
  40. package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts +6 -5
  41. package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts.map +1 -1
  42. package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts +2 -5
  43. package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts.map +1 -1
  44. package/lib/types/src/shared/model/ClearSignContext.d.ts +1 -0
  45. package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
  46. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  47. package/package.json +5 -5
@@ -58,5 +58,5 @@
58
58
  "watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
59
59
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
60
60
  },
61
- "version": "0.0.0-develop-20260706002934"
61
+ "version": "0.0.0-develop-20260707161641"
62
62
  }
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.create;var f=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var N=(e,a,r,A)=>{if(a&&typeof a=="object"||typeof a=="function")for(let s of C(a))!k.call(e,s)&&s!==r&&f(e,s,{get:()=>a[s],enumerable:!(A=m(a,s))||A.enumerable});return e};var w=(e,a,r)=>(r=e!=null?u(x(e)):{},N(a||!e||!e.__esModule?f(r,"default",{value:e,enumerable:!0}):r,e));var o=require("@ledgerhq/device-management-kit"),p=w(require("bs58")),d=require("purify-ts"),y=require("../../../../modules/multichain/transaction-check/utils/constants"),n=require("../../../../shared/model/ClearSignContext"),h=require("./SolanaTransactionCheckLoader");const c=64,g={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},O=()=>g,l={loadCertificate:vi.fn()};let i,t;beforeEach(()=>{vi.resetAllMocks(),i={check:vi.fn()},t=new h.SolanaTransactionCheckLoader(i,l,O)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,222]),chain:1}};it("returns true for a valid Solana transaction-check input",()=>{expect(t.canHandle(e,[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(t.canHandle(e,[n.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(t.canHandle({...e,deviceModelId:o.DeviceModelId.NANO_S},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{i.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk",descriptor:"aabb"})),l.loadCertificate.mockResolvedValue({payload:new Uint8Array([204]),keyUsageNumber:14})}),it("wraps a legacy Message into a serialized Transaction (sig count + zero-filled signatures + message) and bs58-encodes it",async()=>{const e=new Uint8Array([2,0,3,170,187,204]);await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});const a=i.check.mock.calls[0][0],r=p.default.decode(a.body.tx.raw);expect(a.path).toBe(y.TransactionCheckPaths.SOLANA_TRANSACTION),expect(a.body.tx.from).toBe("signer"),expect(a.body.chain).toBe(1),expect(r.length).toBe(1+2*c+e.length),expect(r[0]).toBe(2),expect(Array.from(r.slice(1,1+2*c))).toEqual(new Array(2*c).fill(0)),expect(Array.from(r.slice(1+2*c))).toEqual(Array.from(e))}),it("wraps a versioned (v0) Message by skipping the version prefix when reading numRequiredSignatures",async()=>{const e=new Uint8Array([128,1,0,3,222,173]);await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});const a=p.default.decode(i.check.mock.calls[0][0].body.tx.raw);expect(a.length).toBe(1+c+e.length),expect(a[0]).toBe(1),expect(Array.from(a.slice(1,1+c))).toEqual(new Array(c).fill(0)),expect(Array.from(a.slice(1+c))).toEqual(Array.from(e))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{i.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};l.loadCertificate.mockResolvedValue(e);const[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:1}});expect(a).toEqual({type:n.ClearSignContextType.SOLANA_TRANSACTION_CHECK,payload:{descriptor:"deadbeef"},certificate:e})}),it("returns an ERROR context when the data source returns Left",async()=>{const e=new Error("network fail");i.check.mockResolvedValue((0,d.Left)(e));const[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:1}});expect(a).toEqual({type:n.ClearSignContextType.ERROR,error:e}),expect(l.loadCertificate).not.toHaveBeenCalled()}),it("returns an ERROR context (and does not call the data source) when numRequiredSignatures exceeds the max",async()=>{const e=new Uint8Array([65,0,3,170]),[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});expect(a).toMatchObject({type:n.ClearSignContextType.ERROR,error:expect.any(Error)}),expect(a.error.message).toContain("numRequiredSignatures (65)"),expect(i.check).not.toHaveBeenCalled()})})});
1
+ "use strict";var h=Object.create;var f=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var u=(e,t,a,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of m(t))!k.call(e,s)&&s!==a&&f(e,s,{get:()=>t[s],enumerable:!(p=C(t,s))||p.enumerable});return e};var w=(e,t,a)=>(a=e!=null?h(x(e)):{},u(t||!e||!e.__esModule?f(a,"default",{value:e,enumerable:!0}):a,e));var c=require("@ledgerhq/device-management-kit"),l=w(require("bs58")),d=require("purify-ts"),N=require("../../../../modules/multichain/transaction-check/utils/constants"),i=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),r=require("../../../../shared/model/ClearSignContext"),y=require("./SolanaTransactionCheckLoader");const S={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},T=()=>S,A={loadCertificate:vi.fn()};let o,n;beforeEach(()=>{vi.resetAllMocks(),o={check:vi.fn()},n=new y.SolanaTransactionCheckLoader(o,A,T)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,222]),chain:1}};it("returns true for a valid Solana transaction-check input",()=>{expect(n.canHandle(e,[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(n.canHandle(e,[r.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(n.canHandle({...e,deviceModelId:c.DeviceModelId.NANO_S},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{o.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk",descriptor:"aabb"})),A.loadCertificate.mockResolvedValue({payload:new Uint8Array([204]),keyUsageNumber:14})}),it("wraps a legacy message with zero-filled signature placeholders before bs58-encoding",async()=>{const e=new Uint8Array([2,0,3,170,187,204]),t=new Uint8Array(1+2*64+e.length);t[0]=2,t.set(e,1+2*64),await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});const a=o.check.mock.calls[0][0];expect(a.path).toBe(N.TransactionCheckPaths.SOLANA_TRANSACTION),expect(a.body.tx.from).toBe("signer"),expect(a.body.chain).toBe(i.SolanaTransactionScanChainId.MAINNET),expect(Array.from(l.default.decode(a.body.tx.raw))).toEqual(Array.from(t)),expect(a.body.tx.raw).toBe(l.default.encode(t))}),it("wraps a versioned (v0) message with signature placeholders",async()=>{const e=new Uint8Array([128,1,0,3,222,173]),t=new Uint8Array(1+1*64+e.length);t[0]=1,t.set(e,1+1*64),await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});const a=o.check.mock.calls[0][0].body.tx.raw;expect(Array.from(l.default.decode(a))).toEqual(Array.from(t))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{o.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};A.loadCertificate.mockResolvedValue(e);const[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toEqual({type:r.ClearSignContextType.SOLANA_TRANSACTION_CHECK,payload:{descriptor:"deadbeef"},certificate:e})}),it("returns an ERROR context when the data source returns Left",async()=>{const e=new Error("network fail");o.check.mockResolvedValue((0,d.Left)(e));const[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toEqual({type:r.ClearSignContextType.ERROR,error:e}),expect(A.loadCertificate).not.toHaveBeenCalled()}),it("returns an ERROR context when numRequiredSignatures exceeds the 64-signature limit",async()=>{const e=new Uint8Array([65,0,3,170]),[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toMatchObject({type:r.ClearSignContextType.ERROR,error:expect.objectContaining({message:expect.stringContaining("exceeds SOLANA_MAX_SIGNATURES")})}),expect(o.check).not.toHaveBeenCalled()})})});
2
2
  //# sourceMappingURL=SolanaTransactionCheckLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport bs58 from \"bs58\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst SIG_LENGTH = 64;\n\nconst loggerMock = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst loggerFactory = () => loggerMock;\n\nconst certificateLoaderMock: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n};\n\nlet dataSourceMock: { check: ReturnType<typeof vi.fn> };\nlet loader: SolanaTransactionCheckLoader;\n\nbeforeEach(() => {\n vi.resetAllMocks();\n dataSourceMock = { check: vi.fn() };\n loader = new SolanaTransactionCheckLoader(\n dataSourceMock as unknown as TransactionCheckDataSource,\n certificateLoaderMock,\n loggerFactory,\n );\n});\n\ndescribe(\"SolanaTransactionCheckLoader\", () => {\n describe(\"canHandle\", () => {\n const validInput = {\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xde]),\n chain: 1,\n },\n };\n\n it(\"returns true for a valid Solana transaction-check input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n ]),\n ).toBe(true);\n });\n\n it(\"returns false when expected types do not include SOLANA_TRANSACTION_CHECK\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is not a Uint8Array\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: \"0xdead\" as unknown as Uint8Array,\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: new Uint8Array(),\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when from is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: { ...validInput.transactionCheck, from: \"\" },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false for unsupported device models (NANO_S)\", () => {\n expect(\n loader.canHandle(\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load \u2014 wire format\", () => {\n beforeEach(() => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk\", descriptor: \"aabb\" }),\n );\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue({\n payload: new Uint8Array([0xcc]),\n keyUsageNumber: 14,\n });\n });\n\n it(\"wraps a legacy Message into a serialized Transaction (sig count + zero-filled signatures + message) and bs58-encodes it\", async () => {\n // Legacy message: numRequiredSignatures=2, then arbitrary bytes\n const message = new Uint8Array([2, 0, 3, 0xaa, 0xbb, 0xcc]);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n const sent = dataSourceMock.check.mock.calls[0]![0];\n const wrapped = bs58.decode(sent.body.tx.raw);\n\n expect(sent.path).toBe(TransactionCheckPaths.SOLANA_TRANSACTION);\n expect(sent.body.tx.from).toBe(\"signer\");\n expect(sent.body.chain).toBe(1);\n expect(wrapped.length).toBe(1 + 2 * SIG_LENGTH + message.length);\n expect(wrapped[0]).toBe(2);\n expect(Array.from(wrapped.slice(1, 1 + 2 * SIG_LENGTH))).toEqual(\n new Array(2 * SIG_LENGTH).fill(0),\n );\n expect(Array.from(wrapped.slice(1 + 2 * SIG_LENGTH))).toEqual(\n Array.from(message),\n );\n });\n\n it(\"wraps a versioned (v0) Message by skipping the version prefix when reading numRequiredSignatures\", async () => {\n // V0 message: [0x80 version prefix, numRequiredSignatures=1, ...]\n const message = new Uint8Array([0x80, 1, 0, 3, 0xde, 0xad]);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n const wrapped = bs58.decode(\n dataSourceMock.check.mock.calls[0]![0].body.tx.raw,\n );\n\n expect(wrapped.length).toBe(1 + SIG_LENGTH + message.length);\n expect(wrapped[0]).toBe(1);\n expect(Array.from(wrapped.slice(1, 1 + SIG_LENGTH))).toEqual(\n new Array(SIG_LENGTH).fill(0),\n );\n expect(Array.from(wrapped.slice(1 + SIG_LENGTH))).toEqual(\n Array.from(message),\n );\n });\n });\n\n describe(\"load \u2014 result mapping\", () => {\n it(\"returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success\", async () => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk-1\", descriptor: \"deadbeef\" }),\n );\n const cert = { payload: new Uint8Array([0x99]), keyUsageNumber: 14 };\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue(cert);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: 1,\n },\n });\n\n expect(ctx).toEqual({\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: \"deadbeef\" },\n certificate: cert,\n });\n });\n\n it(\"returns an ERROR context when the data source returns Left\", async () => {\n const error = new Error(\"network fail\");\n dataSourceMock.check.mockResolvedValue(Left(error));\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: 1,\n },\n });\n\n expect(ctx).toEqual({ type: ClearSignContextType.ERROR, error });\n expect(certificateLoaderMock.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"returns an ERROR context (and does not call the data source) when numRequiredSignatures exceeds the max\", async () => {\n // numRequiredSignatures = 65, one above SOLANA_MAX_SIGNATURES (64)\n const message = new Uint8Array([65, 0, 3, 0xaa]);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n expect(ctx).toMatchObject({\n type: ClearSignContextType.ERROR,\n error: expect.any(Error),\n });\n expect((ctx as { error: Error }).error.message).toContain(\n \"numRequiredSignatures (65)\",\n );\n expect(dataSourceMock.check).not.toHaveBeenCalled();\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_bs58", "import_purify_ts", "import_constants", "import_ClearSignContext", "import_SolanaTransactionCheckLoader", "SIG_LENGTH", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "message", "sent", "wrapped", "bs58", "cert", "ctx", "error"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport bs58 from \"bs58\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst loggerMock = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst loggerFactory = () => loggerMock;\n\nconst certificateLoaderMock: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n};\n\nlet dataSourceMock: { check: ReturnType<typeof vi.fn> };\nlet loader: SolanaTransactionCheckLoader;\n\nbeforeEach(() => {\n vi.resetAllMocks();\n dataSourceMock = { check: vi.fn() };\n loader = new SolanaTransactionCheckLoader(\n dataSourceMock as unknown as TransactionCheckDataSource,\n certificateLoaderMock,\n loggerFactory,\n );\n});\n\ndescribe(\"SolanaTransactionCheckLoader\", () => {\n describe(\"canHandle\", () => {\n const validInput = {\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xde]),\n chain: 1,\n },\n };\n\n it(\"returns true for a valid Solana transaction-check input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n ]),\n ).toBe(true);\n });\n\n it(\"returns false when expected types do not include SOLANA_TRANSACTION_CHECK\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is not a Uint8Array\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: \"0xdead\" as unknown as Uint8Array,\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: new Uint8Array(),\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when from is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: { ...validInput.transactionCheck, from: \"\" },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false for unsupported device models (NANO_S)\", () => {\n expect(\n loader.canHandle(\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load \u2014 wire format\", () => {\n beforeEach(() => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk\", descriptor: \"aabb\" }),\n );\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue({\n payload: new Uint8Array([0xcc]),\n keyUsageNumber: 14,\n });\n });\n\n it(\"wraps a legacy message with zero-filled signature placeholders before bs58-encoding\", async () => {\n // message[0] = 2 \u2192 numRequiredSignatures = 2 (legacy, high bit clear)\n const message = new Uint8Array([2, 0, 3, 0xaa, 0xbb, 0xcc]);\n // expected: compact-u16(2) + 2*64 zero bytes + message\n const expected = new Uint8Array(1 + 2 * 64 + message.length);\n expected[0] = 2; // compact-u16 encoding of 2\n expected.set(message, 1 + 2 * 64);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const sent = dataSourceMock.check.mock.calls[0]![0];\n\n expect(sent.path).toBe(TransactionCheckPaths.SOLANA_TRANSACTION);\n expect(sent.body.tx.from).toBe(\"signer\");\n expect(sent.body.chain).toBe(SolanaTransactionScanChainId.MAINNET);\n expect(Array.from(bs58.decode(sent.body.tx.raw))).toEqual(\n Array.from(expected),\n );\n expect(sent.body.tx.raw).toBe(bs58.encode(expected));\n });\n\n it(\"wraps a versioned (v0) message with signature placeholders\", async () => {\n // message[0] = 0x80 \u2192 versioned prefix; message[1] = 1 \u2192 numRequiredSignatures = 1\n const message = new Uint8Array([0x80, 1, 0, 3, 0xde, 0xad]);\n // expected: compact-u16(1) + 1*64 zero bytes + message\n const expected = new Uint8Array(1 + 1 * 64 + message.length);\n expected[0] = 1; // compact-u16 encoding of 1\n expected.set(message, 1 + 1 * 64);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const raw = dataSourceMock.check.mock.calls[0]![0].body.tx.raw;\n\n expect(Array.from(bs58.decode(raw))).toEqual(Array.from(expected));\n });\n });\n\n describe(\"load \u2014 result mapping\", () => {\n it(\"returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success\", async () => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk-1\", descriptor: \"deadbeef\" }),\n );\n const cert = { payload: new Uint8Array([0x99]), keyUsageNumber: 14 };\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue(cert);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: \"deadbeef\" },\n certificate: cert,\n });\n });\n\n it(\"returns an ERROR context when the data source returns Left\", async () => {\n const error = new Error(\"network fail\");\n dataSourceMock.check.mockResolvedValue(Left(error));\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({ type: ClearSignContextType.ERROR, error });\n expect(certificateLoaderMock.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"returns an ERROR context when numRequiredSignatures exceeds the 64-signature limit\", async () => {\n // message[0] = 65 \u2192 numRequiredSignatures = 65 (legacy, high bit clear), which exceeds SOLANA_MAX_SIGNATURES\n const message = new Uint8Array([65, 0, 3, 0xaa]);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toMatchObject({\n type: ClearSignContextType.ERROR,\n error: expect.objectContaining({\n message: expect.stringContaining(\"exceeds SOLANA_MAX_SIGNATURES\"),\n }),\n });\n expect(dataSourceMock.check).not.toHaveBeenCalled();\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_bs58", "import_purify_ts", "import_constants", "import_SolanaTransactionScanChainId", "import_ClearSignContext", "import_SolanaTransactionCheckLoader", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "message", "expected", "sent", "bs58", "raw", "cert", "ctx", "error"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var d=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),e=require("vitest"),s=require("../../../../shared/model/ClearSignContext"),g=require("./InstructionInfoContextLoader");const N=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),y={keyUsageNumber:8,payload:new Uint8Array([66])},o="11111111111111111111111111111111",u="JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4";function f(){return{programId:o,discriminator:"00000000",instructionInfo:{data:"0001sys_data",signature:"prodsig_sys"},substructures:[{kind:0,data:"df1"},{kind:0,data:"df2"},{kind:1,data:"vfp1"}],enumVariants:[],idlDescriptor:{typePool:[],rootType:0},mintAssociations:[],valueFlowPorts:[],accountResets:[],displayFields:[]}}function m(){return{programId:o,descriptors:{"00000000":(0,r.Right)(f())},enumVariants:[]}}function O(){return{programId:u,discriminator:"e517cb977ae3ad2a",instructionInfo:{data:"0001jup_data",signature:"prodsig_jup"},substructures:[],enumVariants:[],idlDescriptor:{typePool:[],rootType:0},mintAssociations:[],valueFlowPorts:[],accountResets:[],displayFields:[]}}function R(){return{programId:u,descriptors:{e517cb977ae3ad2a:(0,r.Right)(O())},enumVariants:[]}}(0,e.describe)("InstructionInfoContextLoader",()=>{let l,p;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),l={getInstructionInfo:e.vi.fn()},p={loadCertificate:e.vi.fn().mockResolvedValue(y)}});const c=()=>new g.InstructionInfoContextLoader(l,p,N);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_INSTRUCTION_INFO is requested and instructions are present",()=>{(0,e.expect)(c().canHandle({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o}]},[s.ClearSignContextType.SOLANA_INSTRUCTION_INFO])).toBe(!0)}),(0,e.it)("returns false when SOLANA_INSTRUCTION_INFO is not requested",()=>{(0,e.expect)(c().canHandle({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o}]},[s.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false on missing / empty / malformed instructions",()=>{const n=c(),t=[s.ClearSignContextType.SOLANA_INSTRUCTION_INFO];(0,e.expect)(n.canHandle({},t)).toBe(!1),(0,e.expect)(n.canHandle({instructions:[]},t)).toBe(!1),(0,e.expect)(n.canHandle({instructions:[{programId:""}]},t)).toBe(!1),(0,e.expect)(n.canHandle(null,t)).toBe(!1),(0,e.expect)(n.canHandle("string",t)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("fans out one CAL call per distinct programId in parallel",async()=>{const n=c(),t=e.vi.spyOn(l,"getInstructionInfo").mockImplementation(async({programId:i})=>i===o?(0,r.Right)(m()):i===u?(0,r.Right)(R()):(0,r.Left)(new Error("unknown program"))),a=await n.load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o,discriminator:"00000000"},{programId:o,discriminator:"00000000"},{programId:u,discriminator:"e517cb977ae3ad2a"}],network:"solana-mainnet"});(0,e.expect)(t).toHaveBeenCalledTimes(2),(0,e.expect)(t).toHaveBeenCalledWith({programId:o,network:"solana-mainnet"}),(0,e.expect)(t).toHaveBeenCalledWith({programId:u,network:"solana-mainnet"}),(0,e.expect)(a.every(i=>i.type===s.ClearSignContextType.SOLANA_INSTRUCTION_INFO||i.type===s.ClearSignContextType.ERROR)).toBe(!0),(0,e.expect)(a.filter(i=>i.type===s.ClearSignContextType.SOLANA_INSTRUCTION_INFO)).toHaveLength(2)}),(0,e.it)("emits one SOLANA_INSTRUCTION_INFO per matching (programId, discriminator), passing the decoded payload through with the certificate",async()=>{const n=c();e.vi.spyOn(l,"getInstructionInfo").mockResolvedValue((0,r.Right)(m()));const a=(await n.load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o,discriminator:"00000000"}]})).find(i=>i.type===s.ClearSignContextType.SOLANA_INSTRUCTION_INFO);(0,e.expect)(a).toBeDefined(),(0,e.expect)(a).toMatchObject({type:s.ClearSignContextType.SOLANA_INSTRUCTION_INFO,certificate:y}),(0,e.expect)(a.payload).toEqual(f())}),(0,e.it)("filters descriptors by requested discriminator",async()=>{const n=c(),t={programId:o,descriptors:{"00000000":(0,r.Right)(f()),"00000001":(0,r.Right)({...f(),discriminator:"00000001",instructionInfo:{data:"0001other",signature:"p"}})},enumVariants:[]};e.vi.spyOn(l,"getInstructionInfo").mockResolvedValue((0,r.Right)(t));const i=(await n.load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o,discriminator:"00000000"}]})).filter(I=>I.type===s.ClearSignContextType.SOLANA_INSTRUCTION_INFO);(0,e.expect)(i).toHaveLength(1),(0,e.expect)(i[0].payload.discriminator).toBe("00000000")}),(0,e.it)("emits an ERROR context for a descriptor the data source could not decode",async()=>{const n=c(),t={programId:o,descriptors:{"00000000":(0,r.Left)(new Error("missing 'test' signature"))},enumVariants:[]};e.vi.spyOn(l,"getInstructionInfo").mockResolvedValue((0,r.Right)(t));const a=await n.load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o,discriminator:"00000000"}]});(0,e.expect)(a).toHaveLength(1),(0,e.expect)(a[0]?.type).toBe(s.ClearSignContextType.ERROR),(0,e.expect)(a[0].error.message).toMatch(/missing 'test' signature/)}),(0,e.it)("emits one ERROR context when CAL fails for a program but keeps processing the others",async()=>{const n=c();e.vi.spyOn(l,"getInstructionInfo").mockImplementation(async({programId:I})=>I===o?(0,r.Right)(m()):(0,r.Left)(new Error("upstream-500")));const t=await n.load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o,discriminator:"00000000"},{programId:u,discriminator:"e517cb977ae3ad2a"}]}),a=t.filter(I=>I.type===s.ClearSignContextType.ERROR),i=t.filter(I=>I.type===s.ClearSignContextType.SOLANA_INSTRUCTION_INFO);(0,e.expect)(a).toHaveLength(1),(0,e.expect)(i).toHaveLength(1)}),(0,e.it)("degrades every program to ERROR when certificate loading fails",async()=>{e.vi.spyOn(p,"loadCertificate").mockRejectedValue(new Error("pki-down")),e.vi.spyOn(l,"getInstructionInfo").mockResolvedValue((0,r.Right)(m()));const t=await c().load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o},{programId:u}]});(0,e.expect)(t).toHaveLength(2),(0,e.expect)(t.every(a=>a.type===s.ClearSignContextType.ERROR)).toBe(!0)}),(0,e.it)("degrades every program to ERROR when the certificate resolves undefined",async()=>{e.vi.spyOn(p,"loadCertificate").mockResolvedValue(void 0),e.vi.spyOn(l,"getInstructionInfo").mockResolvedValue((0,r.Right)(m()));const t=await c().load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o},{programId:u}]});(0,e.expect)(t).toHaveLength(2),(0,e.expect)(t.every(a=>a.type===s.ClearSignContextType.ERROR)).toBe(!0),(0,e.expect)(t[0].error.message).toMatch(/certificate is missing/)}),(0,e.it)("falls back to default network when input.network is omitted or empty string",async()=>{const n=c(),t=e.vi.spyOn(l,"getInstructionInfo").mockResolvedValue((0,r.Right)(m()));await n.load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o}]}),(0,e.expect)(t).toHaveBeenLastCalledWith({programId:o,network:"solana-mainnet"}),await n.load({deviceModelId:d.DeviceModelId.NANO_X,instructions:[{programId:o}],network:""}),(0,e.expect)(t).toHaveBeenLastCalledWith({programId:o,network:"solana-mainnet"})})})});
1
+ "use strict";var c=require("@ledgerhq/device-management-kit"),n=require("purify-ts"),t=require("vitest"),i=require("../../../../shared/model/ClearSignContext"),g=require("./InstructionInfoContextLoader");const R=()=>({debug:t.vi.fn(),info:t.vi.fn(),warn:t.vi.fn(),error:t.vi.fn(),subscribers:[]}),y={keyUsageNumber:8,payload:new Uint8Array([66])},r="11111111111111111111111111111111",u="JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4";function f(){return{programId:r,discriminator:"00000000",instructionInfo:{data:"0001sys_data",signature:"prodsig_sys"},substructures:[{kind:0,data:"df1"},{kind:0,data:"df2"},{kind:1,data:"vfp1"}],enumVariants:[],idlDescriptor:{typePool:[],rootType:0},mintAssociations:[],valueFlowPorts:[],accountResets:[],displayFields:[]}}function m(){return{programId:r,descriptors:{"00000000":(0,n.Right)(f())},enumVariants:[]}}function O(){return{programId:u,discriminator:"e517cb977ae3ad2a",instructionInfo:{data:"0001jup_data",signature:"prodsig_jup"},substructures:[],enumVariants:[],idlDescriptor:{typePool:[],rootType:0},mintAssociations:[],valueFlowPorts:[],accountResets:[],displayFields:[]}}function _(){return{programId:u,descriptors:{e517cb977ae3ad2a:(0,n.Right)(O())},enumVariants:[]}}function N(d=[]){return{programId:u,descriptors:{e517cb977ae3ad2a:(0,n.Right)({...O(),enumVariants:d})},enumVariants:d}}(0,t.describe)("InstructionInfoContextLoader",()=>{let d,p;(0,t.beforeEach)(()=>{t.vi.restoreAllMocks(),d={getInstructionInfo:t.vi.fn()},p={loadCertificate:t.vi.fn().mockResolvedValue(y)}});const l=()=>new g.InstructionInfoContextLoader(d,p,R);(0,t.describe)("canHandle",()=>{(0,t.it)("returns true when SOLANA_INSTRUCTION_INFO is requested and instructions are present",()=>{(0,t.expect)(l().canHandle({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r}]},[i.ClearSignContextType.SOLANA_INSTRUCTION_INFO])).toBe(!0)}),(0,t.it)("returns false when SOLANA_INSTRUCTION_INFO is not requested",()=>{(0,t.expect)(l().canHandle({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r}]},[i.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,t.it)("returns false on missing / empty / malformed instructions",()=>{const o=l(),e=[i.ClearSignContextType.SOLANA_INSTRUCTION_INFO];(0,t.expect)(o.canHandle({},e)).toBe(!1),(0,t.expect)(o.canHandle({instructions:[]},e)).toBe(!1),(0,t.expect)(o.canHandle({instructions:[{programId:""}]},e)).toBe(!1),(0,t.expect)(o.canHandle(null,e)).toBe(!1),(0,t.expect)(o.canHandle("string",e)).toBe(!1)})}),(0,t.describe)("load",()=>{(0,t.it)("fans out one CAL call per distinct programId in parallel",async()=>{const o=l(),e=t.vi.spyOn(d,"getInstructionInfo").mockImplementation(async({programId:s})=>s===r?(0,n.Right)(m()):s===u?(0,n.Right)(_()):(0,n.Left)(new Error("unknown program"))),a=await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r,discriminator:"00000000"},{programId:r,discriminator:"00000000"},{programId:u,discriminator:"e517cb977ae3ad2a"}],network:"solana-mainnet"});(0,t.expect)(e).toHaveBeenCalledTimes(2),(0,t.expect)(e).toHaveBeenCalledWith({programId:r,network:"solana-mainnet"}),(0,t.expect)(e).toHaveBeenCalledWith({programId:u,network:"solana-mainnet"}),(0,t.expect)(a.every(s=>s.type===i.ClearSignContextType.SOLANA_INSTRUCTION_INFO||s.type===i.ClearSignContextType.ERROR)).toBe(!0),(0,t.expect)(a.filter(s=>s.type===i.ClearSignContextType.SOLANA_INSTRUCTION_INFO)).toHaveLength(2)}),(0,t.it)("emits one SOLANA_INSTRUCTION_INFO per matching (programId, discriminator), passing the decoded payload through with the certificate",async()=>{const o=l();t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(m()));const a=(await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r,discriminator:"00000000"}]})).find(s=>s.type===i.ClearSignContextType.SOLANA_INSTRUCTION_INFO);(0,t.expect)(a).toBeDefined(),(0,t.expect)(a).toMatchObject({type:i.ClearSignContextType.SOLANA_INSTRUCTION_INFO,certificate:y}),(0,t.expect)(a.payload).toEqual(f())}),(0,t.it)("does NOT emit SOLANA_ENUM_VARIANT contexts (those come from EnumVariantContextLoader)",async()=>{const o=l(),e=N([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}]);t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(e));const a=await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:u,discriminator:"e517cb977ae3ad2a"}]});(0,t.expect)(a.filter(s=>s.type===i.ClearSignContextType.SOLANA_ENUM_VARIANT)).toHaveLength(0)}),(0,t.it)("bundles CAL enum_variants into the SOLANA_INSTRUCTION_INFO payload (host decode cache)",async()=>{const o=l(),e=[{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}];t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(N(e)));const s=(await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:u,discriminator:"e517cb977ae3ad2a"}]})).find(I=>I.type===i.ClearSignContextType.SOLANA_INSTRUCTION_INFO);(0,t.expect)(s.payload.enumVariants).toEqual(e)}),(0,t.it)("forwards exactly the enumVariants the data source decoded \u2014 no NaN indices",async()=>{const o=l(),e={enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}};t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(N([e])));const s=(await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:u,discriminator:"e517cb977ae3ad2a"}]})).find(I=>I.type===i.ClearSignContextType.SOLANA_INSTRUCTION_INFO);(0,t.expect)(s.payload.enumVariants).toEqual([e])}),(0,t.it)("filters descriptors by requested discriminator",async()=>{const o=l(),e={programId:r,descriptors:{"00000000":(0,n.Right)(f()),"00000001":(0,n.Right)({...f(),discriminator:"00000001",instructionInfo:{data:"0001other",signature:"p"}})},enumVariants:[]};t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(e));const s=(await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r,discriminator:"00000000"}]})).filter(I=>I.type===i.ClearSignContextType.SOLANA_INSTRUCTION_INFO);(0,t.expect)(s).toHaveLength(1),(0,t.expect)(s[0].payload.discriminator).toBe("00000000")}),(0,t.it)("emits an ERROR context for a descriptor the data source could not decode",async()=>{const o=l(),e={programId:r,descriptors:{"00000000":(0,n.Left)(new Error("missing 'test' signature"))},enumVariants:[]};t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(e));const a=await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r,discriminator:"00000000"}]});(0,t.expect)(a).toHaveLength(1),(0,t.expect)(a[0]?.type).toBe(i.ClearSignContextType.ERROR),(0,t.expect)(a[0].error.message).toMatch(/missing 'test' signature/)}),(0,t.it)("emits one ERROR context when CAL fails for a program but keeps processing the others",async()=>{const o=l();t.vi.spyOn(d,"getInstructionInfo").mockImplementation(async({programId:I})=>I===r?(0,n.Right)(m()):(0,n.Left)(new Error("upstream-500")));const e=await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r,discriminator:"00000000"},{programId:u,discriminator:"e517cb977ae3ad2a"}]}),a=e.filter(I=>I.type===i.ClearSignContextType.ERROR),s=e.filter(I=>I.type===i.ClearSignContextType.SOLANA_INSTRUCTION_INFO);(0,t.expect)(a).toHaveLength(1),(0,t.expect)(s).toHaveLength(1)}),(0,t.it)("degrades every program to ERROR when certificate loading fails",async()=>{t.vi.spyOn(p,"loadCertificate").mockRejectedValue(new Error("pki-down")),t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(m()));const e=await l().load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r},{programId:u}]});(0,t.expect)(e).toHaveLength(2),(0,t.expect)(e.every(a=>a.type===i.ClearSignContextType.ERROR)).toBe(!0)}),(0,t.it)("degrades every program to ERROR when the certificate resolves undefined",async()=>{t.vi.spyOn(p,"loadCertificate").mockResolvedValue(void 0),t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(m()));const e=await l().load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r},{programId:u}]});(0,t.expect)(e).toHaveLength(2),(0,t.expect)(e.every(a=>a.type===i.ClearSignContextType.ERROR)).toBe(!0),(0,t.expect)(e[0].error.message).toMatch(/certificate is missing/)}),(0,t.it)("falls back to default network when input.network is omitted or empty string",async()=>{const o=l(),e=t.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,n.Right)(m()));await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r}]}),(0,t.expect)(e).toHaveBeenLastCalledWith({programId:r,network:"solana-mainnet"}),await o.load({deviceModelId:c.DeviceModelId.NANO_X,instructions:[{programId:r}],network:""}),(0,t.expect)(e).toHaveBeenLastCalledWith({programId:r,network:"solana-mainnet"})})})});
2
2
  //# sourceMappingURL=InstructionInfoContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport { type SolanaInstructionInfoPayload } from \"@/modules/solana/model/SolanaPayloads\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { InstructionInfoContextLoader } from \"./InstructionInfoContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = {\n keyUsageNumber: 8,\n payload: new Uint8Array([0x42]),\n};\n\nconst SYSTEM_PROGRAM = \"11111111111111111111111111111111\";\nconst JUPITER_PROGRAM = \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\";\n\n// The data source hands the loader fully-decoded core payloads.\nfunction makeSystemPayload(): SolanaInstructionInfoPayload {\n return {\n programId: SYSTEM_PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig_sys\" },\n substructures: [\n { kind: 0x00, data: \"df1\" },\n { kind: 0x00, data: \"df2\" },\n { kind: 0x01, data: \"vfp1\" },\n ],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n };\n}\n\nfunction makeSystemResult(): InstructionInfoResult {\n return {\n programId: SYSTEM_PROGRAM,\n descriptors: { \"00000000\": Right(makeSystemPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterPayload(): SolanaInstructionInfoPayload {\n return {\n programId: JUPITER_PROGRAM,\n discriminator: \"e517cb977ae3ad2a\",\n instructionInfo: { data: \"0001jup_data\", signature: \"prodsig_jup\" },\n substructures: [],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n };\n}\n\nfunction makeJupiterResult(): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: { e517cb977ae3ad2a: Right(makeJupiterPayload()) },\n enumVariants: [],\n };\n}\n\ndescribe(\"InstructionInfoContextLoader\", () => {\n let dataSource: InstructionInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getInstructionInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new InstructionInfoContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_INSTRUCTION_INFO is requested and instructions are present\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_INSTRUCTION_INFO is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on missing / empty / malformed instructions\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_INSTRUCTION_INFO];\n expect(loader.canHandle({} as any, types)).toBe(false);\n expect(loader.canHandle({ instructions: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle({ instructions: [{ programId: \"\" }] } as any, types),\n ).toBe(false);\n expect(loader.canHandle(null, types)).toBe(false);\n expect(loader.canHandle(\"string\", types)).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"fans out one CAL call per distinct programId in parallel\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockImplementation(async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n if (programId === JUPITER_PROGRAM) return Right(makeJupiterResult());\n return Left(new Error(\"unknown program\"));\n });\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" }, // dup\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n network: \"solana-mainnet\",\n });\n\n expect(spy).toHaveBeenCalledTimes(2);\n expect(spy).toHaveBeenCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n expect(spy).toHaveBeenCalledWith({\n programId: JUPITER_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n expect(\n result.every(\n (c) =>\n c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO ||\n c.type === ClearSignContextType.ERROR,\n ),\n ).toBe(true);\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ),\n ).toHaveLength(2);\n });\n\n it(\"emits one SOLANA_INSTRUCTION_INFO per matching (programId, discriminator), passing the decoded payload through with the certificate\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infoCtx).toBeDefined();\n expect(infoCtx).toMatchObject({\n type: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n certificate: mockCertificate,\n });\n // The loader does not transform \u2014 it forwards the data source's payload.\n expect((infoCtx as any).payload).toEqual(makeSystemPayload());\n });\n\n it(\"filters descriptors by requested discriminator\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Right(makeSystemPayload()),\n \"00000001\": Right({\n ...makeSystemPayload(),\n discriminator: \"00000001\",\n instructionInfo: { data: \"0001other\", signature: \"p\" },\n }),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infos).toHaveLength(1);\n expect((infos[0] as any).payload.discriminator).toBe(\"00000000\");\n });\n\n it(\"emits an ERROR context for a descriptor the data source could not decode\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Left(new Error(\"missing 'test' signature\")),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n expect(out).toHaveLength(1);\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(/missing 'test' signature/);\n });\n\n it(\"emits one ERROR context when CAL fails for a program but keeps processing the others\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockImplementation(\n async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const errors = out.filter((c) => c.type === ClearSignContextType.ERROR);\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(errors).toHaveLength(1);\n expect(infos).toHaveLength(1);\n });\n\n it(\"degrades every program to ERROR when certificate loading fails\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n });\n\n it(\"degrades every program to ERROR when the certificate resolves undefined\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n expect((out[0] as any).error.message).toMatch(/certificate is missing/);\n });\n\n it(\"falls back to default network when input.network is omitted or empty string\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeSystemResult()));\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n network: \"\",\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_ClearSignContext", "import_InstructionInfoContextLoader", "mockLoggerFactory", "mockCertificate", "SYSTEM_PROGRAM", "JUPITER_PROGRAM", "makeSystemPayload", "makeSystemResult", "makeJupiterPayload", "makeJupiterResult", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "spy", "programId", "result", "c", "infoCtx", "infos", "out", "errors"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport {\n type SolanaInstructionEnumVariant,\n type SolanaInstructionInfoPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { InstructionInfoContextLoader } from \"./InstructionInfoContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = {\n keyUsageNumber: 8,\n payload: new Uint8Array([0x42]),\n};\n\nconst SYSTEM_PROGRAM = \"11111111111111111111111111111111\";\nconst JUPITER_PROGRAM = \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\";\n\n// The data source hands the loader fully-decoded core payloads.\nfunction makeSystemPayload(): SolanaInstructionInfoPayload {\n return {\n programId: SYSTEM_PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig_sys\" },\n substructures: [\n { kind: 0x00, data: \"df1\" },\n { kind: 0x00, data: \"df2\" },\n { kind: 0x01, data: \"vfp1\" },\n ],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n };\n}\n\nfunction makeSystemResult(): InstructionInfoResult {\n return {\n programId: SYSTEM_PROGRAM,\n descriptors: { \"00000000\": Right(makeSystemPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterPayload(): SolanaInstructionInfoPayload {\n return {\n programId: JUPITER_PROGRAM,\n discriminator: \"e517cb977ae3ad2a\",\n instructionInfo: { data: \"0001jup_data\", signature: \"prodsig_jup\" },\n substructures: [],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n };\n}\n\nfunction makeJupiterResult(): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: { e517cb977ae3ad2a: Right(makeJupiterPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterRouteResult(\n enumVariants: SolanaInstructionEnumVariant[] = [],\n): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: {\n e517cb977ae3ad2a: Right({ ...makeJupiterPayload(), enumVariants }),\n },\n enumVariants,\n };\n}\n\ndescribe(\"InstructionInfoContextLoader\", () => {\n let dataSource: InstructionInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getInstructionInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new InstructionInfoContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_INSTRUCTION_INFO is requested and instructions are present\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_INSTRUCTION_INFO is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on missing / empty / malformed instructions\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_INSTRUCTION_INFO];\n expect(loader.canHandle({} as any, types)).toBe(false);\n expect(loader.canHandle({ instructions: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle({ instructions: [{ programId: \"\" }] } as any, types),\n ).toBe(false);\n expect(loader.canHandle(null, types)).toBe(false);\n expect(loader.canHandle(\"string\", types)).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"fans out one CAL call per distinct programId in parallel\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockImplementation(async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n if (programId === JUPITER_PROGRAM) return Right(makeJupiterResult());\n return Left(new Error(\"unknown program\"));\n });\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" }, // dup\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n network: \"solana-mainnet\",\n });\n\n expect(spy).toHaveBeenCalledTimes(2);\n expect(spy).toHaveBeenCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n expect(spy).toHaveBeenCalledWith({\n programId: JUPITER_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n expect(\n result.every(\n (c) =>\n c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO ||\n c.type === ClearSignContextType.ERROR,\n ),\n ).toBe(true);\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ),\n ).toHaveLength(2);\n });\n\n it(\"emits one SOLANA_INSTRUCTION_INFO per matching (programId, discriminator), passing the decoded payload through with the certificate\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infoCtx).toBeDefined();\n expect(infoCtx).toMatchObject({\n type: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n certificate: mockCertificate,\n });\n // The loader does not transform \u2014 it forwards the data source's payload.\n expect((infoCtx as any).payload).toEqual(makeSystemPayload());\n });\n\n it(\"does NOT emit SOLANA_ENUM_VARIANT contexts (those come from EnumVariantContextLoader)\", async () => {\n const loader = makeLoader();\n // Pass a pre-decoded variant to confirm the loader never emits SOLANA_ENUM_VARIANT.\n const jupiter = makeJupiterRouteResult([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(jupiter),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_ENUM_VARIANT,\n ),\n ).toHaveLength(0);\n });\n\n it(\"bundles CAL enum_variants into the SOLANA_INSTRUCTION_INFO payload (host decode cache)\", async () => {\n const loader = makeLoader();\n const expectedVariants: SolanaInstructionEnumVariant[] = [\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ];\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterRouteResult(expectedVariants)),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n\n expect((infoCtx as any).payload.enumVariants).toEqual(expectedVariants);\n });\n\n it(\"forwards exactly the enumVariants the data source decoded \u2014 no NaN indices\", async () => {\n const loader = makeLoader();\n // The data source is responsible for filtering malformed variant keys;\n // the loader forwards whatever pre-decoded variants it receives as-is.\n const validVariant: SolanaInstructionEnumVariant = {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterRouteResult([validVariant])),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n\n expect((infoCtx as any).payload.enumVariants).toEqual([validVariant]);\n });\n\n it(\"filters descriptors by requested discriminator\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Right(makeSystemPayload()),\n \"00000001\": Right({\n ...makeSystemPayload(),\n discriminator: \"00000001\",\n instructionInfo: { data: \"0001other\", signature: \"p\" },\n }),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infos).toHaveLength(1);\n expect((infos[0] as any).payload.discriminator).toBe(\"00000000\");\n });\n\n it(\"emits an ERROR context for a descriptor the data source could not decode\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Left(new Error(\"missing 'test' signature\")),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n expect(out).toHaveLength(1);\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(/missing 'test' signature/);\n });\n\n it(\"emits one ERROR context when CAL fails for a program but keeps processing the others\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockImplementation(\n async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const errors = out.filter((c) => c.type === ClearSignContextType.ERROR);\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(errors).toHaveLength(1);\n expect(infos).toHaveLength(1);\n });\n\n it(\"degrades every program to ERROR when certificate loading fails\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n });\n\n it(\"degrades every program to ERROR when the certificate resolves undefined\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n expect((out[0] as any).error.message).toMatch(/certificate is missing/);\n });\n\n it(\"falls back to default network when input.network is omitted or empty string\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeSystemResult()));\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n network: \"\",\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_ClearSignContext", "import_InstructionInfoContextLoader", "mockLoggerFactory", "mockCertificate", "SYSTEM_PROGRAM", "JUPITER_PROGRAM", "makeSystemPayload", "makeSystemResult", "makeJupiterPayload", "makeJupiterResult", "makeJupiterRouteResult", "enumVariants", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "spy", "programId", "result", "c", "infoCtx", "jupiter", "expectedVariants", "validVariant", "infos", "out", "errors"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var l=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var y=(t,o)=>{for(var n in o)l(t,n,{get:o[n],enumerable:!0})},N=(t,o,n,S)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!A.call(t,e)&&e!==n&&l(t,e,{get:()=>o[e],enumerable:!(S=T(o,e))||S.enumerable});return t};var p=t=>N(l({},"__esModule",{value:!0}),t);var s={};y(s,{SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES:()=>r,SolanaContextType:()=>i,SolanaInstructionSubstructureKind:()=>C.SolanaInstructionSubstructureKind,isSolanaContextSuccess:()=>O});module.exports=p(s);var a=require("../../../shared/model/ClearSignContext"),C=require("../../../modules/solana/model/SolanaPayloads");const i={TOKEN:a.ClearSignContextType.SOLANA_TOKEN,LIFI:a.ClearSignContextType.SOLANA_LIFI,TRUSTED_NAME:a.ClearSignContextType.SOLANA_TRUSTED_NAME,TRANSACTION_CHECK:a.ClearSignContextType.SOLANA_TRANSACTION_CHECK,INSTRUCTION_INFO:a.ClearSignContextType.SOLANA_INSTRUCTION_INFO,ENUM_VARIANT:a.ClearSignContextType.SOLANA_ENUM_VARIANT,TOKEN_INFO:a.ClearSignContextType.SOLANA_TOKEN_INFO,TOKEN_ACCOUNT_STATE:a.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,ALT_RESOLUTION:a.ClearSignContextType.SOLANA_ALT_RESOLUTION},r=new Set(Object.values(i));function O(t){return r.has(t.type)}0&&(module.exports={SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES,SolanaContextType,SolanaInstructionSubstructureKind,isSolanaContextSuccess});
1
+ "use strict";var S=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var y=(t,e)=>{for(var n in e)S(t,n,{get:e[n],enumerable:!0})},N=(t,e,n,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of A(e))!c.call(t,o)&&o!==n&&S(t,o,{get:()=>e[o],enumerable:!(l=T(e,o))||l.enumerable});return t};var p=t=>N(S({},"__esModule",{value:!0}),t);var O={};y(O,{SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES:()=>r,SolanaContextType:()=>i,SolanaInstructionSubstructureKind:()=>C.SolanaInstructionSubstructureKind,isSolanaContextSuccess:()=>_});module.exports=p(O);var a=require("../../../shared/model/ClearSignContext"),C=require("../../../modules/solana/model/SolanaPayloads");const i={TOKEN:a.ClearSignContextType.SOLANA_TOKEN,LIFI:a.ClearSignContextType.SOLANA_LIFI,TRUSTED_NAME:a.ClearSignContextType.SOLANA_TRUSTED_NAME,BASIC_TRUSTED_NAME:a.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,TRANSACTION_CHECK:a.ClearSignContextType.SOLANA_TRANSACTION_CHECK,INSTRUCTION_INFO:a.ClearSignContextType.SOLANA_INSTRUCTION_INFO,ENUM_VARIANT:a.ClearSignContextType.SOLANA_ENUM_VARIANT,TOKEN_INFO:a.ClearSignContextType.SOLANA_TOKEN_INFO,TOKEN_ACCOUNT_STATE:a.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,ALT_RESOLUTION:a.ClearSignContextType.SOLANA_ALT_RESOLUTION},r=new Set(Object.values(i));function _(t){return r.has(t.type)}0&&(module.exports={SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES,SolanaContextType,SolanaInstructionSubstructureKind,isSolanaContextSuccess});
2
2
  //# sourceMappingURL=SolanaClearSignContext.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/solana/model/SolanaClearSignContext.ts"],
4
- "sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type SolanaAltResolutionPayload,\n type SolanaEnumVariantPayload,\n type SolanaInstructionInfoPayload,\n type SolanaLifiPayload,\n type SolanaTokenAccountStatePayload,\n type SolanaTokenData,\n type SolanaTokenInfoPayload,\n type SolanaTransactionCheckPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\n// Re-export Solana payload types so consumers can import from this file\nexport type {\n SolanaAltResolutionPayload,\n SolanaCalAccountReset,\n SolanaCalDisplayField,\n SolanaCalMintAssociation,\n SolanaCalTokenValue,\n SolanaCalTypePoolEntry,\n SolanaCalValue,\n SolanaCalValueFlowPort,\n SolanaEnumVariantPayload,\n SolanaInstructionEnumVariant,\n SolanaInstructionInfoPayload,\n SolanaInstructionSubstructure,\n SolanaLifiInstructionMeta,\n SolanaLifiPayload,\n SolanaSignedDescriptor,\n SolanaTokenAccountStatePayload,\n SolanaTokenData,\n SolanaTokenInfoPayload,\n SolanaTransactionCheckPayload,\n SolanaTransactionDescriptor,\n} from \"@/modules/solana/model/SolanaPayloads\";\nexport { SolanaInstructionSubstructureKind } from \"@/modules/solana/model/SolanaPayloads\";\n\n/**\n * Solana-specific payload overrides \u2014 contributed to the shared\n * ClearSignContextSuccessPayloads map at the integration boundary.\n */\nexport type SolanaPayloadOverrides = {\n [ClearSignContextType.SOLANA_TOKEN]: {\n payload: SolanaTokenData;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_LIFI]: {\n payload: SolanaLifiPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK]: {\n payload: SolanaTransactionCheckPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO]: {\n payload: SolanaInstructionInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ENUM_VARIANT]: {\n payload: SolanaEnumVariantPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_INFO]: {\n payload: SolanaTokenInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE]: {\n payload: SolanaTokenAccountStatePayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ALT_RESOLUTION]: {\n payload: SolanaAltResolutionPayload;\n certificate?: PkiCertificate;\n };\n};\n\nexport const SolanaContextType = {\n TOKEN: ClearSignContextType.SOLANA_TOKEN,\n LIFI: ClearSignContextType.SOLANA_LIFI,\n TRUSTED_NAME: ClearSignContextType.SOLANA_TRUSTED_NAME,\n TRANSACTION_CHECK: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n INSTRUCTION_INFO: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ENUM_VARIANT: ClearSignContextType.SOLANA_ENUM_VARIANT,\n TOKEN_INFO: ClearSignContextType.SOLANA_TOKEN_INFO,\n TOKEN_ACCOUNT_STATE: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n ALT_RESOLUTION: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n} as const;\n\n/**\n * Union of all Solana-relevant success context types.\n */\nexport type SolanaClearSignContextSuccessType =\n (typeof SolanaContextType)[keyof typeof SolanaContextType];\n\n/**\n * A ClearSignContextSuccess narrowed to only Solana-relevant types.\n */\nexport type SolanaClearSignContextSuccess =\n ClearSignContextSuccess<SolanaClearSignContextSuccessType>;\n\n/**\n * Set of all Solana-relevant success ClearSignContextType values.\n * Used by the type guard below to filter out non-Solana contexts at runtime.\n */\nexport const SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES =\n new Set<ClearSignContextType>(Object.values(SolanaContextType));\n\n/**\n * Type guard that narrows a ClearSignContextSuccess to a\n * SolanaClearSignContextSuccess, filtering out non-Solana types.\n */\nexport function isSolanaContextSuccess(\n ctx: ClearSignContext,\n): ctx is SolanaClearSignContextSuccess {\n return SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES.has(ctx.type);\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6CAAAE,EAAA,sBAAAC,EAAA,qGAAAC,IAAA,eAAAC,EAAAL,GAWA,IAAAM,EAIO,2CAyBPC,EAAkD,iDA6C3C,MAAMJ,EAAoB,CAC/B,MAAO,uBAAqB,aAC5B,KAAM,uBAAqB,YAC3B,aAAc,uBAAqB,oBACnC,kBAAmB,uBAAqB,yBACxC,iBAAkB,uBAAqB,wBACvC,aAAc,uBAAqB,oBACnC,WAAY,uBAAqB,kBACjC,oBAAqB,uBAAqB,2BAC1C,eAAgB,uBAAqB,qBACvC,EAkBaD,EACX,IAAI,IAA0B,OAAO,OAAOC,CAAiB,CAAC,EAMzD,SAASC,EACdI,EACsC,CACtC,OAAON,EAAwC,IAAIM,EAAI,IAAI,CAC7D",
4
+ "sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type SolanaAltResolutionPayload,\n type SolanaEnumVariantPayload,\n type SolanaInstructionInfoPayload,\n type SolanaLifiPayload,\n type SolanaTokenAccountStatePayload,\n type SolanaTokenData,\n type SolanaTokenInfoPayload,\n type SolanaTransactionCheckPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\n// Re-export Solana payload types so consumers can import from this file\nexport type {\n SolanaAltResolutionPayload,\n SolanaCalAccountReset,\n SolanaCalDisplayField,\n SolanaCalMintAssociation,\n SolanaCalTokenValue,\n SolanaCalTypePoolEntry,\n SolanaCalValue,\n SolanaCalValueFlowPort,\n SolanaEnumVariantPayload,\n SolanaInstructionEnumVariant,\n SolanaInstructionInfoPayload,\n SolanaInstructionSubstructure,\n SolanaLifiInstructionMeta,\n SolanaLifiPayload,\n SolanaSignedDescriptor,\n SolanaTokenAccountStatePayload,\n SolanaTokenData,\n SolanaTokenInfoPayload,\n SolanaTransactionCheckPayload,\n SolanaTransactionDescriptor,\n} from \"@/modules/solana/model/SolanaPayloads\";\nexport { SolanaInstructionSubstructureKind } from \"@/modules/solana/model/SolanaPayloads\";\n\n/**\n * Solana-specific payload overrides \u2014 contributed to the shared\n * ClearSignContextSuccessPayloads map at the integration boundary.\n */\nexport type SolanaPayloadOverrides = {\n [ClearSignContextType.SOLANA_TOKEN]: {\n payload: SolanaTokenData;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_LIFI]: {\n payload: SolanaLifiPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK]: {\n payload: SolanaTransactionCheckPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO]: {\n payload: SolanaInstructionInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ENUM_VARIANT]: {\n payload: SolanaEnumVariantPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_INFO]: {\n payload: SolanaTokenInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE]: {\n payload: SolanaTokenAccountStatePayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ALT_RESOLUTION]: {\n payload: SolanaAltResolutionPayload;\n certificate?: PkiCertificate;\n };\n};\n\nexport const SolanaContextType = {\n TOKEN: ClearSignContextType.SOLANA_TOKEN,\n LIFI: ClearSignContextType.SOLANA_LIFI,\n TRUSTED_NAME: ClearSignContextType.SOLANA_TRUSTED_NAME,\n BASIC_TRUSTED_NAME: ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n TRANSACTION_CHECK: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n INSTRUCTION_INFO: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ENUM_VARIANT: ClearSignContextType.SOLANA_ENUM_VARIANT,\n TOKEN_INFO: ClearSignContextType.SOLANA_TOKEN_INFO,\n TOKEN_ACCOUNT_STATE: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n ALT_RESOLUTION: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n} as const;\n\n/**\n * Union of all Solana-relevant success context types.\n */\nexport type SolanaClearSignContextSuccessType =\n (typeof SolanaContextType)[keyof typeof SolanaContextType];\n\n/**\n * A ClearSignContextSuccess narrowed to only Solana-relevant types.\n */\nexport type SolanaClearSignContextSuccess =\n ClearSignContextSuccess<SolanaClearSignContextSuccessType>;\n\n/**\n * Set of all Solana-relevant success ClearSignContextType values.\n * Used by the type guard below to filter out non-Solana contexts at runtime.\n */\nexport const SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES =\n new Set<ClearSignContextType>(Object.values(SolanaContextType));\n\n/**\n * Type guard that narrows a ClearSignContextSuccess to a\n * SolanaClearSignContextSuccess, filtering out non-Solana types.\n */\nexport function isSolanaContextSuccess(\n ctx: ClearSignContext,\n): ctx is SolanaClearSignContextSuccess {\n return SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES.has(ctx.type);\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6CAAAE,EAAA,sBAAAC,EAAA,qGAAAC,IAAA,eAAAC,EAAAL,GAWA,IAAAM,EAIO,2CAyBPC,EAAkD,iDAiD3C,MAAMJ,EAAoB,CAC/B,MAAO,uBAAqB,aAC5B,KAAM,uBAAqB,YAC3B,aAAc,uBAAqB,oBACnC,mBAAoB,uBAAqB,0BACzC,kBAAmB,uBAAqB,yBACxC,iBAAkB,uBAAqB,wBACvC,aAAc,uBAAqB,oBACnC,WAAY,uBAAqB,kBACjC,oBAAqB,uBAAqB,2BAC1C,eAAgB,uBAAqB,qBACvC,EAkBaD,EACX,IAAI,IAA0B,OAAO,OAAOC,CAAiB,CAAC,EAMzD,SAASC,EACdI,EACsC,CACtC,OAAON,EAAwC,IAAIM,EAAI,IAAI,CAC7D",
6
6
  "names": ["SolanaClearSignContext_exports", "__export", "SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES", "SolanaContextType", "isSolanaContextSuccess", "__toCommonJS", "import_ClearSignContext", "import_SolanaPayloads", "ctx"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/solana/model/SolanaContextTypes.ts"],
4
- "sourcesContent": ["import { type SolanaTransactionDescriptor } from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContextError,\n type ClearSignContextSuccess,\n type ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nexport type SolanaTransactionDescriptorRaw = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signatures: {\n prod?: string;\n test?: string;\n };\n};\n\nexport type SolanaLifiDescriptorEntry = {\n program_id: string;\n discriminator_hex?: string;\n descriptor: SolanaTransactionDescriptorRaw;\n};\n\nexport type GetTransactionDescriptorsResponse = {\n id: string;\n chain_id: number;\n instructions: Array<{\n program_id: string;\n discriminator?: number;\n discriminator_hex?: string;\n }>;\n descriptors: SolanaLifiDescriptorEntry[];\n};\n\nexport type SolanaTransactionDescriptorList = Record<\n string,\n SolanaTransactionDescriptor\n>;\n\n// The signer registry (`provideContextRegistry.ts`) uses a required mapped\n// type over this union, so every member listed here MUST have a matching\n// provide handler in the signer. The generic clear-signing types below are\n// declared together with their handlers\nexport type SolanaContextSuccessType =\n | ClearSignContextType.SOLANA_TOKEN\n | ClearSignContextType.SOLANA_LIFI\n | ClearSignContextType.SOLANA_TRANSACTION_CHECK\n | ClearSignContextType.SOLANA_INSTRUCTION_INFO\n | ClearSignContextType.SOLANA_ENUM_VARIANT\n | ClearSignContextType.SOLANA_TOKEN_INFO\n | ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE\n | ClearSignContextType.SOLANA_ALT_RESOLUTION\n | ClearSignContextType.SOLANA_TRUSTED_NAME;\n\nexport type SolanaContextSuccess<\n T extends SolanaContextSuccessType = SolanaContextSuccessType,\n> = ClearSignContextSuccess<T>;\n\nexport type SolanaContextError = ClearSignContextError;\n\nexport type SolanaContext = SolanaContextSuccess | SolanaContextError;\n\nexport type SolanaTokenContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TOKEN>;\n\nexport type SolanaLifiContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_LIFI>;\n\nexport type SolanaTransactionCheckContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TRANSACTION_CHECK>;\n\nexport type SolanaInstructionInfoContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_INSTRUCTION_INFO>;\n\nexport type SolanaEnumVariantContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_ENUM_VARIANT>;\n\nexport type SolanaTokenInfoContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TOKEN_INFO>;\n\nexport type SolanaTokenAccountStateContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE>;\n\nexport type SolanaAltResolutionContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_ALT_RESOLUTION>;\n\nexport type SolanaTrustedNameContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TRUSTED_NAME>;\n\nexport type SolanaTokenContextResult =\n | SolanaTokenContextSuccess\n | SolanaContextError;\n\nexport type SolanaLifiContextResult =\n | SolanaLifiContextSuccess\n | SolanaContextError;\n\nexport type SolanaTransactionCheckContextResult =\n | SolanaTransactionCheckContextSuccess\n | SolanaContextError;\n\nexport type LoaderResult =\n | SolanaTokenContextResult\n | SolanaLifiContextResult\n | SolanaTransactionCheckContextResult;\n"],
4
+ "sourcesContent": ["import { type SolanaTransactionDescriptor } from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContextError,\n type ClearSignContextSuccess,\n type ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nexport type SolanaTransactionDescriptorRaw = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signatures: {\n prod?: string;\n test?: string;\n };\n};\n\nexport type SolanaLifiDescriptorEntry = {\n program_id: string;\n discriminator_hex?: string;\n descriptor: SolanaTransactionDescriptorRaw;\n};\n\nexport type GetTransactionDescriptorsResponse = {\n id: string;\n chain_id: number;\n instructions: Array<{\n program_id: string;\n discriminator?: number;\n discriminator_hex?: string;\n }>;\n descriptors: SolanaLifiDescriptorEntry[];\n};\n\nexport type SolanaTransactionDescriptorList = Record<\n string,\n SolanaTransactionDescriptor\n>;\n\n// The signer registry (`provideContextRegistry.ts`) uses a required mapped\n// type over this union, so every member listed here MUST have a matching\n// provide handler in the signer. The generic clear-signing types below are\n// declared together with their handlers\nexport type SolanaContextSuccessType =\n | ClearSignContextType.SOLANA_TOKEN\n | ClearSignContextType.SOLANA_LIFI\n | ClearSignContextType.SOLANA_TRANSACTION_CHECK\n | ClearSignContextType.SOLANA_INSTRUCTION_INFO\n | ClearSignContextType.SOLANA_ENUM_VARIANT\n | ClearSignContextType.SOLANA_TOKEN_INFO\n | ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE\n | ClearSignContextType.SOLANA_ALT_RESOLUTION\n | ClearSignContextType.SOLANA_TRUSTED_NAME\n | ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME;\n\nexport type SolanaContextSuccess<\n T extends SolanaContextSuccessType = SolanaContextSuccessType,\n> = ClearSignContextSuccess<T>;\n\nexport type SolanaContextError = ClearSignContextError;\n\nexport type SolanaContext = SolanaContextSuccess | SolanaContextError;\n\nexport type SolanaTokenContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TOKEN>;\n\nexport type SolanaLifiContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_LIFI>;\n\nexport type SolanaTransactionCheckContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TRANSACTION_CHECK>;\n\nexport type SolanaInstructionInfoContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_INSTRUCTION_INFO>;\n\nexport type SolanaEnumVariantContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_ENUM_VARIANT>;\n\nexport type SolanaTokenInfoContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TOKEN_INFO>;\n\nexport type SolanaTokenAccountStateContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE>;\n\nexport type SolanaAltResolutionContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_ALT_RESOLUTION>;\n\nexport type SolanaTrustedNameContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_TRUSTED_NAME>;\n\nexport type SolanaBasicTrustedNameContextSuccess =\n ClearSignContextSuccess<ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME>;\n\nexport type SolanaTokenContextResult =\n | SolanaTokenContextSuccess\n | SolanaContextError;\n\nexport type SolanaLifiContextResult =\n | SolanaLifiContextSuccess\n | SolanaContextError;\n\nexport type SolanaTransactionCheckContextResult =\n | SolanaTransactionCheckContextSuccess\n | SolanaContextError;\n\nexport type LoaderResult =\n | SolanaTokenContextResult\n | SolanaLifiContextResult\n | SolanaTransactionCheckContextResult;\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["SolanaContextTypes_exports", "__toCommonJS"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/solana/model/SolanaPayloads.ts"],
4
- "sourcesContent": ["// Solana payload types \u2014 used both by Solana loaders and (type-only)\n// referenced by the shared ClearSignContext union for typed-payload variants.\n\nexport type SolanaTokenData = {\n solanaTokenDescriptor: {\n data: string;\n signature: string;\n };\n};\n\nexport type SolanaTransactionDescriptor = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signature: string;\n};\n\nexport type SolanaLifiInstructionMeta = {\n program_id: string;\n discriminator_hex?: string;\n};\n\nexport type SolanaLifiPayload = {\n descriptors: Record<string, SolanaTransactionDescriptor>;\n instructions: SolanaLifiInstructionMeta[];\n};\n\nexport type SolanaTransactionCheckPayload = {\n descriptor: string;\n};\n\n// --- Generic clear-signing payloads ---\n\n// CAL static descriptor payloads. `data` is the signed TLV (hex string);\n// `signature` is the resolved signature for the configured CAL signature\n// kind (`prod` | `test`).\n\nexport type SolanaSignedDescriptor = {\n data: string;\n signature: string;\n};\n\n/**\n * One enum-variant descriptor bundled with an instruction descriptor by CAL.\n * The signed TLV (`descriptor.data`) feeds the host-side type-pool decode\n * cache, `enumId`/`variantIndex` identify which variant it describes (and let\n * the host stream the selected variant's signed descriptor to the device).\n */\nexport type SolanaInstructionEnumVariant = {\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_INSTRUCTION_INFO.\n *\n * `instructionInfo` + `substructures` are the signed TLVs streamed to the\n * device, and `enumVariants` are the signed enum-variant descriptors CAL\n * bundles for the program's enums (used to build the host decode cache). The\n * remaining fields are CAL's decoded JSON consumed host-side by the\n * requirement builder.\n */\nexport type SolanaInstructionInfoPayload = {\n programId: string;\n discriminator: string;\n instructionInfo: SolanaSignedDescriptor;\n substructures: SolanaInstructionSubstructure[];\n enumVariants: SolanaInstructionEnumVariant[];\n idlDescriptor: {\n typePool: SolanaCalTypePoolEntry[];\n rootType: number;\n };\n mintAssociations: SolanaCalMintAssociation[];\n valueFlowPorts: SolanaCalValueFlowPort[];\n accountResets: SolanaCalAccountReset[];\n displayFields: SolanaCalDisplayField[];\n};\n\nexport enum SolanaInstructionSubstructureKind {\n DISPLAY_FIELD = 0x00,\n VALUE_FLOW_PORT = 0x01,\n HIDE_RULE = 0x02,\n ACCOUNT_RESET = 0x03,\n}\n\nexport type SolanaInstructionSubstructure = {\n kind: SolanaInstructionSubstructureKind;\n // TLV payload (hex string) for the substructure.\n data: string;\n};\n\n// --- Decoded CAL JSON (snake_case mirrors the CAL response) ---\n\nexport type SolanaCalValue = {\n source: string;\n /** ACCOUNT_PATH: index into the instruction's accounts. */\n account_index?: number;\n /** CONSTANT: hex-encoded bytes. */\n data?: string;\n /** ARGUMENT_PATH: decoded steps. */\n path?: { steps: number[] };\n};\n\nexport type SolanaCalTokenValue = {\n kind: string;\n value?: SolanaCalValue;\n account_index?: number;\n};\n\nexport type SolanaCalValueFlowPort = {\n /** Ordered candidate list (spec form). */\n account_indices?: number[];\n /** Single-account form currently emitted by CAL; treated as a 1-element list. */\n account_index?: number;\n optional_account_strategy?: string;\n token_value?: SolanaCalTokenValue;\n};\n\nexport type SolanaCalAccountReset = {\n account_index: number;\n require_pre_balance_zero?: boolean;\n};\n\nexport type SolanaCalDisplayField = {\n name?: string;\n param: { type: string; value?: SolanaCalValue; token?: SolanaCalValue };\n};\n\nexport type SolanaCalTypePoolEntry = {\n index: number;\n kind: string;\n refs?: number[];\n size?: number;\n encoding?: number;\n len_kind?: string;\n flag_kind?: string;\n sentinel?: string;\n disc_kind?: string;\n total_variants?: number;\n enum_id?: string;\n};\n\nexport type SolanaCalMintAssociation = {\n account_index: number;\n mint_index: number;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_ENUM_VARIANT: one signed\n * ENUM_VARIANT descriptor for a `(programId, enumId, variantIndex)` triple.\n */\nexport type SolanaEnumVariantPayload = {\n programId: string;\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_TOKEN_INFO, keyed by mint pubkey.\n * Distinct from the legacy SOLANA_TOKEN context.\n */\nexport type SolanaTokenInfoPayload = {\n mint: string;\n descriptor: SolanaSignedDescriptor;\n};\n\n// --- Dynamic descriptor payloads (challenge-bound) ---\n//\n// Each payload carries the raw signed TLV bytes decoded from the backend's\n// hex `signedDescriptor`.\n\nexport type SolanaTokenAccountStatePayload = {\n descriptor: Uint8Array;\n};\n\nexport type SolanaAltResolutionPayload = {\n descriptor: Uint8Array;\n};\n\n// SOLANA_TRUSTED_NAME already exists with `payload: Uint8Array`, emitted by\n// both OwnerInfoContextLoader and SolanaTrustedNameContextLoader.\n"],
4
+ "sourcesContent": ["// Solana payload types \u2014 used both by Solana loaders and (type-only)\n// referenced by the shared ClearSignContext union for typed-payload variants.\n\nexport type SolanaTokenData = {\n solanaTokenDescriptor: {\n data: string;\n signature: string;\n };\n};\n\nexport type SolanaTransactionDescriptor = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signature: string;\n};\n\nexport type SolanaLifiInstructionMeta = {\n program_id: string;\n discriminator_hex?: string;\n};\n\nexport type SolanaLifiPayload = {\n descriptors: Record<string, SolanaTransactionDescriptor>;\n instructions: SolanaLifiInstructionMeta[];\n};\n\nexport type SolanaTransactionCheckPayload = {\n descriptor: string;\n};\n\n// --- Generic clear-signing payloads ---\n\n// CAL static descriptor payloads. `data` is the signed TLV (hex string);\n// `signature` is the resolved signature for the configured CAL signature\n// kind (`prod` | `test`).\n\nexport type SolanaSignedDescriptor = {\n data: string;\n signature: string;\n};\n\n/**\n * One enum-variant descriptor bundled with an instruction descriptor by CAL.\n * The signed TLV (`descriptor.data`) feeds the host-side type-pool decode\n * cache, `enumId`/`variantIndex` identify which variant it describes (and let\n * the host stream the selected variant's signed descriptor to the device).\n */\nexport type SolanaInstructionEnumVariant = {\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_INSTRUCTION_INFO.\n *\n * `instructionInfo` + `substructures` are the signed TLVs streamed to the\n * device, and `enumVariants` are the signed enum-variant descriptors CAL\n * bundles for the program's enums (used to build the host decode cache). The\n * remaining fields are CAL's decoded JSON consumed host-side by the\n * requirement builder.\n */\nexport type SolanaInstructionInfoPayload = {\n programId: string;\n discriminator: string;\n instructionInfo: SolanaSignedDescriptor;\n substructures: SolanaInstructionSubstructure[];\n enumVariants: SolanaInstructionEnumVariant[];\n idlDescriptor: {\n typePool: SolanaCalTypePoolEntry[];\n rootType: number;\n };\n mintAssociations: SolanaCalMintAssociation[];\n valueFlowPorts: SolanaCalValueFlowPort[];\n accountResets: SolanaCalAccountReset[];\n displayFields: SolanaCalDisplayField[];\n};\n\nexport enum SolanaInstructionSubstructureKind {\n DISPLAY_FIELD = 0x00,\n VALUE_FLOW_PORT = 0x01,\n HIDE_RULE = 0x02,\n ACCOUNT_RESET = 0x03,\n}\n\nexport type SolanaInstructionSubstructure = {\n kind: SolanaInstructionSubstructureKind;\n // TLV payload (hex string) for the substructure.\n data: string;\n};\n\n// --- Decoded CAL JSON (snake_case mirrors the CAL response) ---\n\nexport type SolanaCalValue = {\n source: string;\n /** ACCOUNT_PATH: index into the instruction's accounts. */\n account_index?: number;\n /** CONSTANT: hex-encoded bytes. */\n data?: string;\n /** ARGUMENT_PATH: decoded steps. */\n path?: { steps: number[] };\n};\n\nexport type SolanaCalTokenValue = {\n kind: string;\n value?: SolanaCalValue;\n account_index?: number;\n};\n\nexport type SolanaCalValueFlowPort = {\n /** Ordered candidate list (spec form). */\n account_indices?: number[];\n /** Single-account form currently emitted by CAL; treated as a 1-element list. */\n account_index?: number;\n optional_account_strategy?: string;\n token_value?: SolanaCalTokenValue;\n};\n\nexport type SolanaCalAccountReset = {\n account_index: number;\n require_pre_balance_zero?: boolean;\n};\n\nexport type SolanaCalDisplayField = {\n name?: string;\n param: { type: string; value?: SolanaCalValue; token?: SolanaCalValue };\n};\n\nexport type SolanaCalTypePoolEntry = {\n index: number;\n kind: string;\n refs?: number[];\n size?: number;\n encoding?: number;\n len_kind?: string;\n flag_kind?: string;\n sentinel?: string;\n disc_kind?: string;\n total_variants?: number;\n enum_id?: string;\n};\n\nexport type SolanaCalMintAssociation = {\n account_index: number;\n mint_index: number;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_ENUM_VARIANT: one signed\n * ENUM_VARIANT descriptor for a `(programId, enumId, variantIndex)` triple.\n */\nexport type SolanaEnumVariantPayload = {\n programId: string;\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_TOKEN_INFO, keyed by mint pubkey.\n * Distinct from the legacy SOLANA_TOKEN context.\n */\nexport type SolanaTokenInfoPayload = {\n mint: string;\n descriptor: SolanaSignedDescriptor;\n};\n\n// --- Dynamic descriptor payloads (challenge-bound) ---\n//\n// Each payload carries the raw signed TLV bytes decoded from the backend's\n// hex `signedDescriptor`.\n\nexport type SolanaTokenAccountStatePayload = {\n descriptor: Uint8Array;\n};\n\nexport type SolanaAltResolutionPayload = {\n descriptor: Uint8Array;\n};\n\n// SOLANA_TRUSTED_NAME (generic flow, with 2-byte length prefix) is emitted by\n// SolanaTrustedNameContextLoader. SOLANA_BASIC_TRUSTED_NAME (basic flow, raw\n// bytes) is emitted by OwnerInfoContextLoader. Both carry `payload: Uint8Array`.\n"],
5
5
  "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uCAAAE,IAAA,eAAAC,EAAAH,GA+EO,IAAKE,OACVA,IAAA,cAAgB,GAAhB,gBACAA,IAAA,gBAAkB,GAAlB,kBACAA,IAAA,UAAY,GAAZ,YACAA,IAAA,cAAgB,GAAhB,gBAJUA,OAAA",
6
6
  "names": ["SolanaPayloads_exports", "__export", "SolanaInstructionSubstructureKind", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var V=(e,E)=>{for(var p in E)u(e,p,{get:E[p],enumerable:!0})},b=(e,E,p,N)=>{if(E&&typeof E=="object"||typeof E=="function")for(let m of D(E))!M.call(e,m)&&m!==p&&u(e,m,{get:()=>E[m],enumerable:!(N=A(E,m))||N.enumerable});return e};var f=e=>b(u({},"__esModule",{value:!0}),e);var g={};V(g,{SolanaTransactionScanChainId:()=>x});module.exports=f(g);var x=(N=>(N[N.MAINNET=1]="MAINNET",N[N.DEVNET=2]="DEVNET",N[N.TESTNET=3]="TESTNET",N))(x||{});0&&(module.exports={SolanaTransactionScanChainId});
1
+ "use strict";var u=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var V=(e,E)=>{for(var p in E)u(e,p,{get:E[p],enumerable:!0})},b=(e,E,p,N)=>{if(E&&typeof E=="object"||typeof E=="function")for(let m of D(E))!M.call(e,m)&&m!==p&&u(e,m,{get:()=>E[m],enumerable:!(N=A(E,m))||N.enumerable});return e};var f=e=>b(u({},"__esModule",{value:!0}),e);var g={};V(g,{SolanaTransactionScanChainId:()=>x});module.exports=f(g);var x=(N=>(N[N.MAINNET=900]="MAINNET",N[N.DEVNET=901]="DEVNET",N[N.TESTNET=902]="TESTNET",N))(x||{});0&&(module.exports={SolanaTransactionScanChainId});
2
2
  //# sourceMappingURL=SolanaTransactionScanChainId.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/solana/model/SolanaTransactionScanChainId.ts"],
4
- "sourcesContent": ["/**\n * Web3Checks scan chain identifiers for Solana clusters.\n * Mirrors the backend contract for the `chain` field on Solana scan requests.\n */\nexport enum SolanaTransactionScanChainId {\n MAINNET = 1,\n DEVNET = 2,\n TESTNET = 3,\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kCAAAE,IAAA,eAAAC,EAAAH,GAIO,IAAKE,OACVA,IAAA,QAAU,GAAV,UACAA,IAAA,OAAS,GAAT,SACAA,IAAA,QAAU,GAAV,UAHUA,OAAA",
4
+ "sourcesContent": ["/**\n * Transaction-check scan chain identifiers for Solana clusters.\n * Mirrors the backend contract for the `chain` field on Solana scan requests:\n * the extended network ids (900/901/902) introduced in the latest spec.\n */\nexport enum SolanaTransactionScanChainId {\n MAINNET = 900,\n DEVNET = 901,\n TESTNET = 902,\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kCAAAE,IAAA,eAAAC,EAAAH,GAKO,IAAKE,OACVA,IAAA,QAAU,KAAV,UACAA,IAAA,OAAS,KAAT,SACAA,IAAA,QAAU,KAAV,UAHUA,OAAA",
6
6
  "names": ["SolanaTransactionScanChainId_exports", "__export", "SolanaTransactionScanChainId", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var l=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var x=(a,e)=>{for(var o in e)l(a,o,{get:e[o],enumerable:!0})},L=(a,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of y(e))!T.call(a,r)&&r!==o&&l(a,r,{get:()=>e[r],enumerable:!(t=d(e,r))||t.enumerable});return a};var P=a=>L(l({},"__esModule",{value:!0}),a),g=(a,e,o,t)=>{for(var r=t>1?void 0:t?d(e,o):e,i=a.length-1,p;i>=0;i--)(p=a[i])&&(r=(t?p(e,o,r):p(r))||r);return t&&r&&l(e,o,r),r},f=(a,e)=>(o,t)=>e(o,t,a);var _={};x(_,{OwnerInfoContextLoader:()=>c});module.exports=P(_);var n=require("inversify"),m=require("../../../../config/di/configTypes"),u=require("../../../../modules/multichain/pki/di/pkiTypes"),C=require("../../../../modules/multichain/pki/model/KeyUsage"),S=require("../../../../modules/solana/owner-info/di/ownerInfoTypes"),s=require("../../../../shared/model/ClearSignContext");const E=[s.ClearSignContextType.SOLANA_TRUSTED_NAME];let c=class{constructor(e,o,t){this._dataSource=e;this._certificateLoader=o;this.logger=t("OwnerInfoContextLoader")}logger;canHandle(e,o){if(!E.every(r=>o.includes(r))||typeof e!="object"||e===null)return!1;const t=e;return!!(t.tokenAddress||t.createATA)}async load(e){this.logger.debug("[load] Loading solana owner info context",{data:{input:e}});const{deviceModelId:o}=e,t=await this._certificateLoader.loadCertificate({keyId:"domain_metadata_key",keyUsage:C.KeyUsage.TrustedName,targetDevice:o});return t?(await this._dataSource.getOwnerInfo(e)).caseOf({Left:i=>[{type:s.ClearSignContextType.ERROR,error:i}],Right:({tlvDescriptor:i})=>i!==void 0?[{type:s.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:i,certificate:t}]:[]}):[{type:s.ClearSignContextType.ERROR,error:new Error("[ContextModule] OwnerInfoContextLoader: trustedNamePKICertificate is missing")}]}};c=g([(0,n.injectable)(),f(0,(0,n.inject)(S.ownerInfoTypes.OwnerInfoDataSource)),f(1,(0,n.inject)(u.pkiTypes.PkiCertificateLoader)),f(2,(0,n.inject)(m.configTypes.ContextModuleLoggerFactory))],c);0&&(module.exports={OwnerInfoContextLoader});
1
+ "use strict";var l=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var x=(a,e)=>{for(var o in e)l(a,o,{get:e[o],enumerable:!0})},L=(a,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of y(e))!T.call(a,r)&&r!==o&&l(a,r,{get:()=>e[r],enumerable:!(t=d(e,r))||t.enumerable});return a};var P=a=>L(l({},"__esModule",{value:!0}),a),g=(a,e,o,t)=>{for(var r=t>1?void 0:t?d(e,o):e,i=a.length-1,p;i>=0;i--)(p=a[i])&&(r=(t?p(e,o,r):p(r))||r);return t&&r&&l(e,o,r),r},f=(a,e)=>(o,t)=>e(o,t,a);var A={};x(A,{OwnerInfoContextLoader:()=>c});module.exports=P(A);var n=require("inversify"),m=require("../../../../config/di/configTypes"),u=require("../../../../modules/multichain/pki/di/pkiTypes"),C=require("../../../../modules/multichain/pki/model/KeyUsage"),S=require("../../../../modules/solana/owner-info/di/ownerInfoTypes"),s=require("../../../../shared/model/ClearSignContext");const _=[s.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME];let c=class{constructor(e,o,t){this._dataSource=e;this._certificateLoader=o;this.logger=t("OwnerInfoContextLoader")}logger;canHandle(e,o){if(!_.every(r=>o.includes(r))||typeof e!="object"||e===null)return!1;const t=e;return!!(t.tokenAddress||t.createATA)}async load(e){this.logger.debug("[load] Loading solana owner info context",{data:{input:e}});const{deviceModelId:o}=e,t=await this._certificateLoader.loadCertificate({keyId:"domain_metadata_key",keyUsage:C.KeyUsage.TrustedName,targetDevice:o});return t?(await this._dataSource.getOwnerInfo(e)).caseOf({Left:i=>[{type:s.ClearSignContextType.ERROR,error:i}],Right:({tlvDescriptor:i})=>i!==void 0?[{type:s.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,payload:i,certificate:t}]:[]}):[{type:s.ClearSignContextType.ERROR,error:new Error("[ContextModule] OwnerInfoContextLoader: trustedNamePKICertificate is missing")}]}};c=g([(0,n.injectable)(),f(0,(0,n.inject)(S.ownerInfoTypes.OwnerInfoDataSource)),f(1,(0,n.inject)(u.pkiTypes.PkiCertificateLoader)),f(2,(0,n.inject)(m.configTypes.ContextModuleLoggerFactory))],c);0&&(module.exports={OwnerInfoContextLoader});
2
2
  //# sourceMappingURL=OwnerInfoContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/owner-info/domain/OwnerInfoContextLoader.ts"],
4
- "sourcesContent": ["import { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type SolanaTransactionContext } from \"@/modules/solana/model/SolanaTransactionContext\";\nimport { type OwnerInfoDataSource } from \"@/modules/solana/owner-info/data/OwnerInfoDataSource\";\nimport { ownerInfoTypes } from \"@/modules/solana/owner-info/di/ownerInfoTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRUSTED_NAME,\n];\n\n@injectable()\nexport class OwnerInfoContextLoader\n implements ContextLoader<SolanaTransactionContext>\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(ownerInfoTypes.OwnerInfoDataSource)\n private readonly _dataSource: OwnerInfoDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"OwnerInfoContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTransactionContext {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) {\n return false;\n }\n if (typeof input !== \"object\" || input === null) {\n return false;\n }\n const ctx = input as Partial<SolanaTransactionContext>;\n return !!(ctx.tokenAddress || ctx.createATA);\n }\n\n public async load(\n solanaContext: SolanaTransactionContext,\n ): Promise<ClearSignContext[]> {\n this.logger.debug(\"[load] Loading solana owner info context\", {\n data: { input: solanaContext },\n });\n\n const { deviceModelId } = solanaContext;\n\n const trustedNamePKICertificate =\n await this._certificateLoader.loadCertificate({\n keyId: \"domain_metadata_key\",\n keyUsage: KeyUsage.TrustedName,\n targetDevice: deviceModelId,\n });\n\n if (!trustedNamePKICertificate) {\n return [\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\n \"[ContextModule] OwnerInfoContextLoader: trustedNamePKICertificate is missing\",\n ),\n },\n ];\n }\n\n const tlvDescriptorEither =\n await this._dataSource.getOwnerInfo(solanaContext);\n\n return tlvDescriptorEither.caseOf({\n Left: (error): ClearSignContext[] => [\n { type: ClearSignContextType.ERROR, error },\n ],\n Right: ({ tlvDescriptor }): ClearSignContext[] => {\n if (tlvDescriptor !== undefined) {\n return [\n {\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: tlvDescriptor,\n certificate: trustedNamePKICertificate,\n },\n ];\n }\n return [];\n },\n });\n }\n}\n"],
5
- "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBAEnCC,EAA4B,mCAC5BC,EAAyB,gDAEzBC,EAAyB,mDAGzBC,EAA+B,yDAE/BC,EAGO,2CAEP,MAAMC,EAA0C,CAC9C,uBAAqB,mBACvB,EAGO,IAAMC,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,iBAAAF,EAEA,wBAAAC,EAIjB,KAAK,OAASC,EAAc,wBAAwB,CACtD,CAXQ,OAaD,UACLC,EACAC,EACmC,CAInC,GAHI,CAACN,EAAgB,MAAOO,GAAMD,EAAc,SAASC,CAAC,CAAC,GAGvD,OAAOF,GAAU,UAAYA,IAAU,KACzC,MAAO,GAET,MAAMG,EAAMH,EACZ,MAAO,CAAC,EAAEG,EAAI,cAAgBA,EAAI,UACpC,CAEA,MAAa,KACXC,EAC6B,CAC7B,KAAK,OAAO,MAAM,2CAA4C,CAC5D,KAAM,CAAE,MAAOA,CAAc,CAC/B,CAAC,EAED,KAAM,CAAE,cAAAC,CAAc,EAAID,EAEpBE,EACJ,MAAM,KAAK,mBAAmB,gBAAgB,CAC5C,MAAO,sBACP,SAAU,WAAS,YACnB,aAAcD,CAChB,CAAC,EAEH,OAAKC,GAYH,MAAM,KAAK,YAAY,aAAaF,CAAa,GAExB,OAAO,CAChC,KAAOG,GAA8B,CACnC,CAAE,KAAM,uBAAqB,MAAO,MAAAA,CAAM,CAC5C,EACA,MAAO,CAAC,CAAE,cAAAC,CAAc,IAClBA,IAAkB,OACb,CACL,CACE,KAAM,uBAAqB,oBAC3B,QAASA,EACT,YAAaF,CACf,CACF,EAEK,CAAC,CAEZ,CAAC,EA7BQ,CACL,CACE,KAAM,uBAAqB,MAC3B,MAAO,IAAI,MACT,8EACF,CACF,CACF,CAuBJ,CACF,EA9EaV,EAANa,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,iBAAe,mBAAmB,GAEzCA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCd",
4
+ "sourcesContent": ["import { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type SolanaTransactionContext } from \"@/modules/solana/model/SolanaTransactionContext\";\nimport { type OwnerInfoDataSource } from \"@/modules/solana/owner-info/data/OwnerInfoDataSource\";\nimport { ownerInfoTypes } from \"@/modules/solana/owner-info/di/ownerInfoTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n];\n\n@injectable()\nexport class OwnerInfoContextLoader\n implements ContextLoader<SolanaTransactionContext>\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(ownerInfoTypes.OwnerInfoDataSource)\n private readonly _dataSource: OwnerInfoDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"OwnerInfoContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTransactionContext {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) {\n return false;\n }\n if (typeof input !== \"object\" || input === null) {\n return false;\n }\n const ctx = input as Partial<SolanaTransactionContext>;\n return !!(ctx.tokenAddress || ctx.createATA);\n }\n\n public async load(\n solanaContext: SolanaTransactionContext,\n ): Promise<ClearSignContext[]> {\n this.logger.debug(\"[load] Loading solana owner info context\", {\n data: { input: solanaContext },\n });\n\n const { deviceModelId } = solanaContext;\n\n const trustedNamePKICertificate =\n await this._certificateLoader.loadCertificate({\n keyId: \"domain_metadata_key\",\n keyUsage: KeyUsage.TrustedName,\n targetDevice: deviceModelId,\n });\n\n if (!trustedNamePKICertificate) {\n return [\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\n \"[ContextModule] OwnerInfoContextLoader: trustedNamePKICertificate is missing\",\n ),\n },\n ];\n }\n\n const tlvDescriptorEither =\n await this._dataSource.getOwnerInfo(solanaContext);\n\n return tlvDescriptorEither.caseOf({\n Left: (error): ClearSignContext[] => [\n { type: ClearSignContextType.ERROR, error },\n ],\n Right: ({ tlvDescriptor }): ClearSignContext[] => {\n if (tlvDescriptor !== undefined) {\n return [\n {\n type: ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n payload: tlvDescriptor,\n certificate: trustedNamePKICertificate,\n },\n ];\n }\n return [];\n },\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBAEnCC,EAA4B,mCAC5BC,EAAyB,gDAEzBC,EAAyB,mDAGzBC,EAA+B,yDAE/BC,EAGO,2CAEP,MAAMC,EAA0C,CAC9C,uBAAqB,yBACvB,EAGO,IAAMC,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,iBAAAF,EAEA,wBAAAC,EAIjB,KAAK,OAASC,EAAc,wBAAwB,CACtD,CAXQ,OAaD,UACLC,EACAC,EACmC,CAInC,GAHI,CAACN,EAAgB,MAAOO,GAAMD,EAAc,SAASC,CAAC,CAAC,GAGvD,OAAOF,GAAU,UAAYA,IAAU,KACzC,MAAO,GAET,MAAMG,EAAMH,EACZ,MAAO,CAAC,EAAEG,EAAI,cAAgBA,EAAI,UACpC,CAEA,MAAa,KACXC,EAC6B,CAC7B,KAAK,OAAO,MAAM,2CAA4C,CAC5D,KAAM,CAAE,MAAOA,CAAc,CAC/B,CAAC,EAED,KAAM,CAAE,cAAAC,CAAc,EAAID,EAEpBE,EACJ,MAAM,KAAK,mBAAmB,gBAAgB,CAC5C,MAAO,sBACP,SAAU,WAAS,YACnB,aAAcD,CAChB,CAAC,EAEH,OAAKC,GAYH,MAAM,KAAK,YAAY,aAAaF,CAAa,GAExB,OAAO,CAChC,KAAOG,GAA8B,CACnC,CAAE,KAAM,uBAAqB,MAAO,MAAAA,CAAM,CAC5C,EACA,MAAO,CAAC,CAAE,cAAAC,CAAc,IAClBA,IAAkB,OACb,CACL,CACE,KAAM,uBAAqB,0BAC3B,QAASA,EACT,YAAaF,CACf,CACF,EAEK,CAAC,CAEZ,CAAC,EA7BQ,CACL,CACE,KAAM,uBAAqB,MAC3B,MAAO,IAAI,MACT,8EACF,CACF,CACF,CAuBJ,CACF,EA9EaV,EAANa,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,iBAAe,mBAAmB,GAEzCA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCd",
6
6
  "names": ["OwnerInfoContextLoader_exports", "__export", "OwnerInfoContextLoader", "__toCommonJS", "import_inversify", "import_configTypes", "import_pkiTypes", "import_KeyUsage", "import_ownerInfoTypes", "import_ClearSignContext", "SUPPORTED_TYPES", "OwnerInfoContextLoader", "_dataSource", "_certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "ctx", "solanaContext", "deviceModelId", "trustedNamePKICertificate", "error", "tlvDescriptor", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var c=require("@ledgerhq/device-management-kit"),d=require("purify-ts"),e=require("vitest"),o=require("../../../../shared/model/ClearSignContext"),u=require("./OwnerInfoContextLoader");const A=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]});(0,e.describe)("OwnerInfoContextLoader",()=>{let a,s;const l={keyUsageNumber:4,payload:new Uint8Array([170,187,204])},i={deviceModelId:c.DeviceModelId.FLEX,tokenAddress:"SomeTokenAddress"};(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),a={getOwnerInfo:e.vi.fn()},s={loadCertificate:e.vi.fn()}});const r=()=>new u.OwnerInfoContextLoader(a,s,A);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_TRUSTED_NAME is in expectedTypes and tokenAddress is present",()=>{const t=r();(0,e.expect)(t.canHandle(i,[o.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns true when createATA is present (and tokenAddress absent)",()=>{const t=r(),n={deviceModelId:c.DeviceModelId.FLEX,createATA:{address:"addr",mintAddress:"mint"}};(0,e.expect)(t.canHandle(n,[o.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns false when SOLANA_TRUSTED_NAME is not in expectedTypes",()=>{const t=r();(0,e.expect)(t.canHandle(i,[o.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false when neither tokenAddress nor createATA is present",()=>{const t=r(),n={deviceModelId:c.DeviceModelId.FLEX};(0,e.expect)(t.canHandle(n,[o.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!1)}),(0,e.it)("returns false for non-object inputs",()=>{const t=r();(0,e.expect)(t.canHandle(null,[o.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!1),(0,e.expect)(t.canHandle("string",[o.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("returns SOLANA_TRUSTED_NAME context with cert when datasource returns Right with tlvDescriptor",async()=>{const t=r(),n=new Uint8Array([1,2,3]);e.vi.spyOn(s,"loadCertificate").mockResolvedValue(l),e.vi.spyOn(a,"getOwnerInfo").mockResolvedValue((0,d.Right)({tlvDescriptor:n}));const f=await t.load(i);(0,e.expect)(s.loadCertificate).toHaveBeenCalledWith({keyId:"domain_metadata_key",keyUsage:"trusted_name",targetDevice:c.DeviceModelId.FLEX}),(0,e.expect)(a.getOwnerInfo).toHaveBeenCalledWith(i),(0,e.expect)(f).toEqual([{type:o.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:n,certificate:l}])}),(0,e.it)("returns empty array when datasource returns Right with undefined tlvDescriptor",async()=>{const t=r();e.vi.spyOn(s,"loadCertificate").mockResolvedValue(l),e.vi.spyOn(a,"getOwnerInfo").mockResolvedValue((0,d.Right)({tlvDescriptor:void 0}));const n=await t.load(i);(0,e.expect)(n).toEqual([])}),(0,e.it)("returns error when PKI certificate is missing",async()=>{const t=r();e.vi.spyOn(s,"loadCertificate").mockResolvedValue(void 0),e.vi.spyOn(a,"getOwnerInfo");const n=await t.load(i);(0,e.expect)(a.getOwnerInfo).not.toHaveBeenCalled(),(0,e.expect)(n).toEqual([{type:o.ClearSignContextType.ERROR,error:e.expect.objectContaining({message:e.expect.stringContaining("trustedNamePKICertificate is missing")})}])}),(0,e.it)("returns error when datasource returns Left(error)",async()=>{const t=r(),n=new Error("owner info fetch failed");e.vi.spyOn(s,"loadCertificate").mockResolvedValue(l),e.vi.spyOn(a,"getOwnerInfo").mockResolvedValue((0,d.Left)(n));const f=await t.load(i);(0,e.expect)(f).toEqual([{type:o.ClearSignContextType.ERROR,error:n}])})})});
1
+ "use strict";var c=require("@ledgerhq/device-management-kit"),d=require("purify-ts"),e=require("vitest"),o=require("../../../../shared/model/ClearSignContext"),u=require("./OwnerInfoContextLoader");const A=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]});(0,e.describe)("OwnerInfoContextLoader",()=>{let a,s;const l={keyUsageNumber:4,payload:new Uint8Array([170,187,204])},i={deviceModelId:c.DeviceModelId.FLEX,tokenAddress:"SomeTokenAddress"};(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),a={getOwnerInfo:e.vi.fn()},s={loadCertificate:e.vi.fn()}});const r=()=>new u.OwnerInfoContextLoader(a,s,A);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_BASIC_TRUSTED_NAME is in expectedTypes and tokenAddress is present",()=>{const t=r();(0,e.expect)(t.canHandle(i,[o.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns true when createATA is present (and tokenAddress absent)",()=>{const t=r(),n={deviceModelId:c.DeviceModelId.FLEX,createATA:{address:"addr",mintAddress:"mint"}};(0,e.expect)(t.canHandle(n,[o.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns false when SOLANA_BASIC_TRUSTED_NAME is not in expectedTypes",()=>{const t=r();(0,e.expect)(t.canHandle(i,[o.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false when neither tokenAddress nor createATA is present",()=>{const t=r(),n={deviceModelId:c.DeviceModelId.FLEX};(0,e.expect)(t.canHandle(n,[o.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME])).toBe(!1)}),(0,e.it)("returns false for non-object inputs",()=>{const t=r();(0,e.expect)(t.canHandle(null,[o.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME])).toBe(!1),(0,e.expect)(t.canHandle("string",[o.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME])).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("returns SOLANA_BASIC_TRUSTED_NAME context with cert when datasource returns Right with tlvDescriptor",async()=>{const t=r(),n=new Uint8Array([1,2,3]);e.vi.spyOn(s,"loadCertificate").mockResolvedValue(l),e.vi.spyOn(a,"getOwnerInfo").mockResolvedValue((0,d.Right)({tlvDescriptor:n}));const f=await t.load(i);(0,e.expect)(s.loadCertificate).toHaveBeenCalledWith({keyId:"domain_metadata_key",keyUsage:"trusted_name",targetDevice:c.DeviceModelId.FLEX}),(0,e.expect)(a.getOwnerInfo).toHaveBeenCalledWith(i),(0,e.expect)(f).toEqual([{type:o.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,payload:n,certificate:l}])}),(0,e.it)("returns empty array when datasource returns Right with undefined tlvDescriptor",async()=>{const t=r();e.vi.spyOn(s,"loadCertificate").mockResolvedValue(l),e.vi.spyOn(a,"getOwnerInfo").mockResolvedValue((0,d.Right)({tlvDescriptor:void 0}));const n=await t.load(i);(0,e.expect)(n).toEqual([])}),(0,e.it)("returns error when PKI certificate is missing",async()=>{const t=r();e.vi.spyOn(s,"loadCertificate").mockResolvedValue(void 0),e.vi.spyOn(a,"getOwnerInfo");const n=await t.load(i);(0,e.expect)(a.getOwnerInfo).not.toHaveBeenCalled(),(0,e.expect)(n).toEqual([{type:o.ClearSignContextType.ERROR,error:e.expect.objectContaining({message:e.expect.stringContaining("trustedNamePKICertificate is missing")})}])}),(0,e.it)("returns error when datasource returns Left(error)",async()=>{const t=r(),n=new Error("owner info fetch failed");e.vi.spyOn(s,"loadCertificate").mockResolvedValue(l),e.vi.spyOn(a,"getOwnerInfo").mockResolvedValue((0,d.Left)(n));const f=await t.load(i);(0,e.expect)(f).toEqual([{type:o.ClearSignContextType.ERROR,error:n}])})})});
2
2
  //# sourceMappingURL=OwnerInfoContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport type { PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport type { OwnerInfoDataSource } from \"@/modules/solana/owner-info/data/OwnerInfoDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { OwnerInfoContextLoader } from \"./OwnerInfoContextLoader\";\nimport type { SolanaTransactionContext } from \"./solanaContextTypes\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"OwnerInfoContextLoader\", () => {\n let mockDataSource: OwnerInfoDataSource;\n let mockCertLoader: PkiCertificateLoader;\n\n const mockCert = {\n keyUsageNumber: 4,\n payload: new Uint8Array([0xaa, 0xbb, 0xcc]),\n };\n\n const baseCtx: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"SomeTokenAddress\",\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n\n mockDataSource = {\n getOwnerInfo: vi.fn(),\n } as unknown as OwnerInfoDataSource;\n\n mockCertLoader = {\n loadCertificate: vi.fn(),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = () =>\n new OwnerInfoContextLoader(\n mockDataSource,\n mockCertLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TRUSTED_NAME is in expectedTypes and tokenAddress is present\", () => {\n const loader = makeLoader();\n expect(\n loader.canHandle(baseCtx, [ClearSignContextType.SOLANA_TRUSTED_NAME]),\n ).toBe(true);\n });\n\n it(\"returns true when createATA is present (and tokenAddress absent)\", () => {\n const loader = makeLoader();\n const ctx: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n createATA: { address: \"addr\", mintAddress: \"mint\" },\n };\n expect(\n loader.canHandle(ctx, [ClearSignContextType.SOLANA_TRUSTED_NAME]),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TRUSTED_NAME is not in expectedTypes\", () => {\n const loader = makeLoader();\n expect(\n loader.canHandle(baseCtx, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when neither tokenAddress nor createATA is present\", () => {\n const loader = makeLoader();\n const ctx: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n };\n expect(\n loader.canHandle(ctx, [ClearSignContextType.SOLANA_TRUSTED_NAME]),\n ).toBe(false);\n });\n\n it(\"returns false for non-object inputs\", () => {\n const loader = makeLoader();\n expect(\n loader.canHandle(null, [ClearSignContextType.SOLANA_TRUSTED_NAME]),\n ).toBe(false);\n expect(\n loader.canHandle(\"string\", [ClearSignContextType.SOLANA_TRUSTED_NAME]),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"returns SOLANA_TRUSTED_NAME context with cert when datasource returns Right with tlvDescriptor\", async () => {\n const loader = makeLoader();\n const tlvDescriptor = new Uint8Array([0x01, 0x02, 0x03]);\n\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(mockCert);\n vi.spyOn(mockDataSource, \"getOwnerInfo\").mockResolvedValue(\n Right({ tlvDescriptor }),\n );\n\n const result = await loader.load(baseCtx);\n\n expect(mockCertLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"domain_metadata_key\",\n keyUsage: \"trusted_name\",\n targetDevice: DeviceModelId.FLEX,\n });\n expect(mockDataSource.getOwnerInfo).toHaveBeenCalledWith(baseCtx);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: tlvDescriptor,\n certificate: mockCert,\n },\n ]);\n });\n\n it(\"returns empty array when datasource returns Right with undefined tlvDescriptor\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(mockCert);\n vi.spyOn(mockDataSource, \"getOwnerInfo\").mockResolvedValue(\n Right({ tlvDescriptor: undefined as unknown as Uint8Array }),\n );\n\n const result = await loader.load(baseCtx);\n\n expect(result).toEqual([]);\n });\n\n it(\"returns error when PKI certificate is missing\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(undefined);\n // getOwnerInfo should NOT be called if cert is missing\n vi.spyOn(mockDataSource, \"getOwnerInfo\");\n\n const result = await loader.load(baseCtx);\n\n expect(mockDataSource.getOwnerInfo).not.toHaveBeenCalled();\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: expect.objectContaining({\n message: expect.stringContaining(\n \"trustedNamePKICertificate is missing\",\n ),\n }),\n },\n ]);\n });\n\n it(\"returns error when datasource returns Left(error)\", async () => {\n const loader = makeLoader();\n const error = new Error(\"owner info fetch failed\");\n\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(mockCert);\n vi.spyOn(mockDataSource, \"getOwnerInfo\").mockResolvedValue(Left(error));\n\n const result = await loader.load(baseCtx);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport type { PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport type { OwnerInfoDataSource } from \"@/modules/solana/owner-info/data/OwnerInfoDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { OwnerInfoContextLoader } from \"./OwnerInfoContextLoader\";\nimport type { SolanaTransactionContext } from \"./solanaContextTypes\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"OwnerInfoContextLoader\", () => {\n let mockDataSource: OwnerInfoDataSource;\n let mockCertLoader: PkiCertificateLoader;\n\n const mockCert = {\n keyUsageNumber: 4,\n payload: new Uint8Array([0xaa, 0xbb, 0xcc]),\n };\n\n const baseCtx: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"SomeTokenAddress\",\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n\n mockDataSource = {\n getOwnerInfo: vi.fn(),\n } as unknown as OwnerInfoDataSource;\n\n mockCertLoader = {\n loadCertificate: vi.fn(),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = () =>\n new OwnerInfoContextLoader(\n mockDataSource,\n mockCertLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_BASIC_TRUSTED_NAME is in expectedTypes and tokenAddress is present\", () => {\n const loader = makeLoader();\n expect(\n loader.canHandle(baseCtx, [\n ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n ]),\n ).toBe(true);\n });\n\n it(\"returns true when createATA is present (and tokenAddress absent)\", () => {\n const loader = makeLoader();\n const ctx: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n createATA: { address: \"addr\", mintAddress: \"mint\" },\n };\n expect(\n loader.canHandle(ctx, [ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME]),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_BASIC_TRUSTED_NAME is not in expectedTypes\", () => {\n const loader = makeLoader();\n expect(\n loader.canHandle(baseCtx, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when neither tokenAddress nor createATA is present\", () => {\n const loader = makeLoader();\n const ctx: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n };\n expect(\n loader.canHandle(ctx, [ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME]),\n ).toBe(false);\n });\n\n it(\"returns false for non-object inputs\", () => {\n const loader = makeLoader();\n expect(\n loader.canHandle(null, [\n ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n ]),\n ).toBe(false);\n expect(\n loader.canHandle(\"string\", [\n ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n ]),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"returns SOLANA_BASIC_TRUSTED_NAME context with cert when datasource returns Right with tlvDescriptor\", async () => {\n const loader = makeLoader();\n const tlvDescriptor = new Uint8Array([0x01, 0x02, 0x03]);\n\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(mockCert);\n vi.spyOn(mockDataSource, \"getOwnerInfo\").mockResolvedValue(\n Right({ tlvDescriptor }),\n );\n\n const result = await loader.load(baseCtx);\n\n expect(mockCertLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"domain_metadata_key\",\n keyUsage: \"trusted_name\",\n targetDevice: DeviceModelId.FLEX,\n });\n expect(mockDataSource.getOwnerInfo).toHaveBeenCalledWith(baseCtx);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n payload: tlvDescriptor,\n certificate: mockCert,\n },\n ]);\n });\n\n it(\"returns empty array when datasource returns Right with undefined tlvDescriptor\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(mockCert);\n vi.spyOn(mockDataSource, \"getOwnerInfo\").mockResolvedValue(\n Right({ tlvDescriptor: undefined as unknown as Uint8Array }),\n );\n\n const result = await loader.load(baseCtx);\n\n expect(result).toEqual([]);\n });\n\n it(\"returns error when PKI certificate is missing\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(undefined);\n // getOwnerInfo should NOT be called if cert is missing\n vi.spyOn(mockDataSource, \"getOwnerInfo\");\n\n const result = await loader.load(baseCtx);\n\n expect(mockDataSource.getOwnerInfo).not.toHaveBeenCalled();\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: expect.objectContaining({\n message: expect.stringContaining(\n \"trustedNamePKICertificate is missing\",\n ),\n }),\n },\n ]);\n });\n\n it(\"returns error when datasource returns Left(error)\", async () => {\n const loader = makeLoader();\n const error = new Error(\"owner info fetch failed\");\n\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(mockCert);\n vi.spyOn(mockDataSource, \"getOwnerInfo\").mockResolvedValue(Left(error));\n\n const result = await loader.load(baseCtx);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_ClearSignContext", "import_OwnerInfoContextLoader", "mockLoggerFactory", "mockDataSource", "mockCertLoader", "mockCert", "baseCtx", "makeLoader", "loader", "ctx", "tlvDescriptor", "result", "error"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var a=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of s(t))!l.call(e,o)&&o!==n&&a(e,o,{get:()=>t[o],enumerable:!(r=i(t,o))||r.enumerable});return e};var m=e=>c(a({},"__esModule",{value:!0}),e);var p={};module.exports=m(p);
1
+ "use strict";var e=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var S=(t,o,r,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of s(o))!x.call(t,n)&&n!==r&&e(t,n,{get:()=>o[n],enumerable:!(a=l(o,n))||a.enumerable});return t};var c=t=>S(e({},"__esModule",{value:!0}),t);var m={};module.exports=c(m);
2
2
  //# sourceMappingURL=solanaContextTypes.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/owner-info/domain/solanaContextTypes.ts"],
4
- "sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { type LoaderResult } from \"@/modules/solana/model/SolanaContextTypes\";\n\nexport type {\n SolanaSPLOwnerInfo,\n SolanaTransactionContext,\n} from \"@/modules/solana/model/SolanaTransactionContext\";\n\nexport type SolanaTransactionContextResultSuccess = {\n trustedNamePKICertificate?: PkiCertificate;\n tlvDescriptor?: Uint8Array;\n loadersResults: LoaderResult[];\n contextErrorCount: number;\n};\n"],
4
+ "sourcesContent": ["import { type SolanaContext } from \"@/modules/solana/model/SolanaContextTypes\";\n\nexport type {\n SolanaSPLOwnerInfo,\n SolanaTransactionContext,\n} from \"@/modules/solana/model/SolanaTransactionContext\";\n\nexport type SolanaTransactionContextResultSuccess = {\n loadersResults: SolanaContext[];\n contextErrorCount: number;\n};\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["solanaContextTypes_exports", "__toCommonJS"]
7
7
  }