@ledgerhq/context-module 0.0.0-develop-20260313001318 → 0.0.0-develop-20260314001417
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.
- package/lib/cjs/package.json +1 -1
- package/lib/cjs/src/pki/model/KeyId.js +1 -1
- package/lib/cjs/src/pki/model/KeyId.js.map +2 -2
- package/lib/cjs/src/pki/model/KeyUsage.js +1 -1
- package/lib/cjs/src/pki/model/KeyUsage.js.map +2 -2
- package/lib/cjs/src/shared/model/SolanaContextTypes.js +1 -1
- package/lib/cjs/src/shared/model/SolanaContextTypes.js.map +1 -1
- package/lib/cjs/src/shared/utils/KeyUsageMapper.js +1 -1
- package/lib/cjs/src/shared/utils/KeyUsageMapper.js.map +2 -2
- package/lib/cjs/src/shared/utils/KeyUsageMapper.test.js +1 -1
- package/lib/cjs/src/shared/utils/KeyUsageMapper.test.js.map +2 -2
- package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.js +1 -1
- package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.js.map +3 -3
- package/lib/cjs/src/solana/domain/solanaContextTypes.js.map +1 -1
- package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.js +1 -1
- package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.js.map +3 -3
- package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js +1 -1
- package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js.map +3 -3
- package/lib/cjs/src/solanaLifi/data/SolanaLifiDataSource.js +1 -1
- package/lib/cjs/src/solanaLifi/data/SolanaLifiDataSource.js.map +1 -1
- package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.js +1 -1
- package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.js.map +3 -3
- package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
- package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +3 -3
- package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.js +1 -1
- package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.js.map +2 -2
- package/lib/esm/package.json +1 -1
- package/lib/esm/src/pki/model/KeyId.js +1 -1
- package/lib/esm/src/pki/model/KeyId.js.map +2 -2
- package/lib/esm/src/pki/model/KeyUsage.js +1 -1
- package/lib/esm/src/pki/model/KeyUsage.js.map +2 -2
- package/lib/esm/src/shared/model/SolanaContextTypes.js.map +1 -1
- package/lib/esm/src/shared/utils/KeyUsageMapper.js +1 -1
- package/lib/esm/src/shared/utils/KeyUsageMapper.js.map +2 -2
- package/lib/esm/src/shared/utils/KeyUsageMapper.test.js +1 -1
- package/lib/esm/src/shared/utils/KeyUsageMapper.test.js.map +2 -2
- package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.js +1 -1
- package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.js.map +3 -3
- package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.js +1 -1
- package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.js.map +3 -3
- package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js +1 -1
- package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js.map +3 -3
- package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.js +1 -1
- package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.js.map +3 -3
- package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
- package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +3 -3
- package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.js +1 -1
- package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.js.map +2 -2
- package/lib/types/src/pki/model/KeyId.d.ts +2 -1
- package/lib/types/src/pki/model/KeyId.d.ts.map +1 -1
- package/lib/types/src/pki/model/KeyUsage.d.ts +2 -1
- package/lib/types/src/pki/model/KeyUsage.d.ts.map +1 -1
- package/lib/types/src/shared/model/SolanaContextTypes.d.ts +33 -3
- package/lib/types/src/shared/model/SolanaContextTypes.d.ts.map +1 -1
- package/lib/types/src/shared/utils/KeyUsageMapper.d.ts.map +1 -1
- package/lib/types/src/solana/domain/DefaultSolanaContextLoader.d.ts +4 -1
- package/lib/types/src/solana/domain/DefaultSolanaContextLoader.d.ts.map +1 -1
- package/lib/types/src/solana/domain/solanaContextTypes.d.ts +2 -2
- package/lib/types/src/solana/domain/solanaContextTypes.d.ts.map +1 -1
- package/lib/types/src/solanaLifi/data/HttpSolanaLifiDataSource.d.ts +3 -1
- package/lib/types/src/solanaLifi/data/HttpSolanaLifiDataSource.d.ts.map +1 -1
- package/lib/types/src/solanaLifi/data/SolanaLifiDataSource.d.ts +2 -5
- package/lib/types/src/solanaLifi/data/SolanaLifiDataSource.d.ts.map +1 -1
- package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.d.ts +10 -8
- package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.d.ts.map +1 -1
- package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.d.ts +4 -9
- package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaLifi/domain/SolanaLifiContextLoader.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n SolanaContextTypes,\n type SolanaTransactionDescriptorList,\n} from \"@/shared/model/SolanaContextTypes\";\nimport {\n type GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"@/solanaLifi/data/SolanaLifiDataSource\";\n\nimport { SolanaLifiContextLoader } from \"./SolanaLifiContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"SolanaLifiContextLoader\", () => {\n let mockDataSource: SolanaLifiDataSource;\n\n const descriptors: SolanaTransactionDescriptorList = {\n // Shape not important for the loader: it's plucked verbatim\n swap: { programId: \"SomeProgram\", accounts: [], data: \"abc123\" } as any,\n bridge: {\n programId: \"AnotherProgram\",\n accounts: [],\n data: \"def456\",\n } as any,\n };\n\n const txDescriptorsResponse: GetTransactionDescriptorsResponse = {\n descriptors,\n } as any;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n mockDataSource = {\n getTransactionDescriptorsPayload: vi.fn(),\n } as unknown as SolanaLifiDataSource;\n });\n\n const makeLoader = () =>\n new SolanaLifiContextLoader(mockDataSource, mockLoggerFactory);\n\n describe(\"canHandle\", () => {\n it(\"returns true when templateId is provided\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n {\n templateId: \"tpl-123\",\n deviceModelId: \"nanoS\" as any,\n },\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when templateId is missing or falsy\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n { templateId: \"\" } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { templateId: undefined } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_LIFI)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error)\", async () => {\n const loader = makeLoader();\n const error = new Error(\"boom\");\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Left(error));\n const input = { templateId: \"tpl-err\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-err\",\n });\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_LIFI with plucked descriptors when datasource returns Right(value)\", async () => {\n const loader = makeLoader();\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(txDescriptorsResponse));\n const input = { templateId: \"tpl-ok\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-ok\",\n });\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: descriptors,\n });\n });\n });\n\n describe(\"pluckTransactionData (private)\", () => {\n it(\"simply returns the descriptors object from the response\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result = pluck(txDescriptorsResponse);\n\n expect(result).toEqual(descriptors);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAIA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,
|
|
6
|
-
"names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "SolanaContextTypes", "SolanaLifiContextLoader", "mockLoggerFactory", "mockDataSource", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport {\n SolanaContextTypes,\n type SolanaTransactionDescriptor,\n type SolanaTransactionDescriptorList,\n type SolanaTransactionDescriptorRaw,\n} from \"@/shared/model/SolanaContextTypes\";\nimport {\n type GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"@/solanaLifi/data/SolanaLifiDataSource\";\n\nimport { SolanaLifiContextLoader } from \"./SolanaLifiContextLoader\";\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: 13,\n payload: new Uint8Array([0x01, 0x02]),\n};\n\nconst mockConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com\",\n mode: \"test\",\n branch: \"main\",\n },\n} as ContextModuleConfig;\n\ndescribe(\"SolanaLifiContextLoader\", () => {\n let mockDataSource: SolanaLifiDataSource;\n let mockCertificateLoader: PkiCertificateLoader;\n\n const makeRawDescriptor = (\n data: string,\n sig = \"deadbeef\",\n ): SolanaTransactionDescriptorRaw => ({\n data,\n descriptorType: \"swap_template\",\n descriptorVersion: \"v1\",\n signatures: { test: sig, prod: `prod_${sig}` },\n });\n\n const makeResolvedDescriptor = (\n data: string,\n sig = \"deadbeef\",\n ): SolanaTransactionDescriptor => ({\n data,\n descriptorType: \"swap_template\",\n descriptorVersion: \"v1\",\n signature: sig,\n });\n\n const responseDescriptorsArray: GetTransactionDescriptorsResponse[\"descriptors\"] =\n [\n {\n program_id: \"SomeProgram\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"abc123\"),\n },\n {\n program_id: \"AnotherProgram\",\n // discriminator_hex intentionally omitted -> defaults to \"\"\n descriptor: makeRawDescriptor(\"def456\"),\n },\n ];\n\n const expectedPlucked: SolanaTransactionDescriptorList = {\n \"SomeProgram:1\": makeResolvedDescriptor(\"abc123\"),\n \"AnotherProgram:\": makeResolvedDescriptor(\"def456\"),\n };\n\n const responseInstructionsArray: GetTransactionDescriptorsResponse[\"instructions\"] =\n [\n {\n program_id: \"SomeProgram\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n {\n program_id: \"AnotherProgram\",\n // discriminator_hex intentionally omitted\n },\n ];\n\n const txDescriptorsResponse: GetTransactionDescriptorsResponse = {\n id: \"tpl-1\",\n chain_id: 101,\n instructions: responseInstructionsArray,\n descriptors: responseDescriptorsArray,\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n mockDataSource = {\n getTransactionDescriptorsPayload: vi.fn(),\n } as unknown as SolanaLifiDataSource;\n mockCertificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = () =>\n new SolanaLifiContextLoader(\n mockDataSource,\n mockConfig,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when templateId is provided\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n {\n templateId: \"tpl-123\",\n deviceModelId: \"nanoS\" as any,\n },\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when templateId is missing or falsy\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n { templateId: \"\" } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { templateId: undefined } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_LIFI)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error)\", async () => {\n const loader = makeLoader();\n const error = new Error(\"boom\");\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Left(error));\n\n const input = { templateId: \"tpl-err\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-err\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_LIFI with plucked descriptors and certificate when datasource returns Right(value)\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(txDescriptorsResponse));\n\n const input = { templateId: \"tpl-ok\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-ok\",\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"swap_template_key\",\n keyUsage: \"swap_template\",\n targetDevice: \"nanoS\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n descriptors: expectedPlucked,\n instructions: [\n { program_id: \"SomeProgram\", discriminator_hex: \"1\" },\n { program_id: \"AnotherProgram\" },\n ],\n },\n certificate: mockCertificate,\n });\n });\n });\n\n describe(\"pluckTransactionData (private)\", () => {\n it(\"returns a map keyed by `${program_id}:${discriminator_hex ?? '0'}`\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(\n txDescriptorsResponse,\n );\n\n expect(result).toEqual(expectedPlucked);\n });\n });\n\n describe(\"extractInstructionsMeta (private)\", () => {\n it(\"returns instruction metadata from the API response\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract(txDescriptorsResponse);\n\n expect(result).toEqual([\n { program_id: \"SomeProgram\", discriminator_hex: \"1\" },\n { program_id: \"AnotherProgram\" },\n ]);\n });\n\n it(\"returns empty array when instructions are missing\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract({\n ...txDescriptorsResponse,\n instructions: undefined,\n });\n\n expect(result).toEqual([]);\n });\n });\n\n describe(\"pluckTransactionData mode resolution (private)\", () => {\n it(\"resolves signature using config.cal.mode\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(\n txDescriptorsResponse,\n );\n\n expect(result[\"SomeProgram:1\"]?.signature).toBe(\"deadbeef\");\n });\n });\n\n describe(\"real CAL payload (LiFi template 4c694669)\", () => {\n const realApiResponse: GetTransactionDescriptorsResponse = {\n id: \"4c694669\",\n chain_id: 101,\n instructions: [\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n {\n program_id: \"11111111111111111111111111111111\",\n discriminator: 2,\n discriminator_hex: \"2\",\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator: 3.0753642362361016e18,\n discriminator_hex: \"2aade37a97cb17e0\",\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator: 9.339575302786589e18,\n discriminator_hex: \"819cd641339b2148\",\n },\n { program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\" },\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator: 1,\n discriminator_hex: \"1\",\n },\n { program_id: \"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br\" },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator: 2,\n discriminator_hex: \"2\",\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator: 3,\n discriminator_hex: \"3\",\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator: 3,\n discriminator_hex: \"3\",\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator: 17,\n discriminator_hex: \"11\",\n },\n { program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\" },\n ],\n descriptors: [\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"atoken_1\", \"sig_atoken\"),\n },\n {\n program_id: \"11111111111111111111111111111111\",\n discriminator_hex: \"2\",\n descriptor: makeRawDescriptor(\"system_2\", \"sig_system\"),\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n descriptor: makeRawDescriptor(\"jup_route\", \"sig_jup_route\"),\n },\n {\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n descriptor: makeRawDescriptor(\"jup_shared\", \"sig_jup_shared\"),\n },\n {\n program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n descriptor: makeRawDescriptor(\"memo\", \"sig_memo\"),\n },\n {\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n descriptor: makeRawDescriptor(\"atoken_1\", \"sig_atoken\"),\n },\n {\n program_id: \"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br\",\n descriptor: makeRawDescriptor(\"3i5jeu\", \"sig_3i5jeu\"),\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator_hex: \"2\",\n descriptor: makeRawDescriptor(\"cb_2\", \"sig_cb2\"),\n },\n {\n program_id: \"ComputeBudget111111111111111111111111111111\",\n discriminator_hex: \"3\",\n descriptor: makeRawDescriptor(\"cb_3\", \"sig_cb3\"),\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator_hex: \"3\",\n descriptor: makeRawDescriptor(\"tokenkeg_3\", \"sig_tk3\"),\n },\n {\n program_id: \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\",\n discriminator_hex: \"11\",\n descriptor: makeRawDescriptor(\"tokenkeg_11\", \"sig_tk11\"),\n },\n {\n program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\",\n descriptor: makeRawDescriptor(\"brdg\", \"sig_brdg\"),\n },\n ],\n };\n\n it(\"produces 11 unique descriptor keys (ATokenGP:1 appears twice but deduplicates)\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n const keys = Object.keys(result);\n\n // 12 descriptors but ATokenGP:1 appears twice -> 11 unique keys\n expect(keys).toHaveLength(11);\n });\n\n it(\"creates distinct keys for same program_id with different discriminators\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n\n // JUP6 has two different discriminators -> two distinct entries\n expect(\n result[\"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:2aade37a97cb17e0\"]\n ?.data,\n ).toBe(\"jup_route\");\n expect(\n result[\"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:819cd641339b2148\"]\n ?.data,\n ).toBe(\"jup_shared\");\n\n // ComputeBudget has discriminator 2 and 3\n expect(\n result[\"ComputeBudget111111111111111111111111111111:2\"]?.data,\n ).toBe(\"cb_2\");\n expect(\n result[\"ComputeBudget111111111111111111111111111111:3\"]?.data,\n ).toBe(\"cb_3\");\n\n // TokenkegQ has discriminator 3 and 11\n expect(\n result[\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:3\"]?.data,\n ).toBe(\"tokenkeg_3\");\n expect(\n result[\"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:11\"]?.data,\n ).toBe(\"tokenkeg_11\");\n });\n\n it(\"uses :0 suffix for programs without a discriminator\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result: SolanaTransactionDescriptorList = pluck(realApiResponse);\n\n expect(result[\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr:\"]?.data).toBe(\n \"memo\",\n );\n expect(\n result[\"3i5JeuZuUxeKtVysUnwQNGerJP2bSMX9fTFfS4Nxe3Br:\"]?.data,\n ).toBe(\"3i5jeu\");\n expect(\n result[\"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB:\"]?.data,\n ).toBe(\"brdg\");\n });\n\n it(\"extracts 12 instruction metadata entries preserving order and discriminators\", () => {\n const loader = makeLoader();\n const extract = (loader as any).extractInstructionsMeta.bind(loader);\n\n const result = extract(realApiResponse);\n\n expect(result).toHaveLength(12);\n\n // First: ATokenGP with discriminator\n expect(result[0]).toEqual({\n program_id: \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\",\n discriminator_hex: \"1\",\n });\n // JUP6 route (8-byte discriminator)\n expect(result[2]).toEqual({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n });\n // JUP6 shared (8-byte discriminator)\n expect(result[3]).toEqual({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n });\n // Memo: no discriminator\n expect(result[4]).toEqual({\n program_id: \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n });\n // BrdgN2: no discriminator (last entry)\n expect(result[11]).toEqual({\n program_id: \"BrdgN2RPzEMWF96ZbnnJaUtQDQx7VRXYaHHbYCBvceWB\",\n });\n });\n\n it(\"loadField returns full payload with descriptors and instructions from real API response\", async () => {\n const loader = makeLoader();\n\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(realApiResponse));\n\n const input = { templateId: \"4c694669\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(result).toMatchObject({\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n descriptors: expect.objectContaining({\n \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:2aade37a97cb17e0\":\n expect.objectContaining({ data: \"jup_route\" }),\n \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4:819cd641339b2148\":\n expect.objectContaining({ data: \"jup_shared\" }),\n }),\n instructions: expect.arrayContaining([\n expect.objectContaining({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"2aade37a97cb17e0\",\n }),\n expect.objectContaining({\n program_id: \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\",\n discriminator_hex: \"819cd641339b2148\",\n }),\n ]),\n },\n });\n\n expect(Object.keys((result as any).payload.descriptors)).toHaveLength(11);\n expect((result as any).payload.instructions).toHaveLength(12);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "SolanaContextTypes", "SolanaLifiContextLoader", "mockLoggerFactory", "mockCertificate", "mockConfig", "mockDataSource", "mockCertificateLoader", "makeRawDescriptor", "data", "sig", "makeResolvedDescriptor", "responseDescriptorsArray", "expectedPlucked", "txDescriptorsResponse", "makeLoader", "loader", "error", "input", "result", "realApiResponse", "keys"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var u=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var p=(i,e,t,o)=>{for(var a=o>1?void 0:o?k(e,t):e,r=i.length-1,n;r>=0;r--)(n=i[r])&&(a=(o?n(e,t,a):n(a))||a);return o&&a&&u(e,t,a),a},l=(i,e)=>(t,o)=>e(t,o,i);import{inject as s,injectable as f}from"inversify";import{configTypes as g}from"../../config/di/configTypes";import{pkiTypes as m}from"../../pki/di/pkiTypes";import{KeyUsage as y}from"../../pki/model/KeyUsage";import{SolanaContextTypes as c}from"../../shared/model/SolanaContextTypes";import{solanaTokenTypes as T}from"../../solanaToken/di/solanaTokenTypes";let d=class{constructor(e,t,o,a){this.dataSource=e;this.config=t;this._certificateLoader=o;this.logger=a("SolanaTokenContextLoader")}logger;canHandle(e,t){if(t!==c.SOLANA_TOKEN||typeof e!="object"||e===null||!("tokenInternalId"in e))return!1;const o=e.tokenInternalId;return typeof o=="string"&&o.length>0}async loadField(e){this.logger.debug("[loadField] Loading solana token context",{data:{input:e}});const{tokenInternalId:t,deviceModelId:o}=e;if(!t)return{type:c.ERROR,error:new Error("[ContextModule] SolanaTokenContextLoader: tokenInternalId is missing")};const a=await this.dataSource.getTokenInfosPayload({tokenInternalId:t}),r=await this._certificateLoader.loadCertificate({keyId:"token_metadata_key",keyUsage:y.CoinMeta,targetDevice:o});return a.caseOf({Left:n=>(this.logger.error("[loadField] Error loading solana token context",{data:{error:n}}),{type:c.ERROR,error:n}),Right:n=>(this.logger.debug("[loadField] Successfully loaded solana token context",{data:{payload:this.pluckTokenData(n),certificate:r}}),{type:c.SOLANA_TOKEN,payload:this.pluckTokenData(n),certificate:r})})}pluckTokenData(e){const t=this.config.cal.mode||"prod";return{solanaTokenDescriptor:{data:e.descriptor.data,signature:e.descriptor.signatures[t]}}}};d=p([f(),l(0,s(T.SolanaTokenDataSource)),l(1,s(g.Config)),l(2,s(m.PkiCertificateLoader)),l(3,s(g.ContextModuleLoggerFactory))],d);export{d as SolanaTokenContextLoader};
|
|
2
2
|
//# sourceMappingURL=SolanaTokenContextLoader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/solanaToken/domain/SolanaTokenContextLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ContextFieldLoader } from \"@/shared/domain/ContextFieldLoader\";\nimport {\n SolanaContextTypes,\n SolanaTokenContextResult,\n SolanaTokenData,\n} from \"@/shared/model/SolanaContextTypes\";\nimport { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"@/solanaToken/data/SolanaTokenDataSource\";\nimport { solanaTokenTypes } from \"@/solanaToken/di/solanaTokenTypes\";\n\n@injectable()\nexport class SolanaTokenContextLoader\n implements\n ContextFieldLoader<\n SolanaTransactionContext,\n SolanaContextTypes,\n SolanaTokenContextResult\n >\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(solanaTokenTypes.SolanaTokenDataSource)\n private readonly dataSource: SolanaTokenDataSource,\n @inject(configTypes.Config) private readonly config: ContextModuleConfig,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaTokenContextLoader\");\n }\n\n public canHandle(\n field: unknown,\n expectedType: SolanaContextTypes,\n ): field is SolanaTransactionContext {\n if (expectedType !== SolanaContextTypes.SOLANA_TOKEN) {\n return false;\n }\n\n if (\n typeof field !== \"object\" ||\n field === null ||\n !(\"tokenInternalId\" in field)\n ) {\n return false;\n }\n\n const tokenInternalId = (field as { tokenInternalId: unknown })\n .tokenInternalId;\n\n return typeof tokenInternalId === \"string\" && tokenInternalId.length > 0;\n }\n\n public async loadField(\n solanaTokenContextInput: SolanaTransactionContext,\n ): Promise<SolanaTokenContextResult> {\n this.logger.debug(\"[loadField] Loading solana token context\", {\n data: { input: solanaTokenContextInput },\n });\n const { tokenInternalId, deviceModelId } = solanaTokenContextInput;\n\n if (!tokenInternalId) {\n return {\n type: SolanaContextTypes.ERROR,\n error: new Error(\n \"[ContextModule] SolanaTokenContextLoader: tokenInternalId is missing\",\n ),\n };\n }\n\n const payload = await this.dataSource.getTokenInfosPayload({\n tokenInternalId,\n });\n\n const certificate: PkiCertificate | undefined =\n await this._certificateLoader.loadCertificate({\n keyId: \"token_metadata_key\",\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: deviceModelId,\n });\n\n return payload.caseOf({\n Left: (error): SolanaTokenContextResult => {\n this.logger.error(\"[loadField] Error loading solana token context\", {\n data: { error },\n });\n\n return {\n type: SolanaContextTypes.ERROR,\n error,\n };\n },\n Right: (value): SolanaTokenContextResult => {\n this.logger.debug(\n \"[loadField] Successfully loaded solana token context\",\n {\n data: { payload: this.pluckTokenData(value), certificate },\n },\n );\n\n return {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: this.pluckTokenData(value),\n certificate,\n };\n },\n });\n }\n\n private pluckTokenData(tokenData: TokenDataResponse): SolanaTokenData {\n const signatureKind = this.config.cal.mode || \"prod\";\n return {\n solanaTokenDescriptor: {\n data: tokenData.descriptor.data,\n signature: tokenData.descriptor.signatures[signatureKind],\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "iOACA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,eAAAC,MAAmB,0BAE5B,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,YAAAC,MAAgB,uBAGzB,OACE,sBAAAC,MAGK,oCAMP,OAAS,oBAAAC,MAAwB,oCAG1B,IAAMC,EAAN,KAOP,CAGE,YAEmBC,EAC4BC,EAE5BC,EAEjBC,EACA,CANiB,gBAAAH,EAC4B,YAAAC,EAE5B,wBAAAC,EAIjB,KAAK,OAASC,EAAc,0BAA0B,CACxD,CAZQ,OAcD,UACLC,EACAC,EACmC,CAKnC,GAJIA,IAAiBC,EAAmB,cAKtC,OAAOF,GAAU,UACjBA,IAAU,MACV,EAAE,oBAAqBA,GAEvB,MAAO,GAGT,MAAMG,EAAmBH,EACtB,gBAEH,OAAO,OAAOG,GAAoB,UAAYA,EAAgB,OAAS,CACzE,CAEA,MAAa,UACXC,EACmC,CACnC,KAAK,OAAO,MAAM,2CAA4C,CAC5D,KAAM,CAAE,MAAOA,CAAwB,CACzC,CAAC,EACD,KAAM,CAAE,gBAAAD,EAAiB,cAAAE,CAAc,EAAID,EAE3C,GAAI,CAACD,EACH,MAAO,CACL,KAAMD,EAAmB,MACzB,MAAO,IAAI,MACT,sEACF,CACF,EAGF,MAAMI,EAAU,MAAM,KAAK,WAAW,qBAAqB,CACzD,gBAAAH,CACF,CAAC,EAEKI,EACJ,MAAM,KAAK,mBAAmB,gBAAgB,CAC5C,MAAO,qBACP,SAAUC,EAAS,SACnB,aAAcH,CAChB,CAAC,EAEH,OAAOC,EAAQ,OAAO,CACpB,KAAOG,IACL,KAAK,OAAO,MAAM,iDAAkD,CAClE,KAAM,CAAE,MAAAA,CAAM,CAChB,CAAC,EAEM,CACL,KAAMP,EAAmB,MACzB,MAAAO,CACF,GAEF,MAAQC,IACN,KAAK,OAAO,MACV,uDACA,CACE,KAAM,CAAE,QAAS,KAAK,eAAeA,CAAK,EAAG,YAAAH,CAAY,CAC3D,CACF,EAEO,CACL,KAAML,EAAmB,aACzB,QAAS,KAAK,eAAeQ,CAAK,EAClC,YAAAH,CACF,EAEJ,CAAC,CACH,CAEQ,eAAeI,EAA+C,CACpE,MAAMC,EAAgB,KAAK,OAAO,IAAI,MAAQ,OAC9C,MAAO,CACL,sBAAuB,CACrB,KAAMD,EAAU,WAAW,KAC3B,UAAWA,EAAU,WAAW,WAAWC,CAAa,CAC1D,CACF,CACF,CACF,EA7GajB,EAANkB,EAAA,CADNC,EAAW,EAYPC,EAAA,EAAAC,EAAOC,EAAiB,qBAAqB,GAE7CF,EAAA,EAAAC,EAAOE,EAAY,MAAM,GACzBH,EAAA,EAAAC,EAAOG,EAAS,oBAAoB,GAEpCJ,EAAA,EAAAC,EAAOE,EAAY,0BAA0B,IAhBrCvB",
|
|
6
6
|
"names": ["inject", "injectable", "configTypes", "pkiTypes", "KeyUsage", "SolanaContextTypes", "solanaTokenTypes", "SolanaTokenContextLoader", "dataSource", "config", "_certificateLoader", "loggerFactory", "field", "expectedType", "SolanaContextTypes", "tokenInternalId", "solanaTokenContextInput", "deviceModelId", "payload", "certificate", "KeyUsage", "error", "value", "tokenData", "signatureKind", "__decorateClass", "injectable", "__decorateParam", "inject", "solanaTokenTypes", "configTypes", "pkiTypes"]
|
|
7
7
|
}
|
|
@@ -10,6 +10,7 @@ export declare enum KeyId {
|
|
|
10
10
|
CalCalldataKey = "cal_calldata_key",
|
|
11
11
|
CalTrustedNameKey = "cal_trusted_name_key",
|
|
12
12
|
CalNetwork = "cal_network",
|
|
13
|
-
CalGatedSigning = "cal_gated_signing"
|
|
13
|
+
CalGatedSigning = "cal_gated_signing",
|
|
14
|
+
SwapTemplateKey = "swap_template_key"
|
|
14
15
|
}
|
|
15
16
|
//# sourceMappingURL=KeyId.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyId.d.ts","sourceRoot":"","sources":["../../../../../src/pki/model/KeyId.ts"],"names":[],"mappings":"AAAA,oBAAY,KAAK;IACf,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,YAAY,mBAAmB;IAC/B,iBAAiB,wBAAwB;IACzC,cAAc,qBAAqB;IACnC,kBAAkB,yBAAyB;IAC3C,gBAAgB,uBAAuB;IACvC,iBAAiB,wBAAwB;IACzC,cAAc,qBAAqB;IACnC,iBAAiB,yBAAyB;IAC1C,UAAU,gBAAgB;IAC1B,eAAe,sBAAsB;CACtC"}
|
|
1
|
+
{"version":3,"file":"KeyId.d.ts","sourceRoot":"","sources":["../../../../../src/pki/model/KeyId.ts"],"names":[],"mappings":"AAAA,oBAAY,KAAK;IACf,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,YAAY,mBAAmB;IAC/B,iBAAiB,wBAAwB;IACzC,cAAc,qBAAqB;IACnC,kBAAkB,yBAAyB;IAC3C,gBAAgB,uBAAuB;IACvC,iBAAiB,wBAAwB;IACzC,cAAc,qBAAqB;IACnC,iBAAiB,yBAAyB;IAC1C,UAAU,gBAAgB;IAC1B,eAAe,sBAAsB;IACrC,eAAe,sBAAsB;CACtC"}
|
|
@@ -12,6 +12,7 @@ export declare enum KeyUsage {
|
|
|
12
12
|
Calldata = "calldata",
|
|
13
13
|
Network = "network",
|
|
14
14
|
LESMultisig = "les_multisig",
|
|
15
|
-
GatedSigning = "gated_signing"
|
|
15
|
+
GatedSigning = "gated_signing",
|
|
16
|
+
SwapTemplate = "swap_template"
|
|
16
17
|
}
|
|
17
18
|
//# sourceMappingURL=KeyUsage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyUsage.d.ts","sourceRoot":"","sources":["../../../../../src/pki/model/KeyUsage.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,YAAY,kBAAkB;IAC9B,eAAe,qBAAqB;IACpC,OAAO,aAAa;IACpB,WAAW,iBAAiB;IAC5B,cAAc,oBAAoB;IAClC,mBAAmB,yBAAyB;IAC5C,UAAU,gBAAgB;IAC1B,QAAQ,cAAc;IACtB,UAAU,iBAAiB;IAC3B,kBAAkB,mBAAmB;IACrC,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,WAAW,iBAAiB;IAC5B,YAAY,kBAAkB;CAC/B"}
|
|
1
|
+
{"version":3,"file":"KeyUsage.d.ts","sourceRoot":"","sources":["../../../../../src/pki/model/KeyUsage.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,YAAY,kBAAkB;IAC9B,eAAe,qBAAqB;IACpC,OAAO,aAAa;IACpB,WAAW,iBAAiB;IAC5B,cAAc,oBAAoB;IAClC,mBAAmB,yBAAyB;IAC5C,UAAU,gBAAgB;IAC1B,QAAQ,cAAc;IACtB,UAAU,iBAAiB;IAC3B,kBAAkB,mBAAmB;IACrC,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,WAAW,iBAAiB;IAC5B,YAAY,kBAAkB;IAC9B,YAAY,kBAAkB;CAC/B"}
|
|
@@ -4,7 +4,7 @@ export declare enum SolanaContextTypes {
|
|
|
4
4
|
SOLANA_LIFI = "solanaLifi",
|
|
5
5
|
ERROR = "error"
|
|
6
6
|
}
|
|
7
|
-
export type
|
|
7
|
+
export type SolanaTransactionDescriptorRaw = {
|
|
8
8
|
data: string;
|
|
9
9
|
descriptorType: string;
|
|
10
10
|
descriptorVersion: string;
|
|
@@ -13,7 +13,36 @@ export type SolanaTransactionDescriptor = {
|
|
|
13
13
|
test?: string;
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
|
+
export type SolanaTransactionDescriptor = {
|
|
17
|
+
data: string;
|
|
18
|
+
descriptorType: string;
|
|
19
|
+
descriptorVersion: string;
|
|
20
|
+
signature: string;
|
|
21
|
+
};
|
|
22
|
+
export type SolanaLifiDescriptorEntry = {
|
|
23
|
+
program_id: string;
|
|
24
|
+
discriminator_hex?: string;
|
|
25
|
+
descriptor: SolanaTransactionDescriptorRaw;
|
|
26
|
+
};
|
|
27
|
+
export type GetTransactionDescriptorsResponse = {
|
|
28
|
+
id: string;
|
|
29
|
+
chain_id: number;
|
|
30
|
+
instructions: Array<{
|
|
31
|
+
program_id: string;
|
|
32
|
+
discriminator?: number;
|
|
33
|
+
discriminator_hex?: string;
|
|
34
|
+
}>;
|
|
35
|
+
descriptors: SolanaLifiDescriptorEntry[];
|
|
36
|
+
};
|
|
16
37
|
export type SolanaTransactionDescriptorList = Record<string, SolanaTransactionDescriptor>;
|
|
38
|
+
export type SolanaLifiInstructionMeta = {
|
|
39
|
+
program_id: string;
|
|
40
|
+
discriminator_hex?: string;
|
|
41
|
+
};
|
|
42
|
+
export type SolanaLifiPayload = {
|
|
43
|
+
descriptors: SolanaTransactionDescriptorList;
|
|
44
|
+
instructions: SolanaLifiInstructionMeta[];
|
|
45
|
+
};
|
|
17
46
|
export type SolanaTokenData = {
|
|
18
47
|
solanaTokenDescriptor: {
|
|
19
48
|
data: string;
|
|
@@ -27,7 +56,8 @@ type SolanaContextSuccessPayloads = {
|
|
|
27
56
|
certificate?: PkiCertificate;
|
|
28
57
|
};
|
|
29
58
|
[SolanaContextTypes.SOLANA_LIFI]: {
|
|
30
|
-
payload:
|
|
59
|
+
payload: SolanaLifiPayload;
|
|
60
|
+
certificate?: PkiCertificate;
|
|
31
61
|
};
|
|
32
62
|
};
|
|
33
63
|
export type SolanaContextSuccess<T extends SolanaContextSuccessType = SolanaContextSuccessType> = {
|
|
@@ -42,6 +72,6 @@ export type SolanaTokenContextSuccess = SolanaContextSuccess<SolanaContextTypes.
|
|
|
42
72
|
export type SolanaLifiContextSuccess = SolanaContextSuccess<SolanaContextTypes.SOLANA_LIFI>;
|
|
43
73
|
export type SolanaTokenContextResult = SolanaTokenContextSuccess | SolanaContextError;
|
|
44
74
|
export type SolanaLifiContextResult = SolanaLifiContextSuccess | SolanaContextError;
|
|
45
|
-
export type LoaderResult = SolanaTokenContextResult;
|
|
75
|
+
export type LoaderResult = SolanaTokenContextResult | SolanaLifiContextResult;
|
|
46
76
|
export {};
|
|
47
77
|
//# sourceMappingURL=SolanaContextTypes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolanaContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/shared/model/SolanaContextTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,oBAAY,kBAAkB;IAC5B,YAAY,gBAAgB;IAC5B,WAAW,eAAe;IAC1B,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"SolanaContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/shared/model/SolanaContextTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyUsageMapper.d.ts","sourceRoot":"","sources":["../../../../../src/shared/utils/KeyUsageMapper.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"KeyUsageMapper.d.ts","sourceRoot":"","sources":["../../../../../src/shared/utils/KeyUsageMapper.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,WAAW,CAgBvB;IAEH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAMxD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LoggerPublisherService } from "@ledgerhq/device-management-kit";
|
|
2
2
|
import { type PkiCertificateLoader } from "../../pki/domain/PkiCertificateLoader";
|
|
3
3
|
import { type SolanaDataSource } from "../../solana/data/SolanaDataSource";
|
|
4
|
+
import { SolanaLifiContextLoader } from "../../solanaLifi/domain/SolanaLifiContextLoader";
|
|
4
5
|
import { SolanaTokenContextLoader } from "../../solanaToken/domain/SolanaTokenContextLoader";
|
|
5
6
|
import { type SolanaContextLoader } from "./SolanaContextLoader";
|
|
6
7
|
import { SolanaTransactionContext, SolanaTransactionContextResult } from "./solanaContextTypes";
|
|
@@ -8,8 +9,10 @@ export declare class DefaultSolanaContextLoader implements SolanaContextLoader {
|
|
|
8
9
|
private readonly _dataSource;
|
|
9
10
|
private readonly _certificateLoader;
|
|
10
11
|
private readonly _solanaTokenLoader;
|
|
12
|
+
private readonly _solanaLifiLoader;
|
|
11
13
|
private logger;
|
|
12
|
-
constructor(_dataSource: SolanaDataSource, _certificateLoader: PkiCertificateLoader, _solanaTokenLoader: SolanaTokenContextLoader, loggerFactory: (tag: string) => LoggerPublisherService);
|
|
14
|
+
constructor(_dataSource: SolanaDataSource, _certificateLoader: PkiCertificateLoader, _solanaTokenLoader: SolanaTokenContextLoader, loggerFactory: (tag: string) => LoggerPublisherService, _solanaLifiLoader: SolanaLifiContextLoader);
|
|
15
|
+
private needsOwnerInfo;
|
|
13
16
|
load(solanaContext: SolanaTransactionContext): Promise<SolanaTransactionContextResult>;
|
|
14
17
|
}
|
|
15
18
|
//# sourceMappingURL=DefaultSolanaContextLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultSolanaContextLoader.d.ts","sourceRoot":"","sources":["../../../../../src/solana/domain/DefaultSolanaContextLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAMzE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"DefaultSolanaContextLoader.d.ts","sourceRoot":"","sources":["../../../../../src/solana/domain/DefaultSolanaContextLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAMzE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAO9E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAEtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AAEzF,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAE/B,MAAM,sBAAsB,CAAC;AAE9B,qBACa,0BAA2B,YAAW,mBAAmB;IAKlE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAInC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAZpC,OAAO,CAAC,MAAM,CAAyB;gBAIpB,WAAW,EAAE,gBAAgB,EAE7B,kBAAkB,EAAE,oBAAoB,EAExC,kBAAkB,EAAE,wBAAwB,EAE7D,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,EAErC,iBAAiB,EAAE,uBAAuB;IAK7D,OAAO,CAAC,cAAc;IAIhB,IAAI,CACR,aAAa,EAAE,wBAAwB,GACtC,OAAO,CAAC,8BAA8B,CAAC;CAsE3C"}
|
|
@@ -21,8 +21,8 @@ export type SolanaSPLOwnerInfo = {
|
|
|
21
21
|
};
|
|
22
22
|
export type SolanaContextLoaderResults = Array<SolanaTokenContextResult | SolanaLifiContextResult>;
|
|
23
23
|
export type SolanaTransactionContextResultSuccess = {
|
|
24
|
-
trustedNamePKICertificate
|
|
25
|
-
tlvDescriptor
|
|
24
|
+
trustedNamePKICertificate?: PkiCertificate;
|
|
25
|
+
tlvDescriptor?: Uint8Array;
|
|
26
26
|
loadersResults: SolanaContextLoaderResults;
|
|
27
27
|
};
|
|
28
28
|
export type SolanaTransactionContextResult = Either<Error, SolanaTransactionContextResultSuccess>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solanaContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/solana/domain/solanaContextTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,KAAK,CAC5C,wBAAwB,GAAG,uBAAuB,CACnD,CAAC;AAEF,MAAM,MAAM,qCAAqC,GAAG;IAClD,yBAAyB,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"solanaContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/solana/domain/solanaContextTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,KAAK,CAC5C,wBAAwB,GAAG,uBAAuB,CACnD,CAAC;AAEF,MAAM,MAAM,qCAAqC,GAAG;IAClD,yBAAyB,CAAC,EAAE,cAAc,CAAC;IAC3C,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,cAAc,EAAE,0BAA0B,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,MAAM,CACjD,KAAK,EACL,qCAAqC,CACtC,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { LoggerPublisherService } from "@ledgerhq/device-management-kit";
|
|
1
2
|
import { Either } from "purify-ts";
|
|
2
3
|
import { type ContextModuleConfig } from "../../config/model/ContextModuleConfig";
|
|
3
4
|
import { GetTransactionDescriptorsParams, GetTransactionDescriptorsResponse, SolanaLifiDataSource } from "./SolanaLifiDataSource";
|
|
4
5
|
export declare class HttpSolanaLifiDataSource implements SolanaLifiDataSource {
|
|
5
6
|
private readonly config;
|
|
6
|
-
|
|
7
|
+
private logger;
|
|
8
|
+
constructor(config: ContextModuleConfig, loggerFactory: (tag: string) => LoggerPublisherService);
|
|
7
9
|
getTransactionDescriptorsPayload({ templateId, }: GetTransactionDescriptorsParams): Promise<Either<Error, GetTransactionDescriptorsResponse>>;
|
|
8
10
|
}
|
|
9
11
|
//# sourceMappingURL=HttpSolanaLifiDataSource.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpSolanaLifiDataSource.d.ts","sourceRoot":"","sources":["../../../../../src/solanaLifi/data/HttpSolanaLifiDataSource.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HttpSolanaLifiDataSource.d.ts","sourceRoot":"","sources":["../../../../../src/solanaLifi/data/HttpSolanaLifiDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAGzE,OAAO,EAAE,MAAM,EAAe,MAAM,WAAW,CAAC;AAGhD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAI9E,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,EACjC,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAEhC,qBACa,wBAAyB,YAAW,oBAAoB;IAIrC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHrD,OAAO,CAAC,MAAM,CAAyB;gBAGQ,MAAM,EAAE,mBAAmB,EAExE,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB;IAK3C,gCAAgC,CAAC,EAC5C,UAAU,GACX,EAAE,+BAA+B,GAAG,OAAO,CAC1C,MAAM,CAAC,KAAK,EAAE,iCAAiC,CAAC,CACjD;CAgFF"}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { type Either } from "purify-ts";
|
|
2
|
-
import {
|
|
2
|
+
import type { GetTransactionDescriptorsResponse } from "../../shared/model/SolanaContextTypes";
|
|
3
3
|
export type GetTransactionDescriptorsParams = {
|
|
4
4
|
templateId: string;
|
|
5
5
|
};
|
|
6
|
-
export type GetTransactionDescriptorsResponse
|
|
7
|
-
[key: string]: unknown;
|
|
8
|
-
descriptors: SolanaTransactionDescriptorList;
|
|
9
|
-
};
|
|
6
|
+
export type { GetTransactionDescriptorsResponse };
|
|
10
7
|
export interface SolanaLifiDataSource {
|
|
11
8
|
getTransactionDescriptorsPayload(params: GetTransactionDescriptorsParams): Promise<Either<Error, GetTransactionDescriptorsResponse>>;
|
|
12
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolanaLifiDataSource.d.ts","sourceRoot":"","sources":["../../../../../src/solanaLifi/data/SolanaLifiDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"SolanaLifiDataSource.d.ts","sourceRoot":"","sources":["../../../../../src/solanaLifi/data/SolanaLifiDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AAE3F,MAAM,MAAM,+BAA+B,GAAG;IAC5C,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,YAAY,EAAE,iCAAiC,EAAE,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,gCAAgC,CAC9B,MAAM,EAAE,+BAA+B,GACtC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,iCAAiC,CAAC,CAAC,CAAC;CAC9D"}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import { LoggerPublisherService } from "@ledgerhq/device-management-kit";
|
|
2
|
+
import { type ContextModuleConfig } from "../../config/model/ContextModuleConfig";
|
|
3
|
+
import { type PkiCertificateLoader } from "../../pki/domain/PkiCertificateLoader";
|
|
2
4
|
import { ContextFieldLoader } from "../../shared/domain/ContextFieldLoader";
|
|
3
5
|
import { SolanaContextTypes, SolanaLifiContextResult } from "../../shared/model/SolanaContextTypes";
|
|
4
6
|
import { SolanaTransactionContext } from "../../solana/domain/solanaContextTypes";
|
|
5
7
|
import { type SolanaLifiDataSource } from "../../solanaLifi/data/SolanaLifiDataSource";
|
|
6
|
-
|
|
7
|
-
templateId: string;
|
|
8
|
-
};
|
|
9
|
-
export declare class SolanaLifiContextLoader implements ContextFieldLoader<SolanaLifiFieldInput, SolanaContextTypes, SolanaLifiContextResult> {
|
|
8
|
+
export declare class SolanaLifiContextLoader implements ContextFieldLoader<SolanaTransactionContext, SolanaContextTypes, SolanaLifiContextResult> {
|
|
10
9
|
private readonly dataSource;
|
|
10
|
+
private readonly config;
|
|
11
|
+
private readonly _certificateLoader;
|
|
11
12
|
private logger;
|
|
12
|
-
constructor(dataSource: SolanaLifiDataSource, loggerFactory: (tag: string) => LoggerPublisherService);
|
|
13
|
-
canHandle(field: unknown, expectedType: SolanaContextTypes): field is
|
|
14
|
-
loadField(
|
|
13
|
+
constructor(dataSource: SolanaLifiDataSource, config: ContextModuleConfig, _certificateLoader: PkiCertificateLoader, loggerFactory: (tag: string) => LoggerPublisherService);
|
|
14
|
+
canHandle(field: unknown, expectedType: SolanaContextTypes): field is SolanaTransactionContext;
|
|
15
|
+
loadField(solanaLifiContextInput: SolanaTransactionContext): Promise<SolanaLifiContextResult>;
|
|
16
|
+
private buildPayload;
|
|
15
17
|
private pluckTransactionData;
|
|
18
|
+
private extractInstructionsMeta;
|
|
16
19
|
}
|
|
17
|
-
export {};
|
|
18
20
|
//# sourceMappingURL=SolanaLifiContextLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolanaLifiContextLoader.d.ts","sourceRoot":"","sources":["../../../../../src/solanaLifi/domain/SolanaLifiContextLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAIzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"SolanaLifiContextLoader.d.ts","sourceRoot":"","sources":["../../../../../src/solanaLifi/domain/SolanaLifiContextLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAIzE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAI9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EAIxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,wCAAwC,CAAC;AAGhD,qBACa,uBACX,YACE,kBAAkB,CAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,CACxB;IAMD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IARrC,OAAO,CAAC,MAAM,CAAyB;gBAIpB,UAAU,EAAE,oBAAoB,EAEhC,MAAM,EAAE,mBAAmB,EAE3B,kBAAkB,EAAE,oBAAoB,EAEzD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB;IAKjD,SAAS,CACd,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,kBAAkB,GAC/B,KAAK,IAAI,wBAAwB;IAuBvB,SAAS,CACpB,sBAAsB,EAAE,wBAAwB,GAC/C,OAAO,CAAC,uBAAuB,CAAC;IA2DnC,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,uBAAuB;CAiChC"}
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LoggerPublisherService } from "@ledgerhq/device-management-kit";
|
|
2
2
|
import { type ContextModuleConfig } from "../../config/model/ContextModuleConfig";
|
|
3
3
|
import { type PkiCertificateLoader } from "../../pki/domain/PkiCertificateLoader";
|
|
4
4
|
import { ContextFieldLoader } from "../../shared/domain/ContextFieldLoader";
|
|
5
5
|
import { SolanaContextTypes, SolanaTokenContextResult } from "../../shared/model/SolanaContextTypes";
|
|
6
6
|
import { SolanaTransactionContext } from "../../solana/domain/solanaContextTypes";
|
|
7
7
|
import { type SolanaTokenDataSource } from "../../solanaToken/data/SolanaTokenDataSource";
|
|
8
|
-
|
|
9
|
-
deviceModelId: DeviceModelId;
|
|
10
|
-
tokenInternalId: string;
|
|
11
|
-
};
|
|
12
|
-
export declare class SolanaTokenContextLoader implements ContextFieldLoader<SolanaTokenFieldInput, SolanaContextTypes, SolanaTokenContextResult> {
|
|
8
|
+
export declare class SolanaTokenContextLoader implements ContextFieldLoader<SolanaTransactionContext, SolanaContextTypes, SolanaTokenContextResult> {
|
|
13
9
|
private readonly dataSource;
|
|
14
10
|
private readonly config;
|
|
15
11
|
private readonly _certificateLoader;
|
|
16
12
|
private logger;
|
|
17
13
|
constructor(dataSource: SolanaTokenDataSource, config: ContextModuleConfig, _certificateLoader: PkiCertificateLoader, loggerFactory: (tag: string) => LoggerPublisherService);
|
|
18
|
-
canHandle(field: unknown, expectedType: SolanaContextTypes): field is
|
|
19
|
-
loadField(solanaTokenContextInput:
|
|
14
|
+
canHandle(field: unknown, expectedType: SolanaContextTypes): field is SolanaTransactionContext;
|
|
15
|
+
loadField(solanaTokenContextInput: SolanaTransactionContext): Promise<SolanaTokenContextResult>;
|
|
20
16
|
private pluckTokenData;
|
|
21
17
|
}
|
|
22
|
-
export {};
|
|
23
18
|
//# sourceMappingURL=SolanaTokenContextLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolanaTokenContextLoader.d.ts","sourceRoot":"","sources":["../../../../../src/solanaToken/domain/SolanaTokenContextLoader.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"SolanaTokenContextLoader.d.ts","sourceRoot":"","sources":["../../../../../src/solanaToken/domain/SolanaTokenContextLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAIzE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EAEzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,0CAA0C,CAAC;AAGlD,qBACa,wBACX,YACE,kBAAkB,CAChB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,CACzB;IAMD,OAAO,CAAC,QAAQ,CAAC,UAAU;IACC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAPrC,OAAO,CAAC,MAAM,CAAyB;gBAIpB,UAAU,EAAE,qBAAqB,EACL,MAAM,EAAE,mBAAmB,EAEvD,kBAAkB,EAAE,oBAAoB,EAEzD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB;IAKjD,SAAS,CACd,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,kBAAkB,GAC/B,KAAK,IAAI,wBAAwB;IAmBvB,SAAS,CACpB,uBAAuB,EAAE,wBAAwB,GAChD,OAAO,CAAC,wBAAwB,CAAC;IAsDpC,OAAO,CAAC,cAAc;CASvB"}
|